将一段C ++翻译成Python

时间:2012-08-20 12:01:05

标签: c++ python

我正在尝试将一些C ++转换为Python。

可以在

找到C ++

https://gist.github.com/1635288

from prime import prime
from fractions import gcd
from copy import copy
def phi(n, primes):
    if n < 2:
        return 0

    if n in primes:
        return n - 1

    if (n & 1) == 0:
        m = n >> 1
        #return ~(m & 1) ? phi(m, primes) << 1 : phi(m, primes)
        if ~(m & 1):
            return phi(m, primes) << 1
        else:
            return phi(m, primes)

    for i in primes:
        if i > n:
            break

        if n % i:
            continue

        m = copy(i)
        o = n / m
        d = gcd(m, o)
        #return d == 1 ? phi(m) * phi(o) : phi(m) * phi(o) * d / phi(d)
        if d == 1:
            return phi(m, primes) * phi(o, primes)
        else:
            return phi(m, primes) * phi(o, primes) * d / phi(d, primes)

primes = []
for i in range(3, 10000000, 2):
    if prime(i):
        primes.append(i)

for i in range(80, 90): # a test to see if I am getting correct results
    print phi(i, primes)
    # returns   64, 54, 80, 82, 48, 64, 84, 56, 80, 88
    # should be 32, 54, 40, 82, 24, 64, 42, 56, 40, 88

基本上,该函数返回奇数n的正确phi值,但返回偶数n的正确值的两倍。我怀疑我出错的地方是

m = copy(i)

而C ++是

int m = *p; 

我查了维基百科并看到这是定义m,因为值p是指向。这是问题吗?如果没有,那是什么?

2 个答案:

答案 0 :(得分:3)

我认为您应该使用if not (m & 1),而不是if ~(m & 1),因为前者是对奇数/偶数的检查,而后者只有在传递-1时才会返回false它。

Tilde(~)是按位求反运算符。对于整数值,它保持~x == -x-1,在您的情况下根本不会发生。

答案 1 :(得分:0)

int m = *p实际上调用了operator* p,它是一个迭代器。它将返回迭代器当前所在的整数。对于给定的C ++代码,这只是语法上的含糖(有一点性能改进),以避免每次都写*p*