それを観察する
物-床(物/天井)*天井
は(thing%ceil)と同じです。ここで、%はモジュロ演算子(除算後の余り)です。あなたの場合、
$ dec =($ num * $ prime)%$ ceil
これは常に0から$ceil-1の間であるため、$ceilに等しい値$decを取得できないことに注意してください。一方、0と$ceil-1の間の特定の$decに対して、0と$ceil-1の間の解$numを効率的に見つけることができます。
(観察結果は、$numが$num + i * $ ceilよりもソリューションである場合、任意のiもソリューションです。)
$ dec=42の進め方は次のとおりです。
$ ceil = 2 ^ 5 * 31^5という事実を使用します。したがって、方程式は次のようになります。
42 =($ num * 566201239)%(2 ^ 5 * 31 ^ 5)
まず、($ num%2)、つまり$numが奇数か偶数かを調べます。2を法とする方程式の両辺を取ります。
0 = 42%2 =(($ num * 566201239)%(2 ^ 5 * 31 ^ 5))%2。
2は$ceilを除算するため、右側は($ num * 566201239)%2になります。これが0でなければならない場合、$ numは偶数でなければなりません($ primeはそうではないため)。したがって、いくつかの$ aに対して($ num = 2 * $ a)があり、
2 * 21 = 42 =(2 * $ a * 566201239)%(2 ^ 5 * 31 ^ 5)、
2で割った後、
21 =($ a * 566201239)%(2 ^ 4 * 31 ^ 5)。
%記号の後の部分も2で割られていることに注意してください。このモジュロ2を使用して続行します。つまり、$ aが奇数であることがわかります。つまり、$bに対して$a = 2 * $ b+1です。
21 =((2 * $ b + 1)* 566201239)%(2 ^ 4 * 31 ^ 5)、
349931614≡21-566201239≡(2 * $ b * 566201239)%(2 ^ 4 * 31 ^ 5)、
(私は合同表記≡を使い始めました; x≡y%zによって私はx%z = y%zを意味します)。
174965807≡($ b * 566201239)%(2 ^ 3 * 31 ^ 5)
私たちは続けます...
174965807≡((2 * $ c + 1)* 566201239)%(2 ^ 3 * 31 ^ 5)
174965807-566201239≡(2 * $ c * 566201239)%(2 ^ 3 * 31 ^ 5)
66830984≡2*$c * 566201239)%(2 ^ 3 * 31 ^ 5)
33415492≡($ c * 566201239)%(2 ^ 2 * 31 ^ 5)
33415492≡(2 * $ d * 566201239)%(2 ^ 2 * 31 ^ 5)
16707746≡($ d * 566201239)%(2 * 31 ^ 5)
16707746≡(2 * $ e * 566201239)%(2 * 31 ^ 5)
8353873≡($ e * 566201239)%(31 ^ 5)。
置換を要約すると、次のことを思い出してください
$ num = 2 * $ a = 2 *(2 * $ b + 1)= 4 * $ b + 2 = 4 *(2 * $ c + 1)+ 2 = 8 * $ c + 6 = 8 * 2 * $ d + 6 = 8 * 2 * 2 * $ e + 6 = 32 * $ e + 6
ちなみに、31 ^5を法とする方程式の$primeを減らすこともできます(各ステップで現在の法によってそれを減らし続けることができますが、誰が気にしますか?):
8353873≡($ e * 22247370)%(31 ^ 5)。
乗数は素数ではないことがわかりますが、実際には問題ではありません。
ここで、31を法とする最後の方程式を見てみましょう。
8353873≡($ e * 22247370)%(31 ^ 5)。
24≡8353873≡($ e * 22247370)%(31 ^ 5)≡($ e * 22247370)≡($ e * 3)%31
31を法とする3の倍数のルックアップテーブルでは、$e≡8%31、または$ e = 31 * $ f+8であることがわかります。
8353873≡((31 * $ f + 8)* 22247370)%(31 ^ 5)。
8353873-8 *22247370≡(31 * $ f * 22247370)%(31 ^ 5)。
2149819≡8353873-8*22247370≡(31 * $ f * 22247370)%(31 ^ 5)。
69349 = 2149819 /31≡($ f * 22247370)%(31 ^ 4)
そして私たちは続けます...
2≡69349%31≡($ f * 22247370)%(31 ^ 4)≡($ f * 3)%31
$f≡11%31
$ f = 31 * $ g + 11
69349≡((31 * $ g + 11)* 22247370)%(31 ^ 4)
81344≡69349-11*22247370≡(31 * $ g * 22247370)%(31 ^ 4)
2624≡($ g * 22247370)%(31 ^ 3)
乗数をもう一度減らしましょう...
2624≡($ g * 23284)%(31 ^ 3)
20≡2624≡($ g * 23284)%(31 ^ 3)=($ g * 3)%31
$ g = 31 * $ h + 17
2624≡((31 * $ h + 17)* 23284)%(31 ^ 3)
23870≡2624-17*23284≡(31 * $ h * 23284)%(31 ^ 3)
770≡($ h * 23284)%(31 ^ 2)
26≡770≡($ h * 23284)%(31 ^ 2)=($ h * 3)%31
$ h = 31 * $ i + 19
770≡((31 * $ i + 19)* 23284)%(31 ^ 2)
434≡770-19*23284≡(31 * $ i * 23284)%(31 ^ 2)
14 =($ i * 3)%31
$ i = 15
後方置換により、$ h = 31 * 15 + 19 = 484、$ g = 31 * $ h + 17 = 15021、$ f = 31 * $ g + 11 = 465662、$ e = 31 * $ f+8が得られます。 = 14435530、$ num = 32 * e + 6=461936966。
結果を確認するだけです。
。>>>(461936966 * 566201239)%916132832
42
わお!:-)
ブログの人はむしろmd5を使うべきでした。