G - Simple Math Problem 2

2 secs 1024 MB
shobonvip's icon shobonvip

考察

a,ba, b を互いに素とします。整数 x,yx, yx3x(moda),y3y(modb)x^3 \equiv x \pmod a, y^3 \equiv y\pmod b を満たすとき、中国剰余定理より nx(moda),ny(modb)n\equiv x\pmod a, n \equiv y\pmod b を満たす nn が mod abab で一意に存在します。

この nn に対して、 n3x3x(moda),n3y3y(modb)n^3 \equiv x^3 \equiv x \pmod a, n^3 \equiv y^3 \equiv y \pmod b が成り立つため、 n3n0(moda),n3n0(modb)n^3-n \equiv 0 \pmod a, n^3 - n \equiv 0 \pmod b が従います。同じく中国剰余定理より、 n3n0(modab)n^3 - n \equiv 0 \pmod{ab} すなわち n3n(modab)n^3 \equiv n \pmod{ab} が成り立ちます。

逆に 00 以上 abab 未満の n3n(modab)n^3 \equiv n \pmod {ab} を満たす整数 nn を指定したとき、nn から nx(moda),ny(modb)n \equiv x \pmod a, n \equiv y \pmod b を満たす (x,y)(x, y) が存在し、これは x3x(moda),y3y(modb)x^3 \equiv x \pmod a, y^3 \equiv y \pmod b を満たします。

今までの議論により、次のような解法が正当です。

  1. MM を素因数分解して M=p1a1p2a2pkakM = p_1^{a_1}p_2^{a_2}\cdots p_k^{a_k} とおく。
  2. i=1,2,,ki=1,2,\cdots, k に対して、mod piaip_i^{a_i} での x3xx^3 \equiv x の解をすべて求める。
  3. Garner のアルゴリズムを用いて、解をすべて復元する。

ここの計算量は、解の個数を KK 個として、 O(KlogM)O(K \log M) 時間かかります。しかし、問題点として、まだ 2. の部分のステップに時間をかけすぎてしまうことがあります。そこで、素数べき pap^a に対してその解の特徴を考察します。

p3p \ge 3 のとき

p3p \ge 3 とします。 x3x=(x1)x(x+1)0(modpa)x^3 - x = (x-1)x(x+1) \equiv 0 \pmod{p^a} の解は 0,1,pa10, 1, p^a - 1 があります。しかし、実はそれだけであることが示されます。

もし他に解 xx があるとしたら、 (x1)x(x+1)(x-1)x(x+1)pap^a の倍数になります。よって、 x1,x,x+1x-1, x, x+1 のどれか 11 つは pkp^k の倍数になります。ここで、 x0,1,pa1x \ne 0, 1, p^a-1 なので、 1ka11 \le k \le a-1 です。

しかし、 p3p \ge 3 であるので、 (x1)x(x+1)(x-1)x(x+1) であって pp の倍数であるものは 11 つしかなく、 (x1)x(x+1)(x-1)x(x+1) はよって pap^a の倍数になりません。

よって、解は 0,1,pa10, 1, p^a-133 つだけです。

p=2p = 2 のとき

a=1a = 1 のとき、明らかに解は x=0,1x = 0, 122 つです。

a=2a = 2 のとき、明らかに解は x=0,1,3x = 0, 1, 333 つです。

a3a \ge 3 のとき、解は x=0,1,2a11,2a1+1,2a1x = 0, 1, 2^{a-1}-1, 2^{a-1}+1, 2^a - 155 つです。 v(t)v(t) を、 tt22 で割ることができる回数とします。いま、解であるための必要十分条件は v((x1)x(x+1))av((x-1)x(x+1)) \ge a であることです。

x0,1,2a1x \ne 0, 1, 2^a - 1 として、先ほどの議論をなぞると、 x1,x+1x-1, x+1 がともに 22 の倍数である必要があります。ここで、たとえば f(x1)=k2f(x-1) = k \ge 2 とすると、必ず f(x+1)=1f(x+1) = 1 となります。もし f(x+1)2f(x+1) \ge 2 とすると、連続する 33 つの整数の中に 44 の倍数が 22 個現れてしまい矛盾します。

ka1k \le a-1 であったので、 f(x1)=a1f(x-1) = a-1 すなわち x=2a1+1x = 2^{a-1} + 1 が必要です。そしてこれは解になります。同様にして、 f(x+1)=a1f(x+1)=a-1 の場合、 x=2a11x = 2^{a-1}- 1 が導かれます。これで p=2,a3p=2, a\ge 3 のとき解は x=0,1,2a11,2a1+1,2a1x = 0, 1, 2^{a-1}-1, 2^{a-1}+1, 2^a-155 つであることが示されました。

まとめ

  • p3p \ge 3 のとき、mod pap^a での解は x=0,1,pa1x = 0, 1, p^a - 1 である
  • p=2,a=1p = 2, a = 1 のとき、mod pap^a での解は x=0,1x = 0, 1 である
  • p=2,a=2p = 2, a = 2 のとき、mod pap^a での解は x=0,1,3x = 0, 1, 3 である
  • p=2,a3p = 2, a \ge 3 のとき、mod pap^a での解は x=0,1,2a11,2a1+1,2a1x = 0, 1, 2^{a-1}-1, 2^{a-1}+1, 2^a - 155 つである

これで mod pap^a での x3xx^3 \equiv x の解が O(1)O(1) で求まり、この問題に答えることができます。

実装について

解の復元をする際、集合の直積の要素をすべて列挙する必要がありますが、これは再帰で求めることができます。また、Python を使用する場合は itertools.product が便利です。