3

質問は、非常に大きな数のモジュロ演算子についてです。

たとえば、順列の総数を計算する質問について考えてみます。9つの数字(1から9)のそれぞれが10回繰り返される90桁の数字を考えて、90!/(10!)^9)計算する必要があります

StackOverflowで多くの回答を読んだ後、対数を使用してそれを行いました。

ここで、ログ値を1923.32877864と見なします。

さて、私の質問は、「m」を法として答え(つまり、10 ^ log10(value))をどのように表示できるかということです。

そして、これは可能な順列の数を計算するための最良の方法ですか?

編集 解決策を手に入れました:)

duedl0rに感謝します。

モジュラ逆数を使用して指定した方法で実行しました。ありがとう :)

4

2 に答える 2

1

これが実際に可能で正しいかどうかはわかりませんが、コメントを要約して Miky Dinescu からの回答を拡張させてください。

Miky が既に書いたように:

a × b ≣<sub>ma m × b m

これを平等に使用できます:

90!/ 10!^9 ≣<sub>mx

各項を計算します。

90!m / 10!^9 m ≣<sub>mx

次に、乗法逆数を 10!^9 mから見つけます。次に、逆数に 90 を掛けます。メートル


更新 これは正しいようです(少なくともこの場合:))。私はウルフラムでチェックしました:

(90!/10!^9) mod (10^9+7) = 998551163

これにより、同じ結果が得られます。

90!mod (10^9+7) = 749079870
10!^9 mod (10^9+7) = 220052161

逆を行います:

(220052161 * x) mod(10^9+7) = 1 = 23963055

それから:

(749079870*23963055) mod (10^9+7) = 998551163

証拠はありませんが、それが機能する可能性があるといういくつかの証拠:)

于 2012-02-03T15:56:46.360 に答える
0

mmが任意の整数(通常は大きな素数として選択される)である、モジュロを法とする順列の総数を計算する方法は、次のプロパティを使用することであると主張します。

 (a * b) % m = ((a % m) * (b % m)) % m

Nの順列の総数がであると考えると、N! = 1 * 2 * 3 * .. * Nを計算する必要がある場合は、N! % m基本的に上記のプロパティをmを法とする乗算に適用できます。

 ((((1 * (2 % m)) % m) * (3 % m)) % m) * .. 

編集

90を計算するために!/(10!^ 9)値係数を単純化してから、mを法とする乗算を使用してmを法とする最終結果を計算できます。

これが私が考えていることです:

90!= 10!*(11 * 12 * .. * 20)*(21 * 22 * .. * 30)* .. *(81 * 82 * .. * 90)

その後、元の式を次のように書き直すことができます。

(10!*(11 * 12 * .. * 20)*(21 * 22 * .. * 30)* .. *(81 * 82 * .. * 90))/(10!* 10!*。。 。*10!)

分子には、9つの因子の積があります。括弧内の各式を因子と見なします。分母についても同じことが言えます(9つの要素があり、それぞれが10に相当します!)。

分母の最初の要素は、単純化するのは簡単です。その後も、単純化が必要な8つのペアがあります。

したがって、製品の各項を因数分解して、分母を単純化することができます。例えば:

11 * 12 * 13 * 14 * 15 * 16 * 17 * 18 * 19 * 20 <=> 11 * 2 * 2 * 3 * 13 * 2 * 7 * 3 * 5 * 2 * 2 * 2 * 2 * 17 * 2 * 9 * 2 * 2 * 5

分母は常に次のようになります:2 * 3 * 2 * 2 * 5 * 2 * 3 * 7 * 2 * 2 * 2 * 2 * 3 * 3 * 2 * 5

簡略化後、2番目のペアは次のようになります:2 * 2 * 11 * 13 * 17 * 19

同じことが後続の各ペアにも適用でき、上記の式を使用してmを法として計算できる単純な積になります。

もちろん、単純化を実行するためのアルゴリズムを効率的に実装するのは難しいので、最終的には、今私が理解できないより良い方法がなければなりません。

于 2012-02-03T15:20:58.180 に答える