0

一部の 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 が偶数の場合は正しい値の 2 倍を返します。私が間違っているところは

m = copy(i)

一方、C++ は

int m = *p; 

ウィキペディアを調べたところ、これが p が指している値として m を定義していることがわかりました。これが問題ですか?そうでない場合、何ですか?

4

2 に答える 2

3

前者は奇数/偶数のチェックであり、後者は-1を渡した場合にのみ返されるためif not (m & 1)、ではなく、を使用する必要があると思います。if ~(m & 1)false

チルダ(~)はビット単位の否定演算子です。整数値の場合、それはそれを保持し~x == -x-1ますが、あなたの場合はまったく起こりません。

于 2012-08-20T12:11:52.003 に答える
0

int m = *p実際には、イテレータであるoperator*のを呼び出します。pイテレータが現在オンになっている整数を返します。与えられたC++コードの場合、これは構文上の糖分であり(パフォーマンスが少し向上します)、*p*毎回の書き込みを回避します。

于 2012-08-20T12:10:06.020 に答える