#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 и так далее; вы поняли идею. Затем в конце он просматривает истинные флаги, чтобы определить, какие числа были простыми, и составляет список.