可以被行中的素数整除为pascal三角形的数字的数量

时间:2014-03-20 06:04:10

标签: python algorithm primes factorial

如何找到一个pascal三角形的给定行数中的数字总数,该三角形可以被一个素数整除,其中给出了行号和素数 我在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

但是给定代码需要很长时间才能获得大数字。 能否请你建议一个更好的算法。

6 个答案:

答案 0 :(得分:6)

来自Luca's theorem的一个推论表明,素数p 不可分割的二项式系数C(n,k)的数量是 (a₁+1)⋅(a₂+1)⋅...⋅(am+1),其中 i 是p-ary 数字系统中n 的第i位。

示例:

p = 3, n = 7dec = 213
Result = (2+1)⋅(1+1) = 6

Pascal三角形的第7行是1 7 21 35 35 21 7 1,它包含6个不能被3整除的系数,剩下的两个系数可以被3整除。

答案 1 :(得分:3)

您无需计算二项式系数(n,r)

计算pn!r!(n-r)!的频率,并检查n!是否有比{2}更多的因素p togeter。

// 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

这可以避免大数字并减少操作。

这会检查(n,r) = 0 mod p中的O(log(n)),而不计算因子。但计算一行需要O(n log n)

您还可以使用(n,r)的对称性加快速度。仅计算上半部分并将其乘以2。如果n是偶数,则必须计算上半部分中间r = n/2,并检查在乘以2之后添加中间数。

您可以为所有count_p_in_fac(i,p)预先计算i

答案 2 :(得分:1)

您可以在不需要计算阶乘的情况下重写组合函数。 (n, r)可以递归写为

(n, r) = (n-1, r) + (n-1, r-1)

现在我们应该找到基本情况。这些是:

(n, 1) = n
(n, 0) = 1
(n, n) = 1

在这里,我们假设nr是非负整数,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

答案 3 :(得分:1)

你不可能在不到一秒的时间内做10 ^ 12。帕斯卡尔三角区必须有一些属性才能让这更容易......如果可能的话

  

帕斯卡三角形的另一个有趣特性是连续p   其中p是素数,除1之外的那一行中的所有项都是   p的倍数。这很容易证明,因为如果p \ in \ mathbb {P},   然后p除了1和它本身没有因素。每个条目   三角形是一个整数,因此根据定义(p-k)!和k!是   因素p!\,。但是,p本身无法表现出来   在分母中,因此p(或其中的一些倍数)必须是   留在分子中,使整个条目成为p的倍数。

这可能与该结果有关(来自维基页面http://en.wikipedia.org/wiki/Pascal%27s_triangle)..如果这有答案(即如果它是一些教授给你的大学作业)。

请参阅此处https://mathoverflow.net/questions/9181/pascal-triangle-and-prime-numbers

(我喜欢这个问题 - 我不确定这是一个编程问题。)

答案 4 :(得分:1)

谢谢大家回答像我这样的菜鸟问题 这是一个有效的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

答案 5 :(得分:0)

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