模块化逆包含两个数的除法

时间:2015-10-03 22:40:45

标签: algorithm combinatorics modular-arithmetic

我知道(a / b)mod M = ab ^ -1 mod M

并且当M是素数时,则b ^ -1 = b ^(M-2)

我必须计算(121/2)mod M,其中M = 1000000007(1e9 + 7)

使用简单划分:(121/2)modM =(60)mod M = 60%M = 60

使用模块化反向 :( 121/2)mod M =((121 mod M)*(2 ^(M-2)mod M))mod M.

2 ^(M-2)mod M这里是500000004(链接:http://www.cs.princeton.edu/~dsri/modular-inversion-answer.php?n=2&p=1000000007

所以上面的表达式变为(121 mod M * 500000004)mod M = 60500000484 mod M = 500000064

我可能做错了什么?

1 个答案:

答案 0 :(得分:3)

您不能执行整数除法并期望得到相同的结果。你的计算应该是:

> SELECT 0 IN (123, 'abc', 'def'); +--------------------------+ | 0 IN (123, 'abc', 'def') | +--------------------------+ | 1 | +--------------------------+

而不是

121/2 (mod M) = 60 + 1/2 (mod M) = 60 + 50000004 = (mod M) = 50000064

由于121/2 (mod M) = 60 (mod M)函数没有定义从有理数floor到组Z_n(仅将有理数定义为自然数,Q),因此您应该像对待理性那样处理Z_n中的分歧,即使用剩余部分。