Bill Allombert on Tue, 14 May 2019 21:00:02 +0200


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: Conversion (MATHEMATICA to PARI/GP)


On Tue, May 14, 2019 at 06:27:59PM +0000, Predrag Terzic wrote:
> Can anyone help me to convert this Mathematica code (see attachment) to PARI/GP code?
> 
> Mathematica code :
> 
> polmul[f_, g_, r_, n_] := Mod[f.NestList[RotateRight, g, r - 1], n]
> 
> matmul[a_, b_, r_, n_] :=
>  Mod[{{polmul[a[[1, 1]], b[[1, 1]], r, n] +
>      polmul[a[[1, 2]], b[[2, 1]], r, n],
>     polmul[a[[1, 1]], b[[1, 2]], r, n] +
>      polmul[a[[1, 2]], b[[2, 2]], r, n]}, {polmul[a[[2, 1]],
>       b[[1, 1]], r, n] + polmul[a[[2, 2]], b[[2, 1]], r, n],
>     polmul[a[[2, 1]], b[[1, 2]], r, n] +
>      polmul[a[[2, 2]], b[[2, 2]], r, n]}}, n]
> 
> matsq[a_, r_, n_] := matmul[a, a, r, n]
> 
> matpow[a_, k_, r_, n_] :=
>  If[k == 1, a,
>   If[EvenQ[k], matpow[matsq[a, r, n], k/2, r, n],
>    matmul[a, matpow[matsq[a, r, n], (k - 1)/2, r, n], r, n]]]
> 
> xmat[r_, n_] := {{PadRight[{0, 2}, r],
>    PadRight[{n - 1}, r]}, {PadRight[{1}, r], ConstantArray[0, r]}}
> 
> smallestr[n_] := Module[{r}, If[n == 1 \[Or] EvenQ[n], Return[0]];
>   For[r = 3, MemberQ[{0, 1, r - 1}, Mod[n, r]], r = NextPrime[r + 1],
>    If[r < n \[And] Mod[n, r] == 0, Return[0]]];
>   r]
> 
> isprime[n_] :=
>  With[{r = smallestr[n]},
>   If[r == 0, n == 2,
>    With[{xp = matpow[xmat[r, n], n - 1, r, n]},
>     Mod[RotateRight[xp[[1, 1]]] + xp[[1, 2]], n] ===
>      PadRight[Append[ConstantArray[0, Mod[n, r]], 1], r]]]]

Could you explain what the functions do ?

Cheers,
Bill.