Простыми словами
Хочу подробнее остановиться на том примере, который привела в прошлой записи.

Задача формулируется очень просто: определить, является заданное число простым или составным.

читать дальше

@темы: Алгоритмы, Искусственный интеллект, Поп-математика, Amicus Plato

Комментарии
06.07.2008 в 22:12

Простыми словами
Попытаюсь объяснить то, что упустила.
Поскольку речь идет о теории, а не о практике, не будем привязываться ни к какому конкретному языку (так и будем работать с псевдоязыком), и будем считать, что одна команда (любая) — это один шаг алгоритма.

Возьмем алгоритм 1:

для i от 1 до 10 с шагом 1
А(i) = i*2
конец цикла


Посмотрим, за сколько шагов он отработает.
В нем три строчки.
В первой строчке проверяется, правда ли i не меньше единицы и не больше десяти;
во второй строчке вычисляется величина i*2 и помещается в элемент Ai;
в третьей строчке счетчик увеличивается на единицу (да-да, за увеличение счетчика как раз отвечает оператор конце цикла).

Итого цикл прокрутился 10 раз, каждый раз выполнилось 3 действия. Общий результат: 10*3=30 шагов.

Алгоритм 2.

для i от 1 до 9 с шагом 2
А(i) = i*2
А(i+1) = (i+1)*2
конец цикла


Здесь у нас за каждый проход цикла выполняется не три, а четыре действия (каждое действие — строка программы; их четыре). Проходов цикла у нас уже не десять, а 5.
Общее число шагов: 5*4=20.
В полтора раза меньше, чем в первом алгоритме (значит, когда я говорила "в два раза", чуть-чуть приврала))) Хотя, операторы цикла и операторы присваивания неравнозначны (а здесь это не учитывается)

Алгоритм 3.

для i от 1 до 6 с шагом 5
А(i) = i*2
А(i+1) = (i+1)*2
А(i+2) = (i+2)*2
А(i+3) = (i+3)*2
А(i+4) = (i+4)*2
конец цикла


В этом алгоритме всего два прохода цикла; в каждом по 7 действий:
2*7=14
Вот это уже больше чем вдвое меньше первоначального.

И, наконец, наш линейный алгоритм.

А(1) = 2
А(2) = 4
А(3) = 6
А(4) = 8
А(5) = 10
А(6) = 12
А(7) = 14
А(8) = 16
А(9) = 18
А(10) = 20


Он состоит из десяти шагов. Это улучшило нашу первую версию втрое. И для такого смешного примера это на самом деле немало!
11.07.2008 в 16:25

оффтоп: что интересно, в нашем ГОСТе используются детерменированные алгоритмы генерации проверки простых чисел (теорема Демитко), а в американских - вероятностные (тест Миллера-Рабина). Сложность алгоритмов, правда не приводили.
11.07.2008 в 20:20

Простыми словами
Trotil
я, когда готовила эти материалы, смотрела на все эти алгоритмы.
Честно говоря, от вероятностных (вернее от краткого их изложения) просто мороз по коже пробирал... И даже, я бы сказала, охватывал мистический ужас :)
Особенно меня тронули сильно псевдопростые числа ))))))
11.07.2008 в 20:20

Простыми словами
Сложность теста Миллера-Рабина, как пишут, как раз полиномиальная. ))
11.07.2008 в 21:45

Честно говоря, от вероятностных (вернее от краткого их изложения) просто мороз по коже пробирал... И даже, я бы сказала, охватывал мистический ужас :)

На мой взгляд они гораздо проще, чем детерминированные...
11.07.2008 в 21:49

Простыми словами
Trotil
я не о простоте, а о конечном результате!
доказать ведь простоту с помощью этих тестов нельзя!
11.07.2008 в 22:08

Американцев вот устраивает, В стандарте цифровой подписи FIPS PUB 186 DSS заложено 50 проверок на простоту Миллером-Рабином.

Вероятность успешного прохождения n тестов МР для составного числа m равна P(n) = 1/4^n
11.07.2008 в 22:16

Простыми словами
Trotil
50 проверок... Каждая из которых полиномиальна... Не так уж и быстро выходит.
Да и всё-таки, согласись, вероятность маленькая, но не равная нулю. Стоит сработать закону больших чисел, и кирдык. Что-то да навернется.
А если учесть темпы роста информации, то это выходит из области фантастики.
Нет, всё же наша кондовая детерминированная система круче! Надежнее! )))

(теорема Демитко),
я правда, про это ничего не слышала...
надо почитать.
11.07.2008 в 22:28

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

В инете теоремы на отдельной странице. Я смотрел. Но использовалась в нашем ГОСТе.

iu8.da.ru/cgi-bin/nph-stat.pl?path=iu8/5c/52cl/...

Стр. 13-14.

А еще на стр. 8 интересные формулы по простым числам.
11.07.2008 в 22:41

Простыми словами
Trotil
Спасибо! )))
16.02.2009 в 17:53

Manindra Agrawal, Neeraj Kayal и Nitin Saxena доказали, что класс простых чисел, распознается алгоритмом за полиномиальное время. См. их статью Primes is in P в Annals of Mathematics, 160 (2004), 781–793
ссылка www.math.princeton.edu/~annals/issues/2004/Sept...

Docent
16.02.2009 в 21:38

Простыми словами
Docent
Спасибо за ссылку!
Надо попробовать разобраться.
08.06.2009 в 01:23

Раскрывать циклы - сомнительное решение ИМХО, уж лучше использовать арифметику указателей для ускорения процесса.
Вот древняя, но полезная статья: cgm.computergraphics.ru/content/view/142

P.S. Извиняюсь за некропост
08.06.2009 в 14:33

Простыми словами
Гость
Насчет "раскрывать циклы" — по-моему это очень наглядная вещь для вот таких объяснений. Но на практике применять это прямо вот так — думаю, вряд ли кому-то придет в голову.
По крайней мере я к этому не призываю.

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

Спасибо за замечание и ссылку.