繁体   English   中英

连续数可被质数除以帕斯卡三角形的数字数

[英]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 ip元数字系统中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

在这里,我们假设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

您不可能在一秒钟之内完成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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM