static L cyclicLocalMinima(float[] l) { int n = l(l); new L minima; if (allSame(l)) ret minima; int i = 0; while (i < n && l[mod(i+1, n)] >= l[i]) ++i; // found the first downslope at start -> start+1 int start = i, flatSince = i; do { i = mod(i+1, n); float diff = l[mod(i+1, n)]-l[i]; if (diff < 0) flatSince = i; else if (diff > 0) { if (flatSince >= 0) { int middle = mod(flatSince+mod(i-flatSince, n)/2, n); minima.add(middle); flatSince = -1; } } } while (i != start); ret minima; }