a(mod n)のモジュラ逆数を計算できるようにする組み込み関数はありますか?例: 19^-1 = 11(mod 30)、この場合は19^-1 == -11 == 19;C#ModInverse関数
答えて
モジュラ演算をサポートするためにC#には何も組み込まれていません。あなたはそれを自分で実装する必要がありますが、それでもなおライブラリを見つける必要があります。
BouncyCastle暗号ライブラリには、ほとんどのモジュラ算術関数を持つBigInteger実装があります。 Org.BouncyCastle.Math名前空間にあります。ネット4.0+は特別合同算術でのBigIntegerを実装しているため
は(「X
パワーY
剰余Z
」を生成)ModPowは、あなたがModInverseをエミュレートするために、サードパーティのライブラリを必要としない機能します。 n
が素数である場合は、あなたがする必要があるすべては計算することである。詳細については
a_inverse = BigInteger.ModPow(a, n - 2, n)
、ウィキペディアで見て:Modular multiplicative inverse、セクションUsing Euler's theorem、特殊なケース「mが素数であるとき」。ちなみに、最近のSOの話題は1/BigInteger in c#で、同じアプローチでsuggested by CodesInChaosです。あなたは、任意の乗算を逆にすることができます
mが素数の場合は*特殊なケースです。 –
int modInverse(int a, int n)
{
int i = n, v = 0, d = 1;
while (a>0) {
int t = i/a, x = a;
a = i % x;
i = x;
x = d;
d = v - t*x;
v = x;
}
v %= n;
if (v<0) v = (v+n)%n;
return v;
}
動作しているようですが、 'a'と' n'がaを共有するときに逆が不可能( 'a'はモジュロ' nを可逆的に反転できません)であればシグナルを送ることができます(彼らのGCDは1を超える)。 –
BigInteger modInverse(BigInteger a, BigInteger n)
{
BigInteger i = n, v = 0, d = 1;
while (a > 0)
{
BigInteger t = i/a, x = a;
a = i % x;
i = x;
x = d;
d = v - t * x;
v = x;
}
v %= n;
if (v < 0) v = (v + n) % n;
return v;
}
BigIntegerに置き換えられたintでSamuelsの回答の(不正な形式の)コピーであるために下落しました。 –
- 1. ランダム関数C#
- 2. C++関数スコープ
- 3. C関数プロトタイプ
- 4. c#関数コーディングガイドライン
- 5. C#Generics関数
- 6. インターロック関数C++
- 7. 関数プロトタイプC
- 8. C++関数は
- 9. displayBooks関数C++
- 10. C++関数タイプ?
- 11. C++オーバーロード関数
- 12. C#関数ポインタ?
- 13. C++ラムダ関数
- 14. プロトタイプ関数C++
- 15. C++ strtok関数
- 16. C関数への可変引数LISP関数のマッピング - C
- 17. CライブラリでC関数
- 18. C関数対Objective-C法?
- 19. C/C++のMATLAB "filter"関数
- 20. C++ 11ラムダC関数ポインタ
- 21. C++のメンバ関数への関数ポインタ
- 22. クラスアクセッサ関数とC++のmutator関数
- 23. C++の関数ポインタとコールバック関数
- 24. 目的関数CへのSwift関数
- 25. C++静的ローカル関数とグローバル関数
- 26. Matlab関数ハンドルとC++関数ポインタ
- 27. cの逆関数の関数ポインタ
- 28. Android関数のC++関数からC関数を呼び出すJNI/NDKコード
- 29. 関数プロトタイプ変数スコープC++
- 30. C++関数オブジェクトの引数
注意。例えば、2はGCD(2,30)!= 1であるので、逆モジュロ30の乗法を持ちます。 – CodesInChaos