である私は、再帰的に比較的少数の剰余演算子を使用することを含む一つの解決策を考えることができます。このソリューションは、計算に時間がかかることがありますが、発生しているオーバーフローの種類を簡単に回避できる必要があります。
我々は、モジュラ算術の次のプロパティを利用することができます。
(a*b) mod c = ((a mod c)*b) mod c
簡単な例は、以下を参照してください。これは、比較的小さな数値(経験するオーバーフローよりもはるかに小さい)を使用しますが、その点を実証しています。
(5*4*3*2*1) mod 7
計算この「伝統的な方法」あなたがやるだけでしょう:
120 mod 7 = 1
をしかし、我々は120
我々はできる限り大きく数字を使用することはできませんと言ってみましょうこれを行う:
(5) mod 7 = 5 (take this result as input to next line)
|
|
+----------+
|
|
(5*4) mod 7 = 20 mod 7 = 6
|
|
+-----------------------+
|
|
(6*3) mod 7 = 18 mod 7 = 4
|
|
+-----------------------+
|
|
(4*2) mod 7 = 8 mod 7 = 1
|
|
+----------------------+
|
|
(1*1) mod 7 = 1 mod 7 = 1 <--this is final result
上記の結果(1
)は、120 mod 7
という計算を直接行うことと同じ結果になります。しかし、どの計算でも最大の数字は20
でした。
もう1つ注意すべき点:この方法の場合、中間結果が0
である場合、最終結果は0
でなければなりません。
EDIT
あなたも小さい数字に対処する必要がある場合は、剰余演算の次のプロパティを使用することができます(実際には、既に上記示されているものの単なる延長である):
a*b mod c = ((a mod c)*(b mod c)) mod c
これを行うのではなく、a*b
として大きなとして数字を扱うことで、あなただけ以下でなければなりません、(a mod c)*(b mod c)
として大きなとして数字を扱います(x mod c
はc-1
以下である必要があります)。もちろん、より小さい数値を扱う場合のトレードオフは、コードがより複雑になり、実行に少し時間がかかることです。
実際の問題はmプライムですか? – dmuir
あなたの質問に対する答えは、mとリスト内の整数の関係によって決まります。 mプライムですか? mはリストのすべての数字に比例していますか?いずれかがそうであれば、高速で簡単なアルゴリズムがあります。そうでない場合や、わからない場合は、最適なアルゴリズムは遅くても実行可能です。 –
いいえ、mは素数ではありません –