我搜索了这个问题的答案,我得到了各种有用的链接,但是当我实现这个想法时,我得到了错误的答案。
这就是我的理解:
如果 m 是素数,那么它非常简单。任何数字“a”的反模数可以计算为:inverse_mod(a) = (a^(m-2))%m
但是当 m 不是素数时,我们必须找到 m 的素数,即m= (p1^a1)*(p2^a2)*....*(pk^ak).
这里 p1,p2,....,pk 是 m 的素数,a1,a2,....,ak 是它们各自的素数权力。
然后我们必须计算:
m1 = a%(p1^a1),
m2 = a%(p2^a2),
…………
mk = a%(pk^ak)
然后我们必须使用中国剩余定理(https://en.wikipedia.org/wiki/Chinese_remainder_theorem)组合所有这些余数
我为 m=1000,000,000 实现了这个想法,但我仍然得到错误的答案。
这是我对 m=1000,000,000 的解释,它不是素数
m= (2^9)*(5^9)
其中 2 和 5 是 m 的主要因数。
令 a 是必须计算反模 m 的数。
m1 = a%(2^9) = a^512
m2 = a%(5^9) = a^1953125
Our answer will be = m1*e1 + m2*e2
where e1= { 1 (mod 512)
0 (mod 1953125)
}
and e2= { 1 (mod 1953125)
0 (mod 512)
}
现在要计算 'e1' 和 'e2' ,我使用了Extended Euclidean Algorithm。 https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm
代码是:
void extend_euclid(lld a,lld b,lld& x,lld& y)
{
if(a%b==0)
{
x=0;
y=1;
return ;
}
extend_euclid(b,a%b,x,y);
int tmp=x;
x=y;
y=tmp-(a/b)*y;
}
Now e1= 1953125*y and e2=512*y;
So, Our final answer will be = m1*e1 + m2*e2 .
但是在做了这一切之后,我得到了错误的答案。
请解释并指出我在理解中国剩余定理时所犯的任何错误。
非常感谢您。