作りたい
BigInteger.ModPow(1/BigInteger, 2,5);
しかし、1/BigInteger
常に を返します。0
これにより、結果が0
あまりにも大きくなります。c# のクラスを探しBigDecimal
てみましたが、何も見つかりませんでした。なくてもこれを数える方法はありBigDecimal
ますか?
作りたい
BigInteger.ModPow(1/BigInteger, 2,5);
しかし、1/BigInteger
常に を返します。0
これにより、結果が0
あまりにも大きくなります。c# のクラスを探しBigDecimal
てみましたが、何も見つかりませんでした。なくてもこれを数える方法はありBigDecimal
ますか?
1/a
BigIntegers
除算の小数部分が無視される整数除算を使用するため、|a|>1 の場合は 0 です。あなたがこれに期待している結果はわかりません。
分数ではなく、moduloの剰余乗法逆数にしたいと思います。この逆数は、互いに素である場合にのみ存在します。つまり、です。a
m
a
m
gcd(a, m) = 1
リンクされたウィキペディアのページには、剰余乗法逆数を計算するための 2 つの標準アルゴリズムがリストされています。
任意の係数で機能する拡張ユークリッド アルゴリズム
高速ですが、入力依存のランタイムがあります。
手元に C# コードはありませんが、ウィキペディアから疑似コードを移植するのは簡単です。
オイラーの定理の使用:
これには、φ(m) の知識が必要です。つまり、m の素因数を知る必要があります。が素数の場合は一般的な選択肢m
であり、単純に になると φ(m) = m-1 になります。一定のランタイムが必要で、φ(m) がわかっている場合は、これが最適です。
C# では、これは次のようになります。BigInteger.ModPow(a, phiOfM-1, m)
/
選択した演算子の過負荷は次のとおりです。
public static BigInteger operator /(
BigInteger dividend,
BigInteger divisor
)
BigInteger.Division演算子を参照してください。結果がとの間0
にある場合1
(これは、あなたの場合のようになりそうdividend
です1
)、戻り値は整数であるため、ご覧のとおり、0
が返されます。
この方法で何をしようとしていますModPow
か?あなたはそれが「ツーポイントファイブ」ではなく、2と5の2つの議論であることに気づいてい2,5
ますか?あなたの意図は「5を法とする平方を取る」ですか?
浮動小数点除算が必要な場合は、次を使用できます。
1.0 / (double)yourBigInt
へのキャストに注意してくださいdouble
。yourBigInt
これにより、精度が低下し、大きすぎる場合は「アンダーフロー」がゼロになる可能性があります。