Можно ли снизить общую точность в Python?

#python-3.x

#python-3.x

Вопрос:

Я создаю программу для вычисления простых чисел, и я смотрю на оставшуюся часть возможного простого числа, которое я тестирую, и на все простые числа, которые у меня есть на данный момент, но остановлюсь, если дойду до точки, где я сравниваю PossPrime с чем-либо выше его квадратного корня. (Я могу объяснить это, если это необходимо). Меня не волнуют никакие цифры после десятичной запятой в sqrt; есть ли способ сказать Python, чтобы он не утруждал себя их вычислением?

И есть ли способ интегрировать этот аспект (только тестирование простых чисел под ним, пока я не доберусь до sqrt) в for цикл?

   #There's some boring setup before here that isn't problematic.
while True:
    PossWasDivis = False  #initialize the var (used to convey if the possible prime was divis)

    sqrtP = int(sqrt(PossPrime))
    for iterationOfArray in range(2, sqrtP):

       # print ("Comparing: (", PossPrime, "% (", GlobPrimeList [iterationOfArray],")) == 0")
        if (PossPrime % (GlobPrimeList [iterationOfArray])) == 0:
       #     print(PossPrime, "was divisable by", GlobPrimeList[iterationOfArray],"!  Breaking for loop")
            PossWasDivis = True
            break
        if (GlobPrimeList [iterationOfArray]) > sqrtP:
            break

    if PossWasDivis == False:    # Occurs when none of the tested #s are divis
        GlobPrimeList.append (PossPrime)
        f.write(str(PossPrime) 'n')

    #Switch between incramenting PossPrime between 2 and 4
    if PossPrimeStat == 2:
        PossPrimeStat = 4
        PossPrime  = 4
    else:                 # if PossPrimeStat == 4:
        PossPrimeStat = 2
        PossPrime  = 2
  

В GlobPrimeList для начала предварительно загружено несколько простых чисел, и он продолжает находить больше до бесконечности, пока я не отменю программу.

Комментарии:

1. 1. Нет, зачем нужна функция для вычисления квадратного корня только для целых чисел? 2. Что вы имеете в виду? Это уже то, что вы for перебираете.

2. Я совершенно уверен, что время цикла будет доминировать в sqrt. При этом в более императивном стиле он иногда инвертируется и выражается как: i * i < x

3. 1. Просто спрашиваю; 2. Таким образом, sqrtP в for цикле используется как наивысшее значение iterationOfArray , но я хочу, чтобы цикл продолжался до тех пор, пока значение в списке (GlobPrimeList), на которое указывает iterationOfArray , не превысит возможное простое число.

4. Приходите снова, пользователь2864740? Я довольно новичок в python; большая часть этого прошла мимо моей головы.

5. @user3743372 все еще не ясно, что вы имеете в виду. Предполагается, что это простое сито? Кроме того, вы должны прочитать python.org/dev/peps/pep-0008

Ответ №1:

Меня не волнуют никакие цифры после десятичной запятой в sqrt; есть ли способ сказать Python, чтобы он не утруждал себя их вычислением?

Нет.

math.sqrt() работает со значениями с плавающей запятой. Точность, которую вы получаете, учитывается непосредственно в математике.

Python содержит функции для математики «произвольной точности», где вы можете указать, какую точность вы получите… но эти функции намного медленнее, чем функции, которые работают со значениями с плавающей запятой. Если вам нужен более быстрый код, вы будете использовать значения с плавающей запятой, и нет способа сообщить Python не вычислять все значение.

Комментарии:

1. Спасибо, я хотел бы поддержать это (я только что создал свой профиль здесь)! Есть ли у вас какое-либо представление о том, как сделать так, чтобы верхний # диапазона (в for цикле) был indexOfArray, который указывает на# в массиве, который> sqrtP, хотя?

2. Возможно, вам следует изучить это: веб-страница, показывающая различные способы реализации сита Эратосфена. Эта ссылка указывает прямо на функцию Python, которая использует список. rosettacode.org/wiki/Sieve_of_Eratosthenes#Using_array_lookup

3. Я не понимаю, как is_prime = [False] * 2 [True] * (limit - 1) работает ссылка и реализована в if is_prime[n]: . Похоже, что первый из них поместил два false и сколько угодно true в список is_prime, но я не понимаю, как это пригодится позже.

4. Когда функция будет выполнена, это будет список флагов true / false, где True означает, что число является простым. Функция начинается с false для позиции 0 и позиции 1, но для позиций 2 до конца она начинается с флагов true. Затем он начинает находить истинные флаги и «вычеркивать» кратные (помечая их false). Он находит 2 и вычеркивает 4, 6, 8, 10 и так далее; находит 3 и вычеркивает 6, 9, 12, 15 и так далее; находит 5 и вычеркивает 10, 15, 20, 25 и так далее; вы поняли идею. Затем в конце он просматривает истинные флаги, чтобы определить, какие числа были простыми, и составляет список.