def main(){ n:=21; r:=shor(n); assert(11{ return x; } while true{ a:=2+uniform(n sub 2); d:=gcdn(a,n); if d≠1{ return d; } r:=order(a,n); if r%2=0 && a^(r div 2)%n≠n-1{ return gcdn(a^(r div 2)+1,n); } } } def asPower(n:!ℕ){ y:=2; while 3^y≤n{ (l,r):=(0,1); while r^y≤n{ r*=2; } while l+1≠r{ m:=(l+r) div 2; if m^y≤n { l=m; } else { r=m; } } if l^y=n{ return (l,y); } y+=1; } return (n,1); } def uniform(n:!ℕ){ (k,l):=(0,1); while l≤n { k+=1, l*=2; } while true { x:=0:uint[k]; for i in 0..k{ x[i]:=H(x[i]); } x:=measure(x) as !ℕ; if x1 then add((r[0],1),inv(from_cfrac(r[1..r.length]))) else (r[0],1); def QFT[n:!ℕ](ψ: uint[n])mfree: uint[n]{ for k in [0..n div 2){ (ψ[k],ψ[n-k-1]) := (ψ[n-k-1],ψ[k]); } for k in [0..n){ ψ[k] := H(ψ[k]); for l in [k+1..n){ if ψ[l] && ψ[k]{ phase(2·π · 2^(k-l-1)); } } } return ψ; } // compute a^b%N def powm[n:!ℕ,m:!ℕ](a:uint[n],b:uint[m],N:!ℕ)lifted: uint[n]{ (r,x):=(1:uint[n], a); for i in 0..m{ if b[i]{ r=r·x%N; } x=x·x%N; } return r; }