跟第一版比较,重写了math:pow/2方法,这个方法可以支持很大的幂运算。
-module(mersenne).
-export([run/1,mersenne/1,lucasLehmer_sequence/2,pow/2]).
-spec pow(integer(), non_neg_integer()) -> integer()
; (float(), non_neg_integer()) -> float().
pow(X, N) when is_integer(N), N >= 0 -> pow(X, N, 1).
pow(_, 0, P) -> P;
pow(X, N, A) -> pow(X, N-1, A*X).
lucasLehmer_sequence (0, M) -> 4 rem M;
lucasLehmer_sequence (N, M) when N>0 ->
erlang:round((pow(lucasLehmer_sequence(N-1,M),2)-2)) rem M.
mersenne(N) when N>0 ->
erlang:round(pow(2,N))-1.
lucasLehmer_test(N) ->
lucasLehmer_sequence(N - 2, mersenne(N)) =:=0.
run(2) ->
case lucasLehmer_test(2) of
true ->
io:format("M(~w) => ~w~n", [2,mersenne(2)]);
false ->
false
end;
run(N) ->
case lucasLehmer_test(N) of
true ->
io:format("M(~w) => ~w~n", [N,mersenne(N)]);
false ->
false
end,
run(N-1).
计算梅森数可以算好多,只是效率还有待提高,因为算到M(2281)还是花了一点时间的,不知道Haskell和C#算到M(2281)花了多少时间,ps:这个Erlang版本还是单进程,只用到CPU的一个核。
结果如下:
3> mersenne:run(3000).
M(2281) => 446087557183758429571151706402101809886208632412859901111991219963404685792820473369112545269003989026153245931124316702395758705693679364790903497461147071065254193353938124978226307947312410798874869040070279328428810311754844108094878252494866760969586998128982645877596028979171536962503068429617331702184750324583009171832104916050157628886606372145501702225925125224076829605427173573964812995250569412480720738476855293681666712844831190877620606786663862190240118570736831901886479225810414714078935386562497968178729127629594924411960961386713946279899275006954917139758796061223803393537381034666494402951052059047968693255388647930440925104186817009640171764133172418132836351
M(2203) => 1475979915214180235084898622737381736312066145333169775147771216478570297878078949377407337049389289382748507531496480477281264838760259191814463365330269540496961201113430156902396093989090226259326935025281409614983499388222831448598601834318536230923772641390209490231836446899608210795482963763094236630945410832793769905399982457186322944729636418890623372171723742105636440368218459649632948538696905872650486914434637457507280441823676813517852099348660847172579408422316678097670224011990280170474894487426924742108823536808485072502240519452587542875349976558572670229633962575212637477897785501552646522609988869914013540483809865681250419497686697771007
M(1279) => 10407932194664399081925240327364085538615262247266704805319112350403608059673360298012239441732324184842421613954281007791383566248323464908139906605677320762924129509389220345773183349661583550472959420547689811211693677147548478866962501384438260291732348885311160828538416585028255604666224831890918801847068222203140521026698435488732958028878050869736186900714720710555703168729087
M(607) => 531137992816767098689588206552468627329593117727031923199444138200403559860852242739162502265229285668889329486246501015346579337652707239409519978766587351943831270835393219031728127
M(521) => 6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151
M(127) => 170141183460469231731687303715884105727
M(107) => 162259276829213363391578010288127
M(89) => 618970019642690137449562111
M(61) => 2305843009213693951
M(31) => 2147483647
M(19) => 524287
M(17) => 131071
M(13) => 8191
M(7) => 127
M(5) => 31
M(3) => 7
分享到:
相关推荐
因此,后续出现了许多改进版,如SFMT(Slightly Faster Mersenne Twister)和PCG(Permuted Congruential Generator)等。 总的来说,Mersenne Twister算法是当前最常用的随机数生成器之一,它的高效性和统计特性使...
此算法是Makoto Matsumoto (松本)和Takuji Nishimura (西村)于1997年开发的,基于有限二进制字段上的矩阵线性再生。可以快速产生高质量的伪随机数,修正了古老随机数产生算法的很多缺陷。 Mersenne Twister这个名字...
Mersenne Twister随机数发生器是目前常用的能快速产生高质量伪随机序列的发生器,就目前来看它一共有3个变种,分别是MT19937,MT19937-64,SFMT(或者DSFMT)。 相比较前人的LCG算法和GFSR算法(广义的反馈移位寄存器...
- **性能优异**:相比于其他伪随机数生成器,Mersenne Twister在确保随机性的基础上实现了更高的计算效率。 Mersenne Twister的名字来源于其周期长度通常选择Mersenne质数,常见的两个变种分别是Mersenne Twister ...
利用Mersenne Twister算法产生随机数,并测试和分析了其随机性。 程序中还加入了界面显示。 各个文件为: initGenerator.m: initGenerator函数,用于初始化随机序列的长度和值 generateNum.m: generateNum函数,当...
**梅森捻线机(Mersenne Twister)**是一种广泛应用的伪随机数生成器(Pseudo-Random Number Generator, PRNG),尤其在计算机科学、统计学和模拟领域有着广泛的用途。这个开源库专为前端开发设计,允许开发者在...
在给定的标题和描述中,我们讨论的是一个针对FPGA(Field-Programmable Gate Array)应用进行了优化的改进版Mersenne Twister算法,具有更好的随机性和资源效率。 首先,Mersenne Twister的基本原理是基于Mersenne...
《C语言数值算法程序大全(第二版)》是C编程领域中一本重要的参考资料,它涵盖了大量数值计算领域的经典算法,并提供了详细的源代码实现。在数值计算中,C语言因其高效、灵活和对底层硬件访问的优势,常被用来开发高...
Mersenne Twister PRNG算法的Rust实现
6. **分布式计算项目**:像Great Internet Mersenne Prime Search (GIMPS) 和“圆周率世界纪录”之类的项目,利用全球志愿者的计算机资源,共同计算π的更多位数。 7. **π的应用**:π在许多科学和工程领域都有...
Impact JS Mersenne Twister 插件 这个插件允许 yoy 使用 Mersenne Twister 生成伪随机数。 该插件基于 MT19937 算法,代码由 安装 作为子模块,从 git 命令行: git submodule add ...
在过去的30年中,一个名为Great Internet Mersenne Prime Search(GIMPS)的长期分布式计算项目一直在寻找Mersenne Prime。 传统上涉及的算法是针对CPU实施的,但由于GPU令人印象深刻的强大功能和广泛的内存带宽,...
2. **Mersenne数计算**:一旦确认了p是素数,程序会计算2^p - 1的值。这可能通过循环或位操作来实现,对于大数计算,Fortran提供了内置的`INTEGER(KIND=*)`类型来处理。 3. **位数打印**:为了打印Mersenne数的所有...
"自动生成计算题源码" 这个标签揭示了这是一个源代码级别的资源,意味着用户或者开发者可以直接查看和修改代码,根据自己的需求定制功能,或者进行二次开发。 【知识点详解】 1. **基础数学运算**:程序设计了加、...
这些随机数可以来自于各种随机数生成器,如线性同余法、Mersenne Twister或硬件随机数生成器。 2. **概率计算**:对每个不同的随机数出现的次数进行计数,然后除以总数以得到其概率。 3. **熵计算**:使用上述熵的...
给定Mersenne Twister的至少624个输出,我们可以恢复其内部状态。 Mersenne Twister在许多编程语言(例如PHP,Python,Ruby等)中用作PRNG。有关详细说明,请参考 。 用法 只需将观察到的输出列表传递给go()方法:...
该书第二卷的第三版对原有的内容进行了更新和扩展,以适应现代计算环境的变化。其中,"半数值算法"这一主题涵盖了广泛的计算问题,包括但不限于: 1. **浮点数表示和运算**:讨论了浮点数在计算机中的存储方式,...
在C#编程环境中,数值计算算法是至关重要的一个领域,它涵盖了从基本的数学运算到复杂的数值求解方法。这个“C#数值计算算法编程”压缩包可能包含了一系列的示例代码、教程文档或者相关资源,帮助开发者学习如何在C#...
Mersenne Twister 预测器 根据前624个生成的数字预测MT19937 PRNG。 Python标准库的“随机”有一个专门化。 用法 安装 $ pip install mersenne-twister-predictor 作为图书馆 该库具有 CPython 标准random的特殊...