Last active
October 16, 2016 08:22
-
-
Save mrdjohnson/f009f21072dd67637e015d7a4406ab33 to your computer and use it in GitHub Desktop.
A close win for finding the sum of the sum of all prime factors from 2-N the fastest
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # @timeit | |
| # the original one | |
| def get_prime_factor_sum(row): | |
| total = 0 | |
| primes = {} | |
| for prime_number in range(2, row + 1): | |
| if prime_number in primes: | |
| continue | |
| next_exponent = prime_number | |
| for prime_multiple in range(prime_number, row + 1, prime_number): | |
| if prime_multiple not in primes: | |
| primes[prime_multiple] = False | |
| if prime_multiple == next_exponent: | |
| total += prime_number * (row // prime_multiple) | |
| next_exponent *= prime_number | |
| return total | |
| # the newer better version | |
| def get_prime_factor_sum_2(row): | |
| total = handle_evens(row) | |
| primes = {} | |
| for prime_number in range(3, row + 1, 2): | |
| if prime_number in primes: | |
| continue | |
| next_exponent = prime_number | |
| step = prime_number * 2 | |
| for prime_multiple in range(prime_number, row + 1, step): | |
| if prime_multiple not in primes: | |
| primes[prime_multiple] = False | |
| if prime_multiple == next_exponent: | |
| total += prime_number * (row // prime_multiple) | |
| next_exponent *= prime_number | |
| return total | |
| def handle_evens(row): | |
| next_exponent = 2 | |
| total = 0 | |
| while next_exponent <= row: | |
| total += 2 * (row // next_exponent) | |
| next_exponent *= 2 | |
| return total | |
| print(get_prime_factor_sum_2(1000000)) | |
| #broken_bitset_attempt | |
| def get_prime_factor_sum_3(row): | |
| total = handle_evens(row) | |
| primes = 0 | |
| for prime_number in range(3, row + 1, 2): | |
| if (prime_number & ( 1 << primes)) > 0: | |
| continue | |
| next_exponent = prime_number | |
| step = prime_number * 2 | |
| for prime_multiple in range(prime_number, row + 1, step): | |
| if (prime_multiple & ( 1 << primes)) > 0: | |
| primes |= (1 << prime_multiple) | |
| if prime_multiple == next_exponent: | |
| total += prime_number * (row // prime_multiple) | |
| next_exponent *= prime_number | |
| return total |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment