Быстро определить, является ли число в Python простым для чисел <1 миллиарда

Мой текущий алгоритм проверки простоты чисел в python замедляет работу для чисел от 10 до 1 миллиарда. Я хочу, чтобы его улучшили, зная, что я никогда не получу числа больше 1 миллиарда.

Контекст таков, что я могу » Я получаю реализацию, достаточно быструю для решения проблемы 60 проекта Эйлера: я получаю ответ на проблему за 75 секунд, а мне он нужен за 60 секунд. http://projecteuler.net/index.php?section=problems&id=60

У меня очень мало памяти, поэтому я не могу хранить все простые числа меньше 1 миллиарда.

Я ' м в настоящее время используется стандартное пробное деление с настройкой 6k ± 1. Что может быть лучше этого? Мне уже нужен метод Рабина-Миллера для таких больших чисел.

primes_under_100 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
def isprime(n):
    if n <= 100:
        return n in primes_under_100
    if n % 2 == 0 or n % 3 == 0:
        return False

    for f in range(5, int(n ** .5), 6):
        if n % f == 0 or n % (f + 2) == 0:
            return False
    return True

Как я могу улучшить этот алгоритм?

Точность: Я новичок в python и хотел бы работать только с python 3+.


Окончательный код

Для тех, кому интересно, используя идеи MAK, я сгенерировал следующий код, который примерно на 1/3 быстрее, int x; х = d * 10; printf ("\ n \ n VALUE =% d", x); У меня gcc 4.3.3, который поставляется с Ubuntu 9.04. Я получаю ответ как 13 с -O0, но получаю правильный ответ, т.е. ...

У меня есть следующая программа на C

double d = 1.4;
int x;
x = d * 10;
printf("\n\n VALUE = %d " ,x);

У меня есть gcc 4.3.3, которая поставляется с Ubuntu 9.04

Я получаю 13 с -O0, но получаю правильный ответ, например 14 с более высоким уровнем оптимизации.

Это известная проблема или что-то не так с моим кодом?

5
задан phuclv 14 January 2018 в 03:39
поделиться