了解分解函数

时间:2010-07-17 21:37:17

标签: python math

请注意,此问题包含一些剧透。

solution for problem #12表示

  

“除数(包括1和数字本身)可以从素数(和幂)除数中取一个元素来计算。”

它执行此操作的(python)代码是num_factors = lambda x: mul((exp+1) for (base, exp) in factorize(x))(其中mul()reduce(operator.mul, ...)。)

它没有说明factorize是如何定义的,而且我无法理解它是如何工作的。它如何告诉你这个数字的因素数量?

2 个答案:

答案 0 :(得分:12)

基本思想是,如果您将一个数字分解为以下形式,实际上是标准形式:

let p be a prime and e be the exponent of the prime:

N = p1^e1 * p2^e2 *....* pk^ek

现在,要知道N有多少除数,我们必须考虑每个素数因子的组合。所以你可以说除数的数量是:

e1 * e2 * e3 *...* ek

但是你必须注意到,如果一个素因子的标准形式的指数为零,那么结果也将是一个除数。这意味着,我们必须为每个指数添加一个,以确保我们将第i个p包含在零的幂中。以下是使用数字12的示例 - 与问题编号相同:D

Let N = 12
Then, the prime factors are:
2^2 * 3^1
The divisors are the multiplicative combinations of these factors. Then, we have:
2^0 * 3^0 = 1
2^1 * 3^0 = 2
2^2 * 3^0 = 4
2^0 * 3^1 = 3
2^1 * 3^1 = 6
2^2 * 3^1 = 12

我希望你现在看到为什么我们在计算除数时给指数加一个。

答案 1 :(得分:2)

我不是Python专家,但是为了计算除数的数量,你需要对数字进行素数分解。

公式很简单:在每个素数除数的指数中加一,并乘以它们。

示例:

12 = 2 ^ 2 * 3 ^ 1 - >指数是2和1,加1是3和2,3 * 2 = 6除数(1,2,3,4,6,12)

30 = 2 ^ 1 * 3 ^ 1 * 5 ^ 1 - >指数是1,1和1,加上一个是2,2和2,2 * 2 * 2 = 8个除数(1,2,3,5,6,10,15,30)

40 = 2 ^ 3 * 5 ^ 1 - >指数是3和1,加上一个是4和2,4 * 2 = 8个除数(1,2,4,5,8,10,20,40)