mathematica 发表于 2019-3-4 12:10:56

有谁能看懂这段梅森数的lucas-lehmer判别法的代码?

LucasLehmer :=
Module[{Mp, s, k}, Mp = 2^n - 1; s = 4;
Do, {k, 1, n - 2}];
If, Return]]

LucasLehmer2 :=
Module[{Mp, s, k}, Mp = 2^p - 1; s = 4;
Do;
   s = BitAnd + BitShiftRight;
   If, {k, 1, p - 2}];
If, Return]]

https://baike.baidu.com/item/%E5%8D%A2%E5%8D%A1%E6%96%AF-%E8%8E%B1%E9%BB%98%E6%A3%80%E9%AA%8C%E6%B3%95/3757240?fr=aladdin
卢卡斯-莱默检验法 ,用来判别梅森数是不是素数的算法

s = Mod
这行代码被替换成了下面的
s = s^2 - 2;
If;
s = BitAnd + BitShiftRight;
If
这代码替换了一下,速度快了
执行
Timing]
运行结果
{10.9825, True}
执行
Timing]
运行结果
{49.4367, True}
仅仅换了一下代码,运行效率有五倍之差!!!!!!!!!!
效率低的代码是我写的,效率高的代码是别人写的!
我最近研究mathematica软件与prime95的时候,对比发现判别梅森数方面,mathematica比prime95慢了很多!
我还怀疑prime95,真的是越来越发现自己很无知!
这段取模的置换的代码,是不是只对梅森数有效?



mathematica 发表于 2019-3-4 12:15:54

LucasLehmer := Module[{Mp, s, k}, Mp = 2^n - 1; s = 4;
Do; Print, {k, 1, n - 2}];
If, Return]]

LucasLehmer2 := Module[{Mp, s, k}, Mp = 2^p - 1; s = 4;
Do;
   s = BitAnd + BitShiftRight;
   If; Print, {k, 1, p - 2}];
If, Return]]
我当然也怀疑代码的正确性,就把代码的中间结果也打印出来,每个函数都增加了Print这句,
结果用LucasLehmer与LucasLehmer2比较中间结果,发现结果完全一样!

问题来了,是不是这种算法只有对梅森数有效果?这段代码的原理又是什么?
真把我打蒙了!

.·.·. 发表于 2019-3-4 13:47:08

本帖最后由 .·.·. 于 2019-3-4 14:16 编辑

mathematica 发表于 2019-3-4 12:15
我当然也怀疑代码的正确性,就把代码的中间结果也打印出来,每个函数都增加了这句,
结果用LucasLehmer[ ...

取模运算比位运算慢是很显然的事情
你写的是一般的取模运算
人家的代码把特定的取模运算(模Mp)简化成了位运算
所以人家的算法快
这是很正常的事情

原理差不多是
a=2^p*(a-(a mod 2^p))/2^p+(a mod 2^p)
两边mod2^p-1
a mod 2^p-1=(a-(a mod 2^p))/2^p+(a mod 2^p)
/2^p被bitshift替代,mod 2^p被bitand(#,2^p-1)&替代
页: [1]
查看完整版本: 有谁能看懂这段梅森数的lucas-lehmer判别法的代码?