nyy 发表于 2022-8-29 10:35:41

谁能找到通过下面lucas素性测试的Lucas伪素数?

Clear["Global`*"];(*Clear all variables*)
(*StrongLucas素数判定算法*)
StrongLucas:=Module[
    (*指定局部变量*)
    {n=n0,m,s,P,Q,d,JS,mi2,UU,VV,UUtemp,VVtemp,kk,k,QQ,VVV,QQQ,VV2Q},
    If==0&&n>2,Return];(*排除偶数*)
    If],Return];(*如果是完全平方数,返回False*)
    (*写成n+1=2^s*m的形式,其中m是奇数*)
    m=n+1;s=0;While==0,m=m/2;s=s+1];
    (*根据P=2,Q=-2,-3,-4,-5,以及雅克比符号等于-1来找到Q,如果d与n有约数,则返回false,且d不应该是n的倍数*)
    (*此处如果n很小,而d较大且是n的倍数,这时可能存在n是质数,而雅克比符号等于零的情况,这种情况需要特殊处理一下*)
    P=2;Q=-2;d=P^2-4*Q;JS=JacobiSymbol;If];
    While;If]];
    mi2=IntegerDigits;(*把m写成二进制的方式*)
    UU=1;VV=P;QQ=Q;(*分别是lucas序列的U(1)与V(1)与Q(1)的值*)
    Do[
      UU=Mod;
      VV=Mod;
      QQ=Mod;
      If]==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,UUtemp=UUtemp+n];
            If,VVtemp=VVtemp+n];
            UU=Mod;
            VV=Mod;
            QQ=Mod
      ],
      {kk,2,Length@mi2}];(*此处必须从2开始,程序没有错误!*)
    (*计算UU、VV、QQ的值,用来素数判定*)
    (*Print["第1处:"];*)
    (*Print[{n,m,s,P,Q,d,UU,VV,QQ}];调试的时候用*)
    k=0;
    While;QQ=Mod];(*计算VV的值*)
    VVV=VV;(*保存下来此处的VV,为将来判定VV是否等于零做准备*)
    While;QQ=Mod];(*计算QQ^((n+1)/2)的值,此处VV的值必须也计算,否则后面VV值计算错误*)
    QQQ=Mod*Q,n];(*判定Q^((n+1)/2)-JacobiSymbol*Q是否等于零,此处雅克比符号分子是Q!*)
    While;QQ=Mod];(*计算VV的值*)
    VV2Q=Mod;(*保存这个值*)
    If[(UU==0||VVV==0)&&(QQQ==0)&&(VV2Q==0),
      Return,
      Return]
]

nyy 发表于 2022-8-29 10:36:59

(*全部是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}
bbb=StrongLucas[#]&/@aaa
Tally(*统计判定结果*)


用lucas伪素数测试,全部给出false

nyy 发表于 2022-8-29 10:37:47

(*生成第2000个到第2200个素数*)
ccc=Prime@Range;
ddd=StrongLucas[#]&/@ccc(*对素数进行判定*)
Tally(*统计判定结果*)


用201个素数给出测试,结果证明很可能算法是正确的!
全部给出true

nyy 发表于 2022-8-29 10:38:39

(*全部是以2位底的强伪素数*)
aaa={2047,3277,4033,4681,8321,15841,29341,42799,49141,52633,65281,74665,80581,85489,88357,90751,104653,130561,196093,220729,233017,252601,253241,256999,271951,280601,314821,357761,390937,458989,476971,486737}
bbb=StrongLucas[#]&/@aaa(*对素数进行判定*)
Tally(*统计判定结果*)


用以2位底的强伪素数
结果全部false

nyy 发表于 2022-8-29 10:39:18

(*全部是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=StrongLucas[#]&/@aaa
Tally


用Strong Lucas pseudoprimes结果全部给出false

nyy 发表于 2022-8-29 10:39:51

(*全部是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=StrongLucas[#]&/@aaa
Tally

用Extra strong Lucas pseudoprimes
结果全部给出false

nyy 发表于 2022-8-29 10:49:50

@无心人 来找个试试看!

nyy 发表于 2022-8-29 15:10:32

本帖最后由 nyy 于 2022-8-29 15:11 编辑

这些Lucas强伪素数有什么规律?
https://bbs.emath.ac.cn/forum.php?mod=viewthread&tid=15708&fromuid=14149
(出处: 数学研发论坛)
http://ntheory.org/data/slpsps.txt
这儿有178118个lucas强伪素数,居然没有一个通过测试!

代码如下
(*读取强伪素数,一行一个,所以需要Flatten一下,第一行数据仅仅只是为了测试import函数*)
data=Flatten@Import["C:/Users/Administrator/Desktop/0008/123.txt","Data"]
data=Flatten@Import["C:/Users/Administrator/Desktop/0008/slpsps.txt","Data"];
aaa=Select(*选择通过测试的强伪素数*)

nyy 发表于 2022-8-29 15:26:11

本帖最后由 nyy 于 2022-8-29 15:36 编辑

http://ntheory.org/data/slpsps-baillie.txt

这儿的474971个lucas强伪素数,同样全部被干掉了!

(*读取强伪素数,一行一个,所以需要Flatten一下*)
data=Flatten@Import["C:/Users/Administrator/Desktop/0008/123.txt","Data"]
data=Flatten@Import["C:/Users/Administrator/Desktop/0008/slpsps.txt","Data"];
data=Flatten@Import["C:/Users/Administrator/Desktop/0008/slpsps-baillie.txt","Data"];
aaa=Select&](*选择通过测试的强伪素数*)
aaa=Select],StrongLucas[#]&](*选择通过测试的强伪素数*)

nyy 发表于 2022-8-29 16:01:50

http://ntheory.org/data/spsps.txt
这儿是以2为底的强伪素数。
总共有419489个,其中我还添加了两个素数在里面,就为了测试我写的算法能否把素数捡出来,
测试结果告诉我:所有的强伪素数都被干掉了,唯独留下了两个素数!

data=Flatten@Import["C:/Users/Administrator/Desktop/0008/spsps.txt","Data"];
aaa=Select&](*选择通过测试的强伪素数*)
页: [1]
查看完整版本: 谁能找到通过下面lucas素性测试的Lucas伪素数?