通常我使用以下代码来查找给定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]
答案 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