文章目录
一、解析
GCD()
输入M,m,以及初始迭代值x,y,返回M mod m的逆元
Mod_B_A_Inv()
输入M,m,返回a在区间[1,m)之间的逆元
CR_T()
同余方程组:X=A mod M
输入A,M,输出方程组的解X
二、思路
流程:
通过GCD()得到一个逆元M^-1
通过Mod_B_A_Inv()调整逆元M^-1
通过CR_T()得到一系列的逆元:M_1^ -1,M_2^-1…,结合中国剩余定理给出同余方程组的解X
三、效果
四、代码
1、Mian
A_1=[2 3 2];
M_1=[3 5 7];
disp(CR_T(A_1,M_1));
A_1=[1 5 4 10];
M_1=[5 6 7 11];
disp(CR_T(A_1,M_1));
A_1=[2 5 2 10 10];
M_1=[5 6 7 11 13];
disp(CR_T(A_1,M_1));
2、CR_T
function [ret] = CR_T(A,M)
Size=size(A);
Multi_M=1;
Multi_M_i=[];
Multi_M_i_Inv=[];
for i=1:Size(2)
Multi_M=Multi_M*M(i);
end
for i=1:Size(2)
Multi_M_i=[Multi_M_i Multi_M/M(i)];
end
for i=1:Size(2)
Multi_M_i_Inv=[Multi_M_i_Inv Mod_B_A_Inv(Multi_M_i(i),M(i))];
end
ret=mod(sum(Multi_M_i_Inv.*Multi_M_i.*A),Multi_M);
end
3、Mod_B_A_Inv
function [ret] = Mod_B_A_Inv(a,b)
A=[a,b];
Ini_XY=[1 0];
[X_Y]=GCD(A,Ini_XY);
while(X_Y(1)<0 || X_Y(1)>=b)
temp=(b-X_Y(1))/abs(b-X_Y(1));
X_Y(1)=X_Y(1)+temp*b;
end
ret=X_Y(1);
end
4、GCD
function [X_Y] = GCD(A,Initial_XY)
%gcd(a,b)=a*x+b*y
%X_Y=[x y]
%gcd:存储除数的数组
a=A(1);
b=A(2);
%gcd=[b];
Q_Array=[];
while(b)
c=mod(a,b);
Q_Array=[(a-c)/b Q_Array];
a=b;
b=c;
%gcd=[b gcd];
end
%x,y迭代初值
X_Y=Initial_XY';
for i=Q_Array
Q=[0 1;1 -1*i];
X_Y=Q*X_Y;
end
X_Y=X_Y';
end