2016-09-01 4 views
-4

私は600851475143という最大の素因数を見つけたいと思っています。Pythonで大きな数字の素因数を取得する方法は?

ただし、のコードではrangeは無効です。数字が大きすぎます。

どうすればよいですか?それ以上の効率的なアルゴリズムはありますか?

list=[] 
for i in range(1,600851475144): 
    count = 0 
    if 600851475143 % i == 0: 
     for x in range(2,i): 
      if i % x == 0: 
       count+=1 
       print(count) 
     if count == 0: 
      list.append(i) 
     count=0 
print(list) 
+0

は[** 'continue' **]を参照してください(https://docs.python.org/3/tutorial/controlflow.html#break-and -continue-statements-and-else-clauses-on-loops)キーワードを使用してループを簡素化し、[** 'xrange' **](https://docs.python.org/2/library/functions.html)を使用します#xrange)を** 'range' **の代わりに使用します。 –

答えて

-1

これが行います。

def PrimeFactor(n): 
    m = n 
    while n%2==0: 
     n = n//2 
    if n == 1:   # check if only 2 is largest Prime Factor 
     return 2 
    i = 3 
    sqrt = int(m**(0.5)) # loop till square root of number 
    last = 0    # to store last prime Factor i.e. Largest Prime Factor 
    while i <= sqrt : 
     while n%i == 0: 
      n = n//i  # reduce the number by dividing it by it's Prime Factor 
      last = i 
     i+=2 
    if n> last:   # the remaining number(n) is also Factor of number 
     return n 
    else: 
     return last 
print(PrimeFactor(int(input()))) 
+0

ありがとうございました!できます!しかし私はなぜsqrtを使うのか理解できません。数学的なテクニックですか? – KYH

+0

@KYH:*平方根に到達した後*をチェックする必要がありますか?その後、すべてのa * b結果に対して、 'a'は' sqrt(target) 'より大きくなり、 'b'は小さくなるでしょう。しかし、最初の '半分'の 'b'の値をすべてチェックしました。これは' a'です! – usr2564301

+0

@KYH:チェック番号が素数であるか、効率的な時間のために数値の平方根までチェックしていないので、これもここで適用できます。また、上記のコメント(Rad Lexus) –

関連する問題