Euler project 46

わりと糞なコードなので、恥ずかしい。

#-*- coding:utf-8 -*-
import random

def is_prime3(q,k=50):
    q = abs(q)
    #計算するまでもなく判定できるものははじく
    if q == 2: return True
    if q < 2 or q&1 == 0: return False
    #n-1=2^s*dとし(但しaは整数、dは奇数)、dを求める
    d = (q-1)>>1
    while d&1 == 0:
        d >>= 1
    #判定をk回繰り返す
    for i in xrange(k):
        a = random.randint(1,q-1)
        t = d
        y = pow(a,t,q)
        #[0,s-1]の範囲すべてをチェック
        while t != q-1 and y != 1 and y != q-1: 
            y = pow(y,2,q)
            t <<= 1
        if y != q-1 and t&1 == 0:
            return False
    return True

def Euler46():
	Noprime_list = []
	prime_list = []
	N = 10000
	#奇数であるものをリスト化する		
	#7以上の奇数で素数でないものをリスト化する
	for i in xrange(7,N,2):
		if is_prime3(i) == False:
			Noprime_list.append(i)
		else:
			prime_list.append(i)
					
	for i in Noprime_list:
		#判定変数
		judge = 0
		#Composite number
		CN = i
		square_list = []
		#元の素数を越えない平方数の2倍の配列を作成
		for j in xrange(1,CN):
			a = 2*j**2
			if a < CN:
				square_list.append(a)
		#奇合成数を探索する
		for k in prime_list:
			for l in square_list:
				#探索したらループを終了
				if k + l == i:
					judge = 1
					break
		if judge == 0:
			min_sum = i
			break
	print min_sum

def main():
	Euler46()
if __name__=="__main__":
	main()