中国剩余定理的练习和求逆元，扩展欧几里得算法matlab小结

1.（k > p）k = a*p + r , k = r(mod p )

2.（k < p）p = a*k + r , k = -r(mod p )

求逆元(inv)

[注：mod(a,p)是matlab求余函数]

扩展欧几里得算法求逆元

扩展欧几里得算法

[注：因为matlab没有地板除，除法取整只能再加函数，这里用floor，向原点方向取整]

an *xn + 0*yn = gcd(a , b)

扩欧求逆元

a *a^ = 1(mod p)可改写为：a*a^ + m*p = 1。即求a^的最小值。

an = bn-1 , bn = mod(an-1,bn-1)

xn = yn-1 + floor(a /b)xn-1 , yn = xn-1

%扩展欧几里得算法
function f = getinv1( a ,b)
while(a<b)
a = a + b;
while(gcd(a,b)~=1)
a = a + b;
end
end
A = [];B = [];
A(end+1)= a;B(end+1)= b;
x = 1;y = 0;i = 1;c = 0;
while(b ~= 0)
c = b;b = mod(a , b);i = i + 1;
a =c ;
A(end+1)= a;B(end+1)= b;
end
while(i ~= 1)
a = A(i-1);b = B(i-1);
i = i - 1;
c = y;
y = x - floor(a/b)*y;
x = c;
end
while(x<0)
x = x + b;
end
f = x;

2.（k < p）p = a*k + r , k = -r(mod p )

inv(k) = p -inv(mod(p , k))*floor(p\k)

kn = mod(p , kn-1)

function[e] = getinv2(a , mod)
%1.ak+r=mp,k=-r(mod p),k<p的情况
%2.k=ap+r,k=r(mod p),k>p的情况
%3.只适用于p为素数的情况
if(a>mod)
a = rem(a , mod);
end
b = 1;
c = zeros(1,a);
c(1)=1;
while(b < a)
b = b + 1;
if(rem(mod,b)==0)
c(b)=0;
continue;
else
c(b)=(mod-floor(mod/b))*c(rem(mod,b));
c(b)=rem(c(b),mod);
end
end
e = c(a);

中国剩余定理

x = a1 (mod m1)....x = an(mod mn)有解

%中国剩余定理1(模数互质)
clc;clear;
n = input('输入参数个数:');
if (n == 0)
return;
end
A = zeros(1,n);MM = zeros(1,n);inv_B = zeros(1,n);
B = zeros(1,n);M = 1;N = 0;
i = 1;j = 1;k = 1;
while(i<n+1)
fprintf('输入第%d组参数：',i);
A(i) = input('输入a的值：');
B(i) = input('输入m的值：');
if(A(i) == 0||B(i) == 0)
return;
end
i = i + 1;
end
%求M
while(j<n+1)
M = M*B(j);
j = j + 1;
end
fprintf('M的值为：%d\n',M);
while(k<n+1)
MM(k) = floor(M/B(k));
k = k + 1;
end
fprintf('Mi：');
disp(MM);
i = 1;j = 1;k = 1;
while(i<n+1)
if(gcd(MM(i),B(i))~=1)
fprintf('Mi的逆元是0\n');
inv_B(i)= 0;
continue;
end
inv_B(i) = getinv1(MM(i),B(i));
fprintf('M的逆元为%d\n',inv_B(i));
N = N+A(i)*MM(i)*inv_B(i);
i = i + 1;
end
N = mod(N , M);
fprintf('方程的解:%d',N);



运行实例：

输入参数个数:3

M的值为：4845
Mi：   323   285   255

M的逆元为2
M的逆元为4
M的逆元为12

• 3
点赞
• 16
收藏
觉得还不错? 一键收藏
• 打赏
• 0
评论
10-29 3441
05-03 5万+
02-13 968
06-06
10-15 114
09-04 447
09-02 1574
07-20 2313
04-29 1369
03-27 1582
04-09 1万+

“相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

¥1 ¥2 ¥4 ¥6 ¥10 ¥20

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