Skip to main content
deleted 106 characters in body
Source Link
Graipher
  • 41.7k
  • 7
  • 70
  • 134
def goldbach_keep_index(number):
    if number % 2 == 01: #Only even numbers
        raise ValueError("Goldbach conjecture is only defined for even numbers")
    primes = primenums(number) #returns all prime numbers <= input number
        i, j = 0, 0
        addend1 = primes[i]
        addend2 = primes[j]
    
        while addend1 + addend2 != number:
            if addend2 == primes[-1]:
                i = j = i + 1
                addend2 = primes[i]
                addend1 = primes[i]
            else:
                j += 1
                addend2 = primes[j]
        return addend1, addend2
    raise ValueError("Goldbach conjecture is only defined for even numbers")
from itertools import combinations_with_replacement

def goldbach_combinations(number):
    if number % 2 == 0:
        raise ValueError("Goldbach conjecture is only defined for even numbers")
    primes = primenums(number)
        for addend1, addend2 in combinations_with_replacement(primes, 2):
            if addend1 + addend2 == number:
                return addend1, addend2
        raise Exception(f"Found a counter-example to the Goldbach conjecture: {number}")
    raise ValueError("Goldbach conjecture is only defined for even numbers")
def goldbach_set(number):
    if number % 2 == 0: #Only even numbers
        raise ValueError("Goldbach conjecture is only defined for even numbers")
    primes = set(primenums(number)) #returns all prime numbers <= input number
        for p in primes:
            k = number - p
            if k in primes:
                return p, k
        raise Exception(f"Found a counter-example to the Goldbach conjecture: {number}")
    raise ValueError("Goldbach conjecture is only defined for even numbers")
def goldbach(number):
    if number % 2 == 0: #Only even numbers
        raise ValueError("Goldbach conjecture is only defined for even numbers")
    primes = primenums(number) #returns all prime numbers <= input number
        addend1 = primes[0]
        addend2 = primes[0]
    
        while addend1 + addend2 != number:
            if primes[-1] == addend2:
                addend2 = primes[primes.index(addend1) + 1]
                addend1 = primes[primes.index(addend1) + 1]
            else:
                addend2 = primes[primes.index(addend2) + 1]
        return addend1, addend2
    raise ValueError("Goldbach conjecture is only defined for even numbers")
def goldbach_keep_index(number):
    if number % 2 == 0: #Only even numbers
        primes = primenums(number) #returns all prime numbers <= input number
        i, j = 0, 0
        addend1 = primes[i]
        addend2 = primes[j]
    
        while addend1 + addend2 != number:
            if addend2 == primes[-1]:
                i = j = i + 1
                addend2 = primes[i]
                addend1 = primes[i]
            else:
                j += 1
                addend2 = primes[j]
        return addend1, addend2
    raise ValueError("Goldbach conjecture is only defined for even numbers")
from itertools import combinations_with_replacement

def goldbach_combinations(number):
    if number % 2 == 0:
        primes = primenums(number)
        for addend1, addend2 in combinations_with_replacement(primes, 2):
            if addend1 + addend2 == number:
                return addend1, addend2
        raise Exception(f"Found a counter-example to the Goldbach conjecture: {number}")
    raise ValueError("Goldbach conjecture is only defined for even numbers")
def goldbach_set(number):
    if number % 2 == 0: #Only even numbers
        primes = set(primenums(number)) #returns all prime numbers <= input number
        for p in primes:
            k = number - p
            if k in primes:
                return p, k
        raise Exception(f"Found a counter-example to the Goldbach conjecture: {number}")
    raise ValueError("Goldbach conjecture is only defined for even numbers")
def goldbach(number):
    if number % 2 == 0: #Only even numbers
        primes = primenums(number) #returns all prime numbers <= input number
        addend1 = primes[0]
        addend2 = primes[0]
    
        while addend1 + addend2 != number:
            if primes[-1] == addend2:
                addend2 = primes[primes.index(addend1) + 1]
                addend1 = primes[primes.index(addend1) + 1]
            else:
                addend2 = primes[primes.index(addend2) + 1]
        return addend1, addend2
    raise ValueError("Goldbach conjecture is only defined for even numbers")
def goldbach_keep_index(number):
    if number % 2 == 1: #Only even numbers
        raise ValueError("Goldbach conjecture is only defined for even numbers")
    primes = primenums(number) #returns all prime numbers <= input number
    i, j = 0, 0
    addend1 = primes[i]
    addend2 = primes[j]
    
    while addend1 + addend2 != number:
        if addend2 == primes[-1]:
            i = j = i + 1
            addend2 = primes[i]
            addend1 = primes[i]
        else:
            j += 1
            addend2 = primes[j]
    return addend1, addend2
    
from itertools import combinations_with_replacement

def goldbach_combinations(number):
    if number % 2 == 0:
        raise ValueError("Goldbach conjecture is only defined for even numbers")
    primes = primenums(number)
    for addend1, addend2 in combinations_with_replacement(primes, 2):
        if addend1 + addend2 == number:
            return addend1, addend2
    raise Exception(f"Found a counter-example to the Goldbach conjecture: {number}")
def goldbach_set(number):
    if number % 2 == 0: #Only even numbers
        raise ValueError("Goldbach conjecture is only defined for even numbers")
    primes = set(primenums(number)) #returns all prime numbers <= input number
    for p in primes:
        k = number - p
        if k in primes:
            return p, k
    raise Exception(f"Found a counter-example to the Goldbach conjecture: {number}")
def goldbach(number):
    if number % 2 == 0: #Only even numbers
        raise ValueError("Goldbach conjecture is only defined for even numbers")
    primes = primenums(number) #returns all prime numbers <= input number
    addend1 = primes[0]
    addend2 = primes[0]
    
    while addend1 + addend2 != number:
        if primes[-1] == addend2:
            addend2 = primes[primes.index(addend1) + 1]
            addend1 = primes[primes.index(addend1) + 1]
        else:
            addend2 = primes[primes.index(addend2) + 1]
    return addend1, addend2
added 207 characters in body
Source Link
Graipher
  • 41.7k
  • 7
  • 70
  • 134
from itertools import combinations_with_replacement

def goldbach_combinations(number):
    if number % 2 == 0:
        primes = primenums(number)
        for addend1, addend2 in combinations_with_replacement(primes, 2):
            if addend1 + addend2 == number:
                return addend1, addend2
        raise Exception(f"Found a counter-example to the Goldbach conjecture: {number}")
    raise ValueError("Goldbach conjecture is only defined for even numbers")
def goldbach_set(number):
    if number % 2 == 0: #Only even numbers
        primes = set(primenums(number)) #returns all prime numbers <= input number
        for p in primes:
            k = number - p
            if k in primes:
                return p, k
        raise Exception(f"Found a counter-example to the Goldbach conjecture: {number}")
    raise ValueError("Goldbach conjecture is only defined for even numbers")
from itertools import combinations_with_replacement

def goldbach_combinations(number):
    if number % 2 == 0:
        primes = primenums(number)
        for addend1, addend2 in combinations_with_replacement(primes, 2):
            if addend1 + addend2 == number:
                return addend1, addend2
    raise ValueError("Goldbach conjecture is only defined for even numbers")
def goldbach_set(number):
    if number % 2 == 0: #Only even numbers
        primes = set(primenums(number)) #returns all prime numbers <= input number
        for p in primes:
            k = number - p
            if k in primes:
                return p, k
    raise ValueError("Goldbach conjecture is only defined for even numbers")
from itertools import combinations_with_replacement

def goldbach_combinations(number):
    if number % 2 == 0:
        primes = primenums(number)
        for addend1, addend2 in combinations_with_replacement(primes, 2):
            if addend1 + addend2 == number:
                return addend1, addend2
        raise Exception(f"Found a counter-example to the Goldbach conjecture: {number}")
    raise ValueError("Goldbach conjecture is only defined for even numbers")
def goldbach_set(number):
    if number % 2 == 0: #Only even numbers
        primes = set(primenums(number)) #returns all prime numbers <= input number
        for p in primes:
            k = number - p
            if k in primes:
                return p, k
        raise Exception(f"Found a counter-example to the Goldbach conjecture: {number}")
    raise ValueError("Goldbach conjecture is only defined for even numbers")
added 1435 characters in body
Source Link
Graipher
  • 41.7k
  • 7
  • 70
  • 134

In this case primes does not even need to be a list, it can just be a generator.

def goldbach(number):
    if number % 2 == 0: #Only even numbers
        primes = primenums(number) #returns all prime numbers <= input number
        addend1 = primes[0]
        addend2 = primes[0]
    
        while addend1 + addend2 != number:
            if primes[-1] == addend2:
                addend2 = primes[primes.index(addend1) + 1]
                addend1 = primes[primes.index(addend1) + 1]
            else:
                addend2 = primes[primes.index(addend2) + 1]
        return addend1, addend2
    raise ValueError("Goldbach conjecture is only defined for even numbers")

And primenums is a simple sieve:

def prime_sieve(limit):
    prime = [True] * limit
    prime[0] = prime[1] = False

    for i, is_prime in enumerate(prime):
        if is_prime:
            yield i
            for n in range(i * i, limit, i):
                prime[n] = False

def primenums(limit):
    return list(prime_sieve(limit))

enter image description here

And when pulling the generation of the primes outside of the function (and calculating them up to the largest number in the plot):

enter image description here

Of course the first three functions are vastly slower than the set because they need to go through more combinations now. However, all functions are then constant time, so the increase in time comes solely from the fact that you have to consider more primes.

def goldbach(number):
    if number % 2 == 0: #Only even numbers
        primes = primenums(number) #returns all prime numbers <= input number
        addend1 = primes[0]
        addend2 = primes[0]
    
        while addend1 + addend2 != number:
            if primes[-1] == addend2:
                addend2 = primes[primes.index(addend1) + 1]
                addend1 = primes[primes.index(addend1) + 1]
            else:
                addend2 = primes[primes.index(addend2) + 1]
        return addend1, addend2
    raise ValueError("Goldbach conjecture is only defined for even numbers")

enter image description here

In this case primes does not even need to be a list, it can just be a generator.

def goldbach(number):
    if number % 2 == 0: #Only even numbers
        primes = primenums(number) #returns all prime numbers <= input number
        addend1 = primes[0]
        addend2 = primes[0]
    
        while addend1 + addend2 != number:
            if primes[-1] == addend2:
                addend2 = primes[primes.index(addend1) + 1]
                addend1 = primes[primes.index(addend1) + 1]
            else:
                addend2 = primes[primes.index(addend2) + 1]
        return addend1, addend2
    raise ValueError("Goldbach conjecture is only defined for even numbers")

And primenums is a simple sieve:

def prime_sieve(limit):
    prime = [True] * limit
    prime[0] = prime[1] = False

    for i, is_prime in enumerate(prime):
        if is_prime:
            yield i
            for n in range(i * i, limit, i):
                prime[n] = False

def primenums(limit):
    return list(prime_sieve(limit))

enter image description here

And when pulling the generation of the primes outside of the function (and calculating them up to the largest number in the plot):

enter image description here

Of course the first three functions are vastly slower than the set because they need to go through more combinations now. However, all functions are then constant time, so the increase in time comes solely from the fact that you have to consider more primes.

added 1435 characters in body
Source Link
Graipher
  • 41.7k
  • 7
  • 70
  • 134
Loading
added 15 characters in body
Source Link
Graipher
  • 41.7k
  • 7
  • 70
  • 134
Loading
Source Link
Graipher
  • 41.7k
  • 7
  • 70
  • 134
Loading