5

非常に大きな整数に対してモジュラス演算を実行する必要があります。私のプラットフォーム(編集:.NET 2.0)でサポートされている最大の整数は64ビット整数ですが、これは私が使用している数値に対して十分な大きさではありません。

12654875632126424875387321657498462167853687516876876のような本当に大きな整数でモジュラスを実行するにはどうすればよいですか?

数字を文字列として扱い、1つずつ分割して処理するソリューションがありますが、もっと良い方法があるかどうかを知りたいと思いました。

これが、数値を文字列として扱う私の関数です。それは基本的にあなたが手でそれをするのと同じように筆算をします。

    Public Function MyMod(ByVal numberString As String, ByVal modby As Integer) As Integer
        Dim position As Integer = -1
        Dim curSubtraction As Integer = 0

        While position < numberString.Length - 1
            position += 1
            curSubtraction = curSubtraction * 10 + CInt(numberString.Substring(position, 1))

            If (curSubtraction / modby) < 1 And position = numberString.Length - 1 Then
                Return curSubtraction
            ElseIf (curSubtraction / modby) < 1 Then
                Continue While
            Else
                curSubtraction = curSubtraction Mod modby
            End If
        End While
        Return curSubtraction
    End Function

よりクリーンで効率的な方法はありますか?

編集:明確にするために、整数はIBAN銀行口座番号から来ています。仕様に従って、IBANアカウント番号(文字を含む)を1つの整数に変換する必要があります。次に、整数に対してモジュラスを実行します。したがって、モジュラスを実行する整数の実際のソースは数字の文字列であると言えると思います。

4

4 に答える 4

5

数字がどこから来ているのかは特定していませんが、いくつか単純化できるかもしれません。数値がもともと小さい場合は、次のようなことを検討してください。

(a + b) MOD n = ((a MOD n) + (b MOD n)) MOD n

また

ab MOD n = (a MOD n)(b MOD n) MOD n
于 2008-11-10T16:57:59.480 に答える
3

暗号/数学ライブラリを使用します。Googleforbignum。

于 2008-11-10T16:52:58.337 に答える
0

.NET 4を使用している場合は、BigIntegerを使用できます。ただし、以前のバージョンでこれを行う方法は次のとおりです。

modには数学的なトリックがあり、最初のx桁を取得し、その値でmodを計算してから、そのmodの結果を残りの桁に追加し、最後に到達するまでプロセスを繰り返します。あなたの「巨大な」数。

再帰的な方法を導入してください!(申し訳ありませんが、VBは行いません)

private static int Mod(string value, int mod) {
    if (string.IsNullOrEmpty(value)) throw new ArgumentException("Invalid value.", "value");
    if (mod <= 0) throw new ArgumentException("Invalid mod.", "mod");

    int maxLength = long.MaxValue.ToString().Length - 1;

    return value.Length > maxLength
        ? Mod((Convert.ToInt64(value.Substring(0, maxLength)) % mod).ToString() + value.Substring(maxLength), mod)
        : Convert.ToInt32(Convert.ToInt64(value) % mod);}
于 2011-04-21T09:36:22.673 に答える
0

IntXなどの任意精度の整数演算ライブラリが必要です。

于 2009-01-16T13:58:57.483 に答える