【发布时间】:2015-05-03 01:24:59
【问题描述】:
现在 CodeSprint 3 已经结束,我一直在想如何解决这个问题。对于较大的 r 和 n (0
【问题讨论】:
现在 CodeSprint 3 已经结束,我一直在想如何解决这个问题。对于较大的 r 和 n (0
【问题讨论】:
对于非素数模,分解它 (142857 = 3^3 * 11 * 13 * 37) 并使用通用卢卡斯定理计算模的每个素数的 C(n,k) mod p^q,并且使用中国剩余定理将它们组合起来。
例如,C(234, 44) mod 142857 = 6084,那么
中国剩余定理涉及找到 x 使得
结果是 x = 6084。
C(234, 44) mod 3^3
首先将 n、k 和 n-k 转换为基数 p
n = 234_10 = 22200_3
k = 44_10 = 1122_3
r = n-k = 190_10 = 21001_3
接下来求进位数
e[i] = number of carries from i to end
e 4 3 2 1 0
1 1
r 2 1 0 0 1
k 1 1 2 2
n 2 2 2 0 0
现在创建通用 Lucas 所需的阶乘函数
def f(n, p):
r = 1
for i in range(1, n+1):
if i % p != 0:
r *= i
return r
由于 q = 3,您一次将只考虑基 p 表示的三位数字
所以
f(222_3, 3)/[f(210_3, 3) * f(011_3, 3)] *
f(220_3, 3)/[f(100_3, 3) * f(112_3, 3)] *
f(200_3, 3)/[f(001_3, 3) * f(122_3, 3)] = 6719344775 / 7
现在
s = 1 if p = 2 and q >= 3 else -1
然后
p^e[0] * s * 6719344775 / 7 mod 3^3
e[0] = 2
p^e[0] = 3^2 = 9
s = -1
p^e[0] * s * 6719344775 = -60474102975
现在你有
-60474102975 / 7 mod 3^3
这是一个线性同余,可以用解决
ModularInverse(7, 3^3) = 4
4 * -60474102975 mod 27 = 9
因此 C(234, 44) mod 3^3 = 9
【讨论】: