プロジェクトオイラー70トーティエント順列

オイラー関数\(\ varphi(n)が\ ) よりも小さく算出される(N \)\自然数と\(N- \)素数の数、例えば1、2、4、5、7、および8よりも小さいです9,9及び品質ので、\(\ varphi(9)。6 = \) 1は、そのすべての正の資質とみなされる\(\ varphi(1)= 1 \)

興味深いことに、\(\ varphi(87109)79180 = \) あなただけの79180の87109を並べ替える見ることができます。

そのようなAを求める(N- \)\、ここで\(1 <N- <10 ^ 7 \)、\ (\ varphi(N-)\)である\(N- \)転位および\(N / \ varphi(N ) \)最小。

分析:最後の質問は、私たちが聞いて\(N / \ varphi(nは )\) の最大\(\ n)の値が、しかし、この質問が必要です\(N / \ varphi(nは )\) 最小である\( N- \)の値。このような比率と\(N / \ varphi(n個 )\) 最大は、我々だけで、特定の範囲の番号を見つける必要があり、それが最大の素因数を持つことができます。その結果、比は対照的に\(N / \ varphi(N )\) 最小、品質の数は、この数はできるだけすべき要素。最初のケースは、その後数が素数、その後で、唯一の品質係数であり、\(\ varphi(N)1-N- = \)と仮定すると、\(N- \)の桁目\(D \)を、応じた数の\(C \)次に313で、例えば2〜3のように、\(D = 3、C = 2 \) 次いで\()\ \ varphi(N ) に対応する\(D \)数が数である\(1-C \) 二つの数字は、各可能な順列を構成するようになります。つまり、場合\(N- \)は素数であり、\(\ varphi(N-)\)\(N- \)は、各順列を構成することができません。

第二の場合は、(N \)\ 2個の素因数があり(P、Q \)\、次に\(N-PQ = \) あり、
\ [\ varphi(N-)PQ =(1- \ {FRAC 1} {P})(1-
\ FRAC {1} {Q})=(P-1)(Q-1)\] 素因数の数がさらに増加すると、\(N / \ varphi(N-)\)さらに増加するので、順番に\(N / \ varphi(N )\) 最小、\(N- \) 2つだけの素因数です。決定することは、(N- \)\などの2つだけ素因数、後\(N / \ varphi(N )\) 最小、\(\ varphi(N)\ ) 十分な大きさ、すなわち、であるべきである\(P、Q \ )十分な大きされるべきで\(N-PQ = <10。7 ^ \) これを確実にするために、我々べき\(\ SQRT {10 ^ 7 } \ approx3162 \) 両側に中心が間隔を決定拡張すると、この範囲の内部における異なる素数を選択する\(P、Q \) そのような\ (PQ <10 ^ 7 \)\(PQ \)\((P-1)( Q-1)\) 互いに再配置は、我々が選んだ、このような\(\ FRAC {PQ} { (P-1)(Q-1)} \) 最小\(P、Q \) 算出した\(PQは\)要求の対象です。

# time cost = 47.4 ms ± 847 µs

from sympy import primerange

def main():
    is_permutation = lambda x,y : "".join(sorted(str(x))) == "".join(sorted(str(y)))
    primes = list(primerange(2000,4000))
    dt = {(x*y,(x-1)*(y-1)):((x*y)/((x-1)*(y-1))) for x in primes for y in primes if x*y<10**7}
    for n,phi_n in sorted(dt,key=dt.get):
        if is_permutation(n,phi_n):
            return n

おすすめ

転載: www.cnblogs.com/metaquant/p/11975910.html