📜  门| GATE-CS-2016(套装1)|问题 27(1)

📅  最后修改于: 2023-12-03 15:12:43.374000             🧑  作者: Mango

问题 27:优化函数

该问题要求我们优化给定的代码片段,并找出最终输出的值。首先,我们看一下代码片段:

def func(n):
    res = n
    for i in range(2, n):
        if (n % i == 0):
            res -= res / i
    return res

print(func(12))

在这个代码片段中,给定一个正整数n,函数func(n)首先初始化一个变量res为n。然后,代码片段进入一个循环中,该循环从2到(n-1)遍历每个数,如果当前数能整除n,则res减去(res/i),即res取得它本身减去n的质因数个数计算得到的值。最后函数返回res。

我们可以优化这段代码,具体做法是使用欧拉函数。欧拉函数φ(n)是小于等于n的正整数中与n互质的数的数目。当n为质数时,φ(n)与(n-1)相等;当n为合数时,φ(n)等于每个质因数p的欧拉函数φ(p)相乘。

因此,根据欧拉函数的性质,我们可以改写代码片段如下:

def phi(n):
    res = n
    i = 2
    while i*i <= n:
        if (n % i == 0):
            res -= res / i
            while (n % i == 0):
                n /= i
        i += 1
    if (n > 1): # n为质数
        res -= res / n
    return res

def func(n):
    return phi(n)

print(func(12))

在这个修改后的代码片段中,我们首先定义了一个欧拉函数phi(n),并使用变量i从2开始,遍历质因数i,并通过while循环找出每个质因数的个数,然后计算出欧拉函数的值,并返回该值。

最后,我们调用函数func(n)输出结果。此时,函数输出值与之前的代码片段相同,但使用了欧拉函数,可以提高代码的效率和性能。

返回的代码片段
def phi(n):
    res = n
    i = 2
    while i*i <= n:
        if (n % i == 0):
            res -= res / i
            while (n % i == 0):
                n /= i
        i += 1
    if (n > 1): # n为质数
        res -= res / n
    return res

def func(n):
    return phi(n)

print(func(12))
输出
4.0