\\ describe a fraction: \\ - integer part \\ - transient part \\ - periodic part fracdigits(v, base=10) = { \\ integer part my (int=digits(floor(v), base)); \\ period length my (den=denominator(v), pr=factor(base)[,1]~, p=znorder(Mod(base, den / prod(i=1, #pr, pr[i]^valuation(den,pr[i]))))); \\ transient part my (tra=[], fra=frac(v)); while (fra != frac(fra*base^p), tra = concat(tra, floor(fra*base)); fra = frac(fra*base); ); \\ periodic part my (per = vector(p, x, my (d=floor(fra*base)); fra = frac(fra*base); d)); return ([int,tra,per]); } \\ rebuild a fraction fromfracdigits(f, base=10) = fromdigits(f[1],base) + ( fromdigits(f[2],base) + fromdigits(f[3],base)/base^#f[3] / (1-1/base^#f[3])) / base^#f[2]; \\ give run lengths (and values) runlengths(v) = { my (r=[], c=0); for (i=1, #v, c++; if (i==#v || v[i]!=v[i+1], r = concat(r, [[c, v[i]]]); c = 0 ); ); r } \\ rebuild vector from run lengths fromrunlengths(r) = { my (v=vector(if (#r==0, 0, vecsum(apply(cv -> cv[1], r)))), i=0); for (j=1, #r, for (k=1, r[j][1], v[i++] = r[j][2]; ); ); v } \\ increase odd lengths / decrease even lengths alter(v) = { r = runlengths(v); for (i=1, #r, if (r[i][1]%2, r[i][1]++, r[i][1]-- ); ); fromrunlengths(r); } a(n, base=2) = { my (f=fracdigits(1/n,base)); if (#f[2], while (f[2][#f[2]] == f[3][1], f[2] = concat(f[2], f[3][1]); f[3] = concat(f[3][2..#f[3]], f[3][1]); ); ); numerator(fromfracdigits(apply(alter, f), base)); } for (n=1, 10 000, print (n " " a(n))) quit