2010/11/22

素数かどうかを判定し、素数でなかったらどの数で分解できるのか表示する

「Python Recipes」に戻る

Release:1.0
Date:November 22, 2010
テスト環境
OS: Ubuntu10.10

Python2.6.6

はじめに

素数をどれだけ速く導き出せるかに挑戦したかったのですが、途中で挫折しました。
人の作ったアルゴリズムを使うので精一杯です。
xrange(2, 10000)

のところと

if 0 not in (x % y for y in xrange(2, x))

を工夫できればもっと速くなりますきっと。

これに気づかれたsuztomoさんはとてもすごいです。自分ももっと頑張ろう。

また時間ができたら書き直します。

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/env python
 #-*- coding:utf-8 -*-
 # Author: Iyori Komiyama
 # Contact: hazimarino@gmail.co.jp
 # site: http://hazimarino.blogspot.com/
 """\
 素数かどうかを判定し、素数でなかったらどの数で分解できるのか表示する
 9973 の素数で分解できる範囲まで。
 """
 from __future__ import unicode_literals

 def enter():
     while True:
         try:
             digits = int(raw_input('Please input a number>> '))
             if digits < 0: raise
         except ValueError:
             print("正の整数を入力してください")
         else: return digits

 def primes(value):
     p_nums = (x for x in xrange(2, 10000)
               if 0 not in (x % y for y in xrange(2, x)))
     if (value == 1) or (value == 0):
         print("{0} は素数ではありません".format(value))
         return
     for p in p_nums:
         if value == p:
             print("{0} は素数です".format(value))
             return
         elif not value % p:
             print("{0} は素数ではありません: " \
                   "{1} x {2}".format(value, value / p, p))
             return
     else:
         print("数値が大きすぎます")

 def main():
     print('素数かどうかを判定します')
     print('*' * 80)
     num = enter()
     print('*' * 80)
     primes(num)

 if __name__ == '__main__':
     main()

gist


参考・引用

suztomoの日記 –pythonのリスト内包で素数のリストを作る

「Python Recipes」に戻る

0 件のコメント:

コメントを投稿