この質問の答えを検索しました。さまざまな便利なリンクがありましたが、アイデアを実装すると、間違った答えが返ってきました。
これは私が理解したものです:
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 .
しかし、これをすべて行った後、私は間違った答えを得ています。
中国剰余定理を理解している間に私が犯した間違いを説明し、指摘してください。
どうもありがとうございます。