hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 510|回复: 5

Baillie_PSW素性判定的mathematica代码(有详细解释)

[复制链接]

948

主题

1162

帖子

3655

积分

超级版主

Rank: 8Rank: 8

积分
3655

论坛头条论坛元老谋士数据帝优秀版主超级版主见习版主论坛版主

发表于 2023-9-25 12:26:40 | 显示全部楼层 |阅读模式
  1. Clear["Global`*"];(*Clear all variables*)Lucas[n0_]:=Module[    (*指定局部变量*)    {n=n0,m,s,P,Q,d,JS,mi2,UU,VV,UUtemp,VVtemp,kk},    If[Mod[n,2]==0&&n>2,Return[False]];(*排除偶数*)    If[IntegerQ[Sqrt[n]],Return[False]];(*如果是完全平方数,返回False*)    (*写成n+1=2^s*m的形式*)    m=n+1;    (*s=0;While[Mod[m,2]==0,m=m/2;s=s+1];*)    (*根据P=3 4 5 6 7 Q=1,以及雅克比符号等于-1来找到P,如果d与n有约数,则返回false,且d不应该是n的倍数*)    (*此处如果n很小,而d较大且是n的倍数,这时可能存在n是质数,而雅克比符号等于零的情况,这种情况需要特殊处理一下*)    P=3;Q=1;d=P^2-4*Q;JS=JacobiSymbol[d,n];If[JS==0,Return[False]];    While[JS==1,P=P+1;d=P^2-4*Q;JS=JacobiSymbol[d,n];If[JS==0,Return[False]]];    mi2=IntegerDigits[m,2];(*把m写成二进制的方式*)    UU=1;VV=P;(*分别是lucas序列的U(1)与V(1)的值*)    Do[        UU=Mod[UU*VV,n];        VV=Mod[VV^2-2,n];(*此处Q=1*)        If[mi2[[kk]]==1,            UUtemp=(P*UU+VV);            VVtemp=(d*UU+P*VV);            (*UUtemp,VVtemp都可能是奇数,如果是奇数,则加上一个n,这样就是偶数了,            下面才能除以2得到整数,至于为什么要这么做,我也不是太清楚为什么,            可能是由于n是奇数,模的时候,减去偶数个n奇偶性不变,而减去奇数个n奇偶性变了.            20220824补充:除以2,其实是乘以2模n的逆,而2模n的逆=(n+1)/2,这里n肯定是奇数            当UUtemp=2k(偶数的时候),2k*(n+1)/2=k*(n+1)=k(mod n),相当于直接除以2,            当UUtemp=2k+1(奇数的时候),(2k+1)*(n+1)/2=2k*(n+1)/2+(n+1)/2=k+(n+1)/2=(2k+1+n)/2(mod n),相当于加上n后再除以2,            VVtemp同理            *)            If[OddQ[UUtemp],UUtemp=UUtemp+n];            If[OddQ[VVtemp],VVtemp=VVtemp+n];            UU=Mod[UUtemp/2,n];            VV=Mod[VVtemp/2,n]        ],        {kk,2,Length@mi2}];(*此处必须从2开始,程序没有错误!*)    If[UU==0&&Mod[VV,n]==2,Return[True],Return[False]]](*miller rabin测试,n0是被测试的整数,a0是选择的基*)MillerRabin[n0_,a0_]:=Module[{n=n0,a=a0,s,m,t1,k},    s=0;m=n-1;While[Mod[m,2]==0,m=m/2;s=s+1];    t1=PowerMod[a,m,n];    If[t1==1,Return[True]];    k=0;While[k<s-1&&t1!=n-1,k=k+1;t1=Mod[t1^2,n]];    If[t1==n-1,Return[True],Return[False]]]
复制代码
世界上最遥远的距离,不是生与死的距离,而是我站在你面前,你却不知道我爱你
回复

使用道具 举报

1

主题

207

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2023-9-25 12:27:11 | 显示全部楼层
  1.             (*UUtemp,VVtemp都可能是奇数,如果是奇数,则加上一个n,这样就是偶数了,            下面才能除以2得到整数,至于为什么要这么做,我也不是太清楚为什么,            可能是由于n是奇数,模的时候,减去偶数个n奇偶性不变,而减去奇数个n奇偶性变了.            20220824补充:除以2,其实是乘以2模n的逆,而2模n的逆=(n+1)/2,这里n肯定是奇数            当UUtemp=2k(偶数的时候),2k*(n+1)/2=k*(n+1)=k(mod n),相当于直接除以2,            当UUtemp=2k+1(奇数的时候),(2k+1)*(n+1)/2=2k*(n+1)/2+(n+1)/2=k+(n+1)/2=(2k+1+n)/2(mod n),相当于加上n后再除以2,            VVtemp同理            *)
复制代码

感谢@无心人 让我彻底搞明白了我曾经搞不明白的!
回复

使用道具 举报

0

主题

200

帖子

41

积分

新手上路

Rank: 1

积分
41
发表于 2023-9-25 12:27:45 | 显示全部楼层
今年彻底整明白lucas算法,很开心!
回复

使用道具 举报

0

主题

192

帖子

163

积分

关内侯

Rank: 2

积分
163
发表于 2023-9-25 12:28:06 | 显示全部楼层
  1. ExtraLucas[n0_]:=Module[    (*指定局部变量*)    {n=n0,m,s,P,Q,d,JS,mi2,UU,VV,UUtemp,VVtemp,kk,k},    If[Mod[n,2]==0&&n>2,Return[False]];(*排除偶数*)    If[IntegerQ[Sqrt[n]],Return[False]];(*如果是完全平方数,返回False*)    (*写成n+1=2^s*m的形式,其中m是奇数*)    m=n+1;    s=0;While[Mod[m,2]==0,m=m/2;s=s+1];    (*根据P=3 4 5 6 7 Q=1,以及雅克比符号等于-1来找到P,如果d与n有约数,则返回false,且d不应该是n的倍数*)    (*此处如果n很小,而d较大且是n的倍数,这时可能存在n是质数,而雅克比符号等于零的情况,这种情况需要特殊处理一下*)    P=3;Q=1;d=P^2-4*Q;JS=JacobiSymbol[d,n];If[JS==0,Return[False]];    While[JS==1,P=P+1;d=P^2-4*Q;JS=JacobiSymbol[d,n];If[JS==0,Return[False]]];    mi2=IntegerDigits[m,2];(*把m写成二进制的方式*)    UU=1;VV=P;(*分别是lucas序列的U(1)与V(1)的值*)    Do[        UU=Mod[UU*VV,n];        VV=Mod[VV^2-2,n];(*此处Q=1*)        If[mi2[[kk]]==1,            UUtemp=(P*UU+VV);            VVtemp=(d*UU+P*VV);            (*UUtemp,VVtemp都可能是奇数,如果是奇数,则加上一个n,这样就是偶数了,            下面才能除以2得到整数,至于为什么要这么做,我也不是太清楚为什么,            可能是由于n是奇数,模的时候,减去偶数个n奇偶性不变,而减去奇数个n奇偶性变了.            20220824补充:除以2,其实是乘以2模n的逆,而2模n的逆=(n+1)/2,这里n肯定是奇数            当UUtemp=2k(偶数的时候),2k*(n+1)/2=k*(n+1)=k(mod n),相当于直接除以2,            当UUtemp=2k+1(奇数的时候),(2k+1)*(n+1)/2=2k*(n+1)/2+(n+1)/2=k+(n+1)/2=(2k+1+n)/2(mod n),相当于加上n后再除以2,            VVtemp同理            *)            If[OddQ[UUtemp],UUtemp=UUtemp+n];            If[OddQ[VVtemp],VVtemp=VVtemp+n];            UU=Mod[UUtemp/2,n];            VV=Mod[VVtemp/2,n]        ],        {kk,2,Length@mi2}];(*此处必须从2开始,程序没有错误!*)    (*UU[m]=0的同时VV[m]必须是正负2,才返回True*)    If[And[UU==0,Or[Mod[VV-2,n]==0,Mod[VV+2,n]==0]],Return[True]];    k=0;While[k<s-1&&VV!=0,k=k+1;VV=Mod[VV^2-2,n]];(*计算VV[m*2^k]的值*)    If[VV==0,Return[True],Return[False]](*判定VV[m*2^k]的值是否等于零*)]
复制代码
回复

使用道具 举报

0

主题

185

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2023-9-25 12:28:28 | 显示全部楼层
论文链接
https://www.ams.org/journals/mco ... 5718-00-01197-2.pdf

郭先强,你用的是
  1.     k=0;While[k<s-1&&VV!=0,k=k+1;VV=Mod[VV^2-2,n]];(*计算VV[m*2^k]的值*)
复制代码
(此处运行后k有可能达到s-1)
还是
  1.     k=0;While[k<s-2&&VV!=0,k=k+1;VV=Mod[VV^2-2,n]];(*计算VV[m*2^k]的值*)
复制代码

你用的是哪个?
@gxqcn
回复

使用道具 举报

0

主题

185

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-9-25 12:28:47 | 显示全部楼层
  1. (*全部是Strong Lucas pseudoprimes*)aaa={5459,5777,10877,16109,18971,22499,24569,25199,40309,58519,75077,97439,100127,113573,115639,130139,155819,158399,161027,162133,176399,176471,189419,192509,197801,224369,230691,231703,243629,253259,268349,288919,313499,324899};bbb=Lucas[#]&/@aaaccc=ExtraLucas[#]&/@aaa(*全部是Lucas pseudoprimes*)aaa={323,377,1159,1829,3827,5459,5777,9071,9179,10877,11419,11663,13919,14839,16109,16211,18407,18971,19043,22499,23407,24569,25199,25877,26069,27323,32759,34943,35207,39059,39203,39689,40309,44099,46979,47879}ccc=ExtraLucas[#]&/@aaaTally[ccc](*全部是Extra strong Lucas pseudoprimes*)aaa={989,3239,5777,10877,27971,29681,30739,31631,39059,72389,73919,75077,100127,113573,125249,137549,137801,153931,155819,161027,162133,189419,218321,231703,249331,370229,429479,430127,459191,473891,480689,600059,621781,632249,635627}ccc=ExtraLucas[#]&/@aaaTally[ccc]
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-11-21 22:51 , Processed in 0.067877 second(s), 22 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

快速回复 返回顶部 返回列表