对 n = 2,3,...,300, 判断那些 Mersenne 数 M_n=2^n-1 是素数 | matlab 源码

这段代码实现了一个卢卡斯-莱默检验法的MATLAB程序,用于检查2的n次方减1是否为素数。通过迭代计算模运算,当s等于0时输出n值。
clc,clear,close all
for n = 3:200
    s = 4;
    num = 2^n-1;
    for i = 1:n-2
        s = mod(s^2-2,num);
        if s == 0
             disp(n)
             break
        end
    end
end

相关阅读资料
维基百科-卢卡斯-莱默检验法


2021年11月5日20:55:12

% 调用示例1 N = 1e6; seed = 12345; u_lc = linear_congruential(N, seed); fprintf('线性同余法:均值=%.4f,方差=%.4f\n', mean(u_lc), var(u_lc)); histogram(u_lc, 20, 'Normalization', 'pdf'); % 调用示例2 seed1 = [123, 456, 789]; seed2 = [321, 654, 987]; u_mrg = mrg32k3a(N, seed1, seed2); fprintf('MRG32k3a:均值=%.4f,方差=%.4f\n', mean(u_mrg), var(u_mrg)); histogram(u_mrg, 20, 'Normalization', 'pdf'); % 调用示例3 u_mt = rand(1, N); fprintf('Mersenne Twister:均值=%.4f,方差=%.4f\n', mean(u_mt), var(u_mt)); histogram(u_mt, 20, 'Normalization', 'pdf'); % 调用示例4 seed_fsr = [1, zeros(1,15)]; % 初始种子不可全0 u_fsr = lfsr_fsr(N, seed_fsr); fprintf('FSR:均值=%.4f,方差=%.4f\n', mean(u_fsr), var(u_fsr)); histogram(u_fsr, 20, 'Normalization', 'pdf'); function u = linear_congruential(n, seed) m = 2147483647; a = 16807; x = seed; u = zeros(1, n); for i = 1:n x = schrage(x, a, m); % 使用Schrage方法避免溢出 u(i) = x / m; end end function x_next = schrage(x, a, m) q = floor(m / a); r = mod(m, a); k = floor(x / q); x_next = a * (x - k * q) - k * r; if x_next < 0 x_next = x_next + m; end end function u = mrg32k3a(n, seed1, seed2) m1 = 4294967087; m2 = 4294944443; a12 = 1403580; a13 = -810728; a21 = 527612; a23 = -1370589; x1 = seed1; x2 = seed2; u = zeros(1, n); for i = 1:n new_x1 = mod(a12 * x1(2) + a13 * x1(1), m1); x1 = [x1(2), x1(3), new_x1]; new_x2 = mod(a21 * x2(1) + a23 * x2(3), m2); x2 = [x2(2), x2(3), new_x2]; u(i) = mod(new_x1/m1 - new_x2/m2, 1); end end function u = lfsr_fsr(n, seed) register = seed(:)'; bits = zeros(1, n*16); for i = 1:n*16 feedback = xor(xor(xor(register(16), register(12)), register(3)), register(1)); bits(i) = register(16); register = [feedback, register(1:15)]; end u = sum(reshape(bits, 16, n)' .* 2.^(15:-1:0), 2) / 65536; end 请解释以上代码的作用并对输出的结果进行分析
03-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值