请注意
东西 - 地板(东西/天花板)*天花板
与 (thing%ceil) 相同,其中 % 是模运算符(除法后的余数)。在你的情况下,
$dec = ($num * $prime) % $ceil
请注意,这始终介于 0 和 $ceil-1 之间,因此无法获得等于 $ceil 的值 $dec。另一方面,对于给定的介于 0 和 $ceil-1 之间的 $dec,您可以有效地找到介于 0 和 $ceil-1 之间的解 $num。
(观察结果是,如果 $num 是一个解决方案,那么对于任何 i 来说,$num+i*$ceil 也是一个解决方案。)
这是 $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
在 3 的倍数模 31 的查找表中,我们发现 $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。