Python 寻找二项式有效模素数,采访街头挑战

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) 如果

我在这方面做了很多工作,但是找不到更大测试用例的答案

问题陈述 在数学中,二项式系数是在二项式定理中作为系数出现的一系列正整数。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)


对于较小的数字,尝试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)
在base
p
中,如果对于
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)