[英]Number of numbers divisible by a prime number in a row to pascal triangle
如何在帕斯卡三角形的给定行数中找到被总数除以质数的整数,我在python中使用以下代码
def factorial(x):
result = 1
for i in xrange(1,x+1):
result *= i
return result
def combination(n,r):
return factorial(n)/(factorial(n-r)*factorial(r))
p = input()
cnt = 0
for i in range(0,n+1):
if((combination(n,i)%p)==0):
cnt += 1
print cnt
但是给定的代码需要很长时间才能获得大数。 你能建议我一个更好的算法吗?
卢卡定理的一个推论指出, 不可被素数p 整除的二项式系数C(n,k)的数量为(a₁+1)⋅(a₂+1)⋅...⋅(a m +1)
,其中a i是p元数字系统中n 的第 i个数字。
例:
p = 3, n = 7dec = 213 Result = (2+1)⋅(1+1) = 6
Pascal三角形的第七行是1 7 21 35 35 21 7 1
,它包含6个不能被3整除的系数,其余两个可以被3整除。
您无需计算二项式系数(n,r)
。
计算n!
p
频率n!
, r!
和(nr)!
并检查是否n!
比其他两个共同因素有更多的因素p
。
// sry... no python...
long count_p_in_fac(long n, long p)
{
long count = 0;
long i = 1;
long temp;
while(true)
{
temp = floor(n/pow(p,i));
count += temp;
if(temp == 0)
break;
}
return count;
}
p = input()
cnt = 0
for i in range(0,n+1):
if(count_p_in_fac(n,p) > count_p_in_fac(i,p) + count_p_in_fac(n-i,p)):
cnt += 1
print cnt
这避免了大数目并减少了操作。
这将在O(log(n))
检查(n,r) = 0 mod p
,而无需计算阶乘。 但是计数一行需要O(n log n)
。
您还可以使用(n,r)
的对称性来加快速度。 仅计算前一半并将其乘以2。 如果n
是偶数,则必须计算中间半数r = n/2
,然后乘以r = n/2
然后将中间相加。
您可以为所有i
预计算count_p_in_fac(i,p)
。
您可以重写组合函数,而无需计算阶乘。 (n, r)
可以递归写成
(n, r) = (n-1, r) + (n-1, r-1)
现在我们应该找到基本案例。 这些是:
(n, 1) = n
(n, 0) = 1
(n, n) = 1
在这里,我们假设n
和r
是非负整数,并且n >= r
成立。 然后可以将功能combination
重写为
def combination(n, r):
if r == 1:
return n
if r == 0 or r == n:
return 1
return combination(n-1, r) + combination(n-1, r-1)
p = input()
count = 0
for i in range(n + 1):
if combination(n, i) % p == 0:
count += 1
print count
您不可能在一秒钟之内完成10 ^ 12。 必须具有Pascall的Triangle的某些属性,才能使此操作变得更容易。
Pascal三角形的另一个有趣的特性是,在p是素数的行p中,该行中除1之外的所有项都是p的倍数。 可以很容易地证明这一点,因为如果p \\ in \\ mathbb {P},则p没有因数1和本身。 三角形中的每个条目都是整数,因此根据定义(pk)! 和k! 是p!\\,的因子。 但是,p本身不可能出现在分母中,因此必须将p(或其倍数)保留在分子中,从而使整个项成为p的倍数。
可能与该结果有关(来自Wiki页面http://en.wikipedia.org/wiki/Pascal%27s_triangle )..如果有答案(即,如果是某位教授给您的大学作业)。
看到这里https://mathoverflow.net/questions/9181/pascal-triangle-and-prime-numbers
(我喜欢这个问题-我不确定这是一个编程问题)。
谢谢大家回答像我这样的菜鸟问题。这是一个有效的python代码
n,p = map(int,raw_input().split(' '))
if n==p:
print n-1
elif p>n:
print 0
else:
result = 1
m = n
while n:
temp = n%p
result *= (temp+1)
n /= p
print m+1-result
n = input("enter the row for pascal triangle:")
p = input("enter any prime number u want:")
cnt = 0
line = [1]
for k in range(0, n):
line.append(line[k] * (n-k) / (k+1))
print line
lengths = map(lambda word: line[word]%p ==0, range(len(line))).count(True)
print lengths
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.