Python 寻找二项式有效模素数,采访街头挑战
我在这方面做了很多工作,但是找不到更大测试用例的答案 问题陈述 在数学中,二项式系数是在二项式定理中作为系数出现的一系列正整数。C(n,k)表示从n个不同对象中选择k个对象的方法的数量 然而,当n和k太大时,我们通常在通过素数p进行模运算后保存它们。请计算n在通过p模运算后有多少二项式系数变为0 输入 第一个输入是一个整数T,即测试用例数 下面的每一条T线都包含2个整数n和素数p 输出 对于每个测试用例,输出一行包含\tbinom NK的数量(0您的公式已关闭) 你在计算l*(p-t-1) 如果存在p^2、p^3等因子,则此公式不起作用。当l>p时,会出现这种情况(如果m也可能>p)Python 寻找二项式有效模素数,采访街头挑战,python,algorithm,primes,largenumber,binomial-coefficients,Python,Algorithm,Primes,Largenumber,Binomial Coefficients,我在这方面做了很多工作,但是找不到更大测试用例的答案 问题陈述 在数学中,二项式系数是在二项式定理中作为系数出现的一系列正整数。C(n,k)表示从n个不同对象中选择k个对象的方法的数量 然而,当n和k太大时,我们通常在通过素数p进行模运算后保存它们。请计算n在通过p模运算后有多少二项式系数变为0 输入 第一个输入是一个整数T,即测试用例数 下面的每一条T线都包含2个整数n和素数p 输出 对于每个测试用例,输出一行包含\tbinom NK的数量(0您的公式已关闭) 你在计算l*(p-t-1) 如果
对于较小的数字,尝试n=10,p=3,看看我在说什么。你的计算会返回3个r值,其中10 C r mod 3=0,但实际上有7个。你可以从另一端看:有多少
nCr
不能被p
整除?有一个相当简单的公式
预备工作:
二项式系数nCr
由下式给出
nCr = n! / (r! * (n-r)!)
因此nCr
中p
的多重性v_p(nCr)
,nCr
的素因子分解中p
的指数为
v_p(nCr) = v_p(n!) - v_p(r!) - v_p((n-r)!)
n!
中p
的多重性很容易确定,一种众所周知的计算方法是
v_p(n!) = ∑ floor(n/p^k)
k > 0
如果考虑到n
的基本展开式-p
,您可以看到
v_p(n!) = (n - σ_p(n)) / (p - 1)
其中,σp(k)
是k
表示的基-p的位数之和
v_p(nCr) = (n - σ_p(n) - r + σ_p(r) - (n-r) + σ_p(n-r)) / (p - 1)
= (σ_p(r) + σ_p(n-r) - σ_p(n)) / (p - 1)
结论:
nCr
不可被素数p
整除,当且仅当r
和n-r
的加法没有进位基p
因为这正是σu p(a+b)=σu p(a)+σu p(b)
的时候。当a
和b
的相应数字之和时,加法中的进位发生(如果已经为低有效数字生成进位,则可能加上进位)是=p
,则总和中的相应数字减少p
,下一个更有效的数字增加1,数字总和减少p-1
我们有一个无进位加法n=r+(n-r)
在basep
中,如果对于n
的base-p
扩展中的每个数字d_k
,则r
的相应数字小于或等于d_k
。r的数字的允许选择是独立的,因此总数是该数字的选择计数的乘积单个数字
nCr
不可被素数p
整除的数量为
ND(n,p) = ∏(d_k + 1)
m
n + 1 - ∏ (d_k + 1)
k=0
其中duk
是n
的基p
扩展中的数字
m
n = ∑ d_k * p^k
k=0
由于给定的n
存在n+1
(非零)二项式系数nCr
,因此可被p
整除的(非零)二项式系数nCr
的数量为
ND(n,p) = ∏(d_k + 1)
m
n + 1 - ∏ (d_k + 1)
k=0
使用上述基础p
扩展n
使用n=10
,p=3
10 = 1*3^0 + 0*3^1 + 1*3^2
因此有(1+1)*(0+1)*(1+1)=4
系数10Cr
不能被3整除,而10+1-4=7可以被3整除
def divisibleCoefficients(n,p):
m, nondiv = n, 1
while m > 0:
nondiv = nondiv * ((m % p) + 1)
m = m // p
return (n + 1 - nondiv)
在我自己的第一次计算之后,我倾向于同意你的结果。我很好奇实际的公式是什么。我在发布之前试图弄清楚这一点,但没有。只需再次调用函数def fun1(a,b):如果a>=b:j=0t=a%bl=a/bj=l*(b-t-1)返回j+((t+1)*fun1(l,b))否则:返回0inp1=raw\u input()N=int(inp1)result[]对于范围(N)中的i:inp=raw_input()a,b=[long(x)for x in inp.split(“”)]j=fun1(a,b)#N=lp+t结果。对于范围(N)中的i追加(j):打印结果[i]精彩的解释…你能给一些关于可除性、素数、pollards rho等的材料指点一下吗…顺便说一句,你刚才得到的结果是lucas理论的推论谢谢你的回答!我发现这篇论文,可能对某些人有用
def divisibleCoefficients(n,p):
m, nondiv = n, 1
while m > 0:
nondiv = nondiv * ((m % p) + 1)
m = m // p
return (n + 1 - nondiv)