Here $b_1, b_2>0$ are integers. I investigated the sequence $Y_k=X_{3k}$, which has far more communal planes, and thus more useful to build a random generator. Of course, choosing large values for $b_1,b_2$ will further drastically improve the generator by adding a lot more planes. I suggest choosing values larger than (say) $2^{30}$ for $b_1,b_2$. There are $M=b_2^3+3b_1b_2+b_1^3$ communal planes and they all have an equation of the form $$b_1^3\cdot Y_k+b_2(b_2^2+3b_1) \cdot Y_{k+1}-Y_{k+2} =d.$$ The possible values for $d$ are $0,1,\cdots,M-1.$ Each plane (identified by $d$) contains a different proportion of triplets $(Y_k,Y_{k+1},Y_{k+2})$. The empirical distribution for these proportions is featured in the histogram below (corresponding to $b_1=5,b_2=3$), where the X-axis represents $d$, and the Y-axis the proportion of triplets lying in plan $d$. [![enter image description here][1]][1] Of course it is easy by looking at this chart to guess what the exact theoretical distribution is. To identify these planes, I used the program below and some experimental math. # Compute equations of planes containing 3 random vectors # P(k) = (x[k], x[k+1], x[k+2]) # P(l) = (x[l], x[l+1], x[l+2]) # P(m) = (x[m], x[m+1], x[m+2]) # (k, l, m) are randomly selected (M triplets) # # Equation of planes is x + s*y + t*z = intercept # For each (k,l,m) output the coefficients s, t, intercept # # Goal: Find communal planes absorbing many (P(k), P(l), P(m)) # Once the planes are computed, sort them by s, t, intercept $n=100000; $b1=5; $b2=3; # xx[] is the original sequence $xx[0]=0.5; $xx[1]=sqrt(2)/2; for ($k=2; $k<$n; $k++) { $xx[$k]=$b2*$xx[$k-1]+$b1*$xx[$k-2]-int($b2*$xx[$k-1]+$b1*$xx[$k-2]); if ($xx[$k]<0) { $xx[$k]=1+$xx[$k]; } } # we actually use 1 out of 3 consecutive terms from original sequence xx[] # to see if it the new sequence x[] also has a small number of communal planes for ($k=0; $k< $n/3; $k++) { $x[$k]=$xx[3*$k]; } $M=10000; # must be < n/3 open(OUT,">coplanes2.txt"); for ($iter=0; $iter<$M; $iter++) { $k=int($M*rand()); $l=int($M*rand()); $m=int($M*rand()); # in case k=l or k=m or l=m, an ERROR message is reported $a=$x[$k]; $b=$x[$k+1]; $c=$x[$k+2]; $d=$x[$l]; $e=$x[$l+1]; $f=$x[$l+2]; $p=$x[$m]; $q=$x[$m+1]; $r=$x[$m+2]; $u=($e-$b)*($r-$c)-($f-$c)*($q-$b); $v=-($d-$a)*($r-$c)+($f-$c)*($p-$a); $w=($d-$a)*($q-$b)-($e-$b)*($p-$a); if ($u != 0) { $s=$v/$u; $t=$w/$u; $intercept=($u*$a + $v*$b + $w*$c)/$u; print OUT "$k\t$l\t$m\t"; print OUT "$s\t$t\t$intercept\n"; } else { print OUT "$k\t$l\t$m\tERROR (u=0)\n"; } } close(OUT); [1]: https://i.sstatic.net/zTMbd.png [2]: https://i.sstatic.net/h46bI.png