* Computer Science/Project Euler

project euler 46. problem

soicem 2016. 12. 9. 13:55

 크리스티안 골드바흐는 모든 홀수인 합성수를 (소수 + 2×제곱수)로 나타낼 수 있다고 주장했습니다.

9 = 7 + 2×12
15 = 7 + 2×22
21 = 3 + 2×32
25 = 7 + 2×32
27 = 19 + 2×22
33 = 31 + 2×12

이 추측은 잘못되었음이 밝혀졌습니다.

위와 같은 방법으로 나타낼 수 없는 가장 작은 홀수 합성수는 얼마입니까?



 합성수를 소수로 + 2 x 제곱수로 나타내는 증명이 잘못 되었음을 밝히기 위해선 크게 2가지 과정이 필요하다 생각했습니다.
 첫 째, 합성수 셋을 만든다.
 둘 째, 주어진 합성수를 특정 조건에 대입하여 거짓인지 증명한다.

 합성수의 조건은 "소수가 아니며, 모두 홀수이어야 한다" 이고, 그 증명 방법에는 합성수를 만들때 사용한 합성수 이하 범위를 가지는 소수들과 제곱수를 합성수와 비교하면 됩니다.
 

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
47
48
49
50
51
def isPrime(target):
    i=2
    while i<target:
        if target % i == 0:
            return False
        i+=1
    return True
 
def makeOddCompositeNumbersAndPrimeNumber(start, stop):
    numbers = range(start, stop)
    compositeNumbers = numbers
 
    primeNumbers = []
    for number in numbers:
        if isPrime(number):
            compositeNumbers.remove(number)
            primeNumbers.append(number)
 
    oddCompositeNumbers = []
    for compositeNumber in compositeNumbers:
        if compositeNumber % 2 == 1:
            oddCompositeNumbers.append(compositeNumber)
    
    return oddCompositeNumbers, primeNumbers
 
def proveOpinion(targets, primeSet):
    for target in targets:
        flag = False
        for prime in primeSet:
            i = 1
            if prime < target:
                while(True):
                    opinion = prime + 2 * i ** 2
                    if opinion == target:
                        print target, " = ", prime, " + 2 x ", i, "**2" 
                        flag = True
                        break
                    elif opinion > target:
                        break
                    i+=1
            elif prime > target:
                print "prime is ", prime, " / target is ", target
                return target
 
            if flag:
                break
 
 
oddCompositeNumbers, primeNumbers =  makeOddCompositeNumbersAndPrimeNumber(310000)
print proveOpinion(oddCompositeNumbers, primeNumbers)
 
cs

 

...

5765  =  563  + 2 x  51 **2

5767  =  149  + 2 x  53 **2

5769  =  151  + 2 x  53 **2

5771  =  569  + 2 x  51 **2

5773  =  571  + 2 x  51 **2

5775  =  157  + 2 x  53 **2

prime is  5779  / target is  5777

5777

'* Computer Science > Project Euler' 카테고리의 다른 글

project euler 52. problem  (0) 2016.11.14
project euler 41.problem  (0) 2016.10.20
project euler 44. problem  (0) 2016.10.18
project euler 37. problem  (0) 2016.10.13
project euler 43. problem  (0) 2016.10.05