LINUX.ORG.RU
ФорумTalks

Проверка на простое число регулярным выражением


0

0

Занимательно. Похоже, что не очень сложный регэксп может проверять число на простоту. Хотя, на практике, это бесполезно, слишком медленно и количество потребляемой памяти безумно уже для не очень больших чисел. http://www.noulakaz.net/weblog/2007/03/18/a-regular-expression-to-check-for-p...

def is_prime(n)
  ("1" * n) !~ /^1?$|^(11+?)\1+$/
end



Последнее исправление: Droid790 (всего исправлений: 1)
Ответ на: комментарий от Droid790

Предлагаешь регэксп заменить вызовом wget википедии? -)

stevejobs ★★★★☆
()

Прикольно но ничего удивительного

DNA_Seq ★★☆☆☆
()

Демон, как это работает?????77777

redgremlin ★★★★★
()
Ответ на: комментарий от one_more_hokum

just try it

#!/usr/bin/perl

for ($i = 1; $i<1000; $i++) {
  print $i."\n" if (1 x $i) !~ /^1?$|^(11+?)\1+$/
}
redgremlin ★★★★★
()

по-моему с 1 не работает.

 
>>> import re
>>> def is_prime(n): return None==re.match('^1?$|^(11+?)\\1+$','1'*n)
... 
>>> is_prime(3)
True
>>> is_prime(4)
False
>>> is_prime(12)
False
>>> is_prime(11)
True
>>> is_prime(1)
False
>>> is_prime(3)
True
>>> is_prime(2)
True
>>> is_prime(1)
False
>>> is_prime(2**43112609-1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in is_prime
OverflowError: cannot fit 'long' into an index-sized integer
>>> 
 
olegsov
()
Ответ на: комментарий от olegsov

1 не является простым числом. Очень большие числа не прокатывают, т.к. для регэкспа нужна строка единиц длиной с проверяемое число

unC0Rr ★★★★★
()
Ответ на: комментарий от olegsov

is_prime(2**43112609-1)

OverflowError: cannot fit 'long' into an index-sized integer

А, ***! ***, ***! - сказали суровые сибирские лесорубы.

Xellos ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.