Created
November 24, 2018 18:01
-
-
Save Maharramoff/56fbe131cabf3971023dcde3f4ad2e7e to your computer and use it in GitHub Desktop.
Updated Version
This file contains 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
import math | |
def countSophieGermain(n, num = 0): | |
# Cüt olmayan ədədlərin potensial Sophie Germain ola biləcəyi üçün, n + 1 edirik. | |
n += 1 if n % 2 != 0 or n == 2 else 0 | |
size = (n * 2 + 1) | |
array = [True] * size | |
# N < 5 olduqda cavabı dərhal qaytarırıq. | |
array[0] = array[1] = array[4] = False | |
if(n < 5): | |
return array[:n].count(True) | |
# Maraqlı məqam. 6-dan etibarən bütün cüt ədədləri dərhal false edirək massivi artıq elementlərdən azad edirik. | |
for i in range(6, n, 2): | |
array[i] = False | |
# Cütləri dərhal çıxdaş etdik deyə, sadəcə 3-dən başlayaraq ancaq tək ədədləri yoxlamaq kifayət edir. | |
for i in range(3, int(math.sqrt(size)), 2): | |
if array[i]: | |
for j in range (i * i, size, i * 2): | |
array[j] = False | |
# Daha bir maraqlı məqam. 5-dən başlayaraq bütün sadə ədədlər mütləq 6n+1 və 6n-1 şərtini ödəyən ədədlərdir. Ona görə də steplərin sayını azalda bilərik. | |
v = 2 | |
i = 5 | |
while (i < n): | |
if array[i] and array[2 * i + 1]: | |
num += 1 | |
i += v | |
v ^= 6 # və ya v = 6 - v | |
return num + 2 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment