2011-09-20 11 views
12

a(mod n)のモジュラ逆数を計算できるようにする組み込み関数はありますか?例: 19^-1 = 11(mod 30)、この場合は19^-1 == -11 == 19;C#ModInverse関数

+0

注意。例えば、2はGCD(2,30)!= 1であるので、逆モジュロ30の乗法を持ちます。 – CodesInChaos

答えて

0

モジュラ演算をサポートするためにC#には何も組み込まれていません。あなたはそれを自分で実装する必要がありますが、それでもなおライブラリを見つける必要があります。

+0

どのようなライブラリですか? – Nook

+3

@ Nook:er ... C#ライブラリ? –

+0

モジュラ演算のためのライブラリ。 –

2

BouncyCastle暗号ライブラリには、ほとんどのモジュラ算術関数を持つBigInteger実装があります。 Org.BouncyCastle.Math名前空間にあります。ネット4.0+は特別合同算術でのBigIntegerを実装しているため

12

は(「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です。あなたは、任意の乗算を逆にすることができます

+5

mが素数の場合は*特殊なケースです。 –

5
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; 
} 
+0

動作しているようですが、 'a'と' n'がaを共有するときに逆が不可能( 'a'はモジュロ' nを可逆的に反転できません)であればシグナルを送ることができます(彼らのGCDは1を超える)。 –

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; 
     } 
+4

BigIntegerに置き換えられたintでSamuelsの回答の(不正な形式の)コピーであるために下落しました。 –