hermann on Sat, 25 Nov 2023 23:39:24 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: Kunerth's algorithm (determine modular square root of a number) |
On 2023-11-25 02:41, hermann@stamm-wilbrandt.de wrote:
Tomorrow I will investigate why the 4 examples from Kunerth's 1878 paperdo not work for now, and try to fix Kunert.gp and then post here. These are the current failures: *** sqrt: not a prime number in Fl_sqrt [modulus]: 1124. *** sqrt: not a prime number in sqrt [modulus]: 16315. *** at top-level: assert(issquare(w,&W)) *** Mod: impossible inverse in Fl_inv: Mod(0, 239). Kunerth's algorithm is not a general purpose modular sqrt algorithm. Will be interesting to see what scenarios can be processed.
Now in 4th revision you can find Kunerth.gp gist here for playing with: https://gist.github.com/Hermann-SW/76e7cf8545c5e8b0332faeaad878e08f It only works if constant term of quadratic form is a square.The Kunerth paper examples show how to deal with non-square constant term.
But that is complex and not part of Kunerth.gp yet. For computing sqrt(c) (mod b) the algorithm works with b (mod c). If c is not a prime, PARI/GP issquare() is used instead of sqrt(). That can be slow for big c. Sometimes a non-t_INT constant term of quadratic form e results. In that case Kunerth.gp tries to work with -b (mod c). Here is new example calculation:f=-1 is forced for getting a t_INT constant term of e, by subtracting b in simplify() instead of adding.
Modified f value influences computation of xx: $ m="Mod(60,5*17)" gp -q < Kunerth.gp V=25 e=60*z^2 + 50*z + 9 f=-1 W=3 alpha=3 beta=-8 xx=[x + 4, 1; 9*x + 1, 1] X=-4 Y=Mod(65, 85) Y^2=Mod(60, 85) X=-1/9 Y=Mod(20, 85) Y^2=Mod(60, 85) all asserts OK b=m.mod; c=lift(m); V=r=lift("sqrt"(Mod(-b,c))); e=simplify(((c*z+r)^2±b)/c); f=±1; W=sqrt(polcoeff(e,0)); beta=-(V\W); alpha=W*(V+W*beta); xx=factor(alpha^2*x^2+(2*alpha*beta-f*b)*x+(beta^2-c));i∈{1,2}: X=-polcoeff(xx[i,1],0])/polcoeff(xx[i,1],1); Y=Mod(alpha*X+beta,b);
$ Constant term of e was square 9, 5*17-60=25 was square as well.After "all asserts OK" output now detailed steps of Kunerth.gp are explained. If you don't want that output, append " 2>/dev/null" to remove that stderr output.
Here is another square difference resulting in square constant of e and results:
$ m="Mod(13*17-7^2,13*17)" gp -q < Kunerth.gp 2>/dev/null V=93 e=172*z^2 + 186*z + 49 f=-1 W=7 alpha=14 beta=-13 xx=[4*x - 3, 1; 49*x + 1, 1] X=3/4 Y=Mod(108, 221) Y^2=Mod(172, 221) X=-1/49 Y=Mod(113, 221) Y^2=Mod(172, 221) all asserts OK $ Regards, Hermann.