使用筛子找到除数的数量,但仅限n ^ 2

时间:2012-04-16 13:14:07

标签: python

通常我使用以下代码来查找给定n(tau函数)之前的除数数:

L=[0 for i in range(N+1)]
for i in range(1,N+1):
    for j in range(i, N+1,i):
        L[j]+=1
print L

哪个输出

[0, 1, 2, 2, 3, 2, 4, 2, 4, 3, 4]

但是如果我想输出n ^ 2的除数呢?现在它正在看n = 0,1,2,3,4,5,6,7,8,9,10,但我想改变它所以它实际上看着0,1,4,9,16, 25,36,49,64,81,100(不需要乱用任何其他数字)。

输出应如下所示:

[0, 1, 3, 3, 5, 3, 9, 3, 7, 5, 9]

3 个答案:

答案 0 :(得分:2)

根据n的大小,Nolen的回答可能就足够了(公平地说,您的原始代码未经优化开始)。但是,值得注意的是n**2 。如果我们可以对一个数字进行因式分解,比如说10,我们就会得到:

10    = (2**1)*(5**1)
10**2 = (2**(1+1))*(5**(1+1)) = (2**2)*(5**2)

即。素数分解中指数中的数字只是两倍。假设您已经可以找到数字n的主要因子分解(您的代码可以被修改),可以通过(伪代码)<{1}}找到除数的数量

n**2

如果我们为div := (list of divisors of n) div2 := (a list with two copies of div) loop through all combinations div2: if combo <= sqrt(n): keep unique 执行此操作,我们会得到:

10

div := (1,2,5,10) div2 := (1,2,5,10,1,2,5,10) keep := (1,2,5,10,2*2,2*5) unique_keep := (1,2,4,5,10) 中的每个数字都分为unique_keep,因此它们也有相应的因子,除了10的奇异情况,这是它自己的因素。这给出了九个除数:

10**2=100

答案 1 :(得分:0)

我相信你想要这样的东西?

>>> [sum(i**2 % j == 0 for j in range(1, i**2 + 1)) for i in range(11)]
[0, 1, 3, 3, 5, 3, 9, 3, 7, 5, 9]

或者更一般地说

>>> def divisors(start, end, trans=lambda x:x):
...     return [sum(i % j == 0 for j in range(1, i + 1)) for i in (trans(t) for t in range(start, end+1))]
... 
>>> divisors(0, 10, lambda x: x**2)
[0, 1, 3, 3, 5, 3, 9, 3, 7, 5, 9]
>>> divisors(0, 10)
[0, 1, 2, 2, 3, 2, 4, 2, 4, 3, 4]

答案 2 :(得分:0)

如果你有一个数字的素因子,那么计算它所具有的因子的数量就像计算它的平方因子(或者实际上是任何幂)一样容易。

def factor_count(N,power):
    factor_count = list()
    for n in range(N+1):
        prime = 2
        prime_factors = list()
        exponents = list()
        while n > 1:
            while (n / prime) % 1 == 0:
                if prime not in prime_factors:
                    prime_factors.append(prime)
                    exponents.append(1)
                else:
                    exponent = exponents.pop()+1
                    exponents.append(exponent)
                n /= prime
            prime += 1
        factors = 1
        for x in exponents:
            factors *= power*x+1
        factor_count.append(factors)
    print(factor_count)

另外,我会注意到我的程序与你的程序有多少不同。修改代码来解释这一点很简单,但由于除数通常是在自然数上定义的,所以完全忽略它也同样容易。

为了让您了解这与其他答案相比有多高效:

power_factors(1000,2000000000)                                        #evaluates almost instantly despite having an exponent of 2 billion
[sum(i**2 % j == 0 for j in range(1, i**2 + 1)) for i in range(1001)] #I got fed up of waiting before it managed to finish even with just an exponent of 2