 
 
 
 
 
 
SqrtMod function
- To: mathgroup at smc.vnet.net
- Subject: [mg30698] SqrtMod function
- From: Ranko Bojanic <bojanic at math.ohio-state.edu>
- Date: Sat, 8 Sep 2001 02:23:01 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
On Monday, 3 Sep 2001 20:32:50, in [mg30672] "Diophantine equation 
y^2=x^3-2*x+1" Ranko Bojanic wrote:
>   In the NumberTheory package, in NumberTheoryFunctions, there
>   is a fast function SqrtMod which reduces significantly the 
>   speed of the algorithm:
>   <<NumberTheory`NumberTheoryFunctions`
>   sol[p_] := Module[{aList, testList, positions, goodList, res},
>          aList = Range[0, p - 1]^3 - 2 Range[0, p - 1] + 1;
>    positions = Position[JacobiSymbol[aList, p], -1];
>    testList = Delete[aList, positions];
>    goodList = Delete[Range[0, p - 1], positions];
>    res = Map[SqrtMod[#, p] &, testList];
>    res = Transpose[{res, Mod[-res, p]}];
>    Return[{goodList, res} // Transpose]]
When Mod[a,p]==0, the function SqrtMod[a,p] does not return zero,
as it should. For such a's the equation y^2=x^3-2*x+1
has trivial solution {a,0} in Zp. We have, for instance, 
sol[19]
{0, {1, 18}}, {1, {0, 0}}, {2, {9, 10}}, {4, {SqrtMod[57, 19], 
Mod[-SqrtMod[57, 19], 19]}}, {7, {11, 8}}, {9, {16, 3}}, 
{13, {5, 14}}, {14, {SqrtMod[2717, 19], Mod[-SqrtMod[2717, 19], 19]}}, 
{17, {4, 15}}}
This can be corrected easily by redefinig the function SqrtMod:
 
    <<NumberTheory`NumberTheoryFunctions`
    
    sol[p_] := Module[{y, aList, testList, positions, goodList, 
                        res, sqMod},
    sqMod = If[Mod[#, p] != 0, SqrtMod[#, p], 0] &;
    aList = Range[0, p - 1]^3 - 2 Range[0, p - 1] + 1;
    positions = Position[JacobiSymbol[aList, p], -1];
    testList = Delete[aList, positions];
    goodList = Delete[Range[0, p - 1], positions];
    res = Map[sqMod, testList];
    res = Transpose[{res, Mod[-res, p]}];
    Return[{goodList, res} // Transpose]]
We have now
sol[19]
{{0, {1, 18}}, {1, {0, 0}}, {2, {9, 10}}, {4, {0, 0}}, 
{7, {11, 8}}, {9, {16, 3}}, {13, {5, 14}}, {14, {0, 0}}, 
{17, {4, 15}}}
Ranko

