Перебор делителей: различия между версиями
[непроверенная версия] | [непроверенная версия] |
Pavelnkt (обсуждение | вклад) Нет описания правки |
MBHbot (обсуждение | вклад) м →Ссылки: Project talk:Викификатор#Шаблон:Rq, replaced: {{rq|sources}} → {{подст:нет источников}} |
||
(не показано 38 промежуточных версий 15 участников) | |||
Строка 1: | Строка 1: | ||
{{Значения|Перебор}} |
{{Значения|Перебор}} |
||
'''Перебор делителей''' ('''пробное деление''') — алгоритм [[факторизация|факторизации]] или [[тест простоты|тестирования простоты]] числа |
'''Перебор делителей''' ('''пробное деление''') — алгоритм [[факторизация|факторизации]] или [[тест простоты|тестирования простоты]] числа путём [[полный перебор|полного перебора]] всех возможных потенциальных [[делитель|делителей]]. |
||
== Описание алгоритма == |
== Описание алгоритма == |
||
⚫ | |||
Обычно перебор делителей заключается в переборе всех [[целое число|целых]] (как вариант: [[простое число|простых]]) чисел от 2 до [[квадратный корень|квадратного корня]] |
Обычно перебор делителей заключается в переборе всех [[целое число|целых]] (как вариант: [[простое число|простых]]) чисел от 2 до [[квадратный корень|квадратного корня]] из факторизуемого числа ''n'' и в вычислении [[деление с остатком|остатка от деления]] ''n'' на каждое из этих чисел. Если остаток от деления на некоторое число ''i'' равен 0, то ''i'' является делителем ''n''. В этом случае либо ''n'' объявляется составным, и алгоритм заканчивает работу (если тестируется простота ''n''), либо ''n'' сокращается на ''i'' и процедура повторяется (если осуществляется факторизация ''n''). По достижении квадратного корня из ''n'' и невозможности сократить ''n'' ни на одно из меньших чисел ''n'' объявляется простым{{sfn|Childs|2009|pp=117-118}}. |
||
Для ускорения перебора часто не проверяются чётные делители, кроме числа 2, а также делители кратные трём, кроме числа 3. При этом тест ускоряется в три раза, так как из каждых шести последовательных потенциальных делителей необходимо проверить только два, а именно вида 6·''k''±1, где ''k'' — натуральное число. |
Для ускорения перебора часто не проверяются чётные делители, кроме числа 2, а также делители, кратные трём, кроме числа 3. При этом тест ускоряется в три раза, так как из каждых шести последовательных потенциальных делителей необходимо проверить только два, а именно вида 6·''k''±1, где ''k'' — [[натуральное число]]. |
||
Данный алгоритм является ресурсоемким при проверке больших чисел на простоту, но для его ускорения можно прибегнуть к следующим методам оптимизации. Для объяснения возьмем три последовательных числа (n-1, n, n+1). Предположим, что число n — простое. Так как n — простое, то слева и справа от него будут стоять числа, кратные двум, а исходя из того, что мы рассматриваем тройку подряд идущих чисел, среди них обязательно найдётся число, кратное трем. Тогда число n-1 и n+1 кратны двум, и одно из них кратно трем; следовательно, одно из этих чисел будет кратно шести. Теперь мы можем сказать, что простое число, большее трех, всегда будет стоять рядом с числом, кратным шести. Оптимизируя наш алгоритм, мы можем изначально проверить окрестность большого числа N, а именно N-1 и N+1, на кратность 6, и после этого запустить алгоритм проверки на простоту. Данный метод можно использовать и на задачах, связанных с отрезком чисел, и перебирать только те, которые стоят рядом с числом, кратным шести. |
|||
⚫ | |||
== Скорость == |
== Скорость == |
||
Худший случай, если перебор придется проводить от 2 до корня из ''n''. Сложность данного алгоритма |
Худший случай, если перебор придется проводить от 2 до корня из ''n''. Сложность данного алгоритма |
||
: <math>O(n^{1/2})=\sqrt[2]{n}</math> |
|||
:<math>O(n^{1/2})</math><ref>{{Cite web|url = http://ru.math.wikia.com/wiki/Факторизация|title = Факторизация|author = |date = |publisher = }}</ref> |
|||
== Пример == |
== Пример == |
||
Для иллюстрации проведем перебор делителей числа |
Для иллюстрации проведем перебор делителей числа ''n'' = 29. ''i'' — возможные делители ''n''. |
||
<math>[n^{1/2}] = 5</math> |
<math>[n^{1/2}] = 5</math> |
||
Строка 35: | Строка 36: | ||
|} |
|} |
||
Так как ни один из остатков деления 29 не равен 0, то 29 объявляется простым. |
Так как ни один из остатков деления 29 не равен 0, то 29 объявляется простым. |
||
Пусть теперь ''n'' = |
Пусть теперь ''n'' = 7399, тогда{{sfn|Crandall, Pomerance|2005|pp=117-119}} |
||
<math>[n^{1/2}] = |
<math>[n^{1/2}] = 86</math> |
||
{| class="wikitable" |
{| class="wikitable" |
||
!i |
!i |
||
Строка 54: | Строка 55: | ||
|- |
|- |
||
|5 |
|5 |
||
|4 |
|||
|- |
|||
|6 |
|||
|1 |
|||
|- |
|||
|7 |
|||
|0 |
|0 |
||
|} |
|} |
||
Так как остаток деления |
Так как остаток деления 7399 на 7 равен 0, то 7399 не является простым. |
||
== Практическое применение == |
== Практическое применение == |
||
В практических задачах данный [[алгоритм]] применяется редко ввиду его большой вычислительной сложности, однако его применение оправдано в случае, если проверяемые числа относительно невелики, так как данный алгоритм довольно легко реализуем. |
В практических задачах данный [[алгоритм]] применяется редко ввиду его большой [[Вычислительная сложность|вычислительной сложности]], однако его применение оправдано в случае, если проверяемые числа относительно невелики, так как данный алгоритм довольно легко реализуем{{sfn|Childs|2009|pp=117-118}}. |
||
== См. также == |
== См. также == |
||
Строка 70: | Строка 77: | ||
== Примечания == |
== Примечания == |
||
{{примечания}} |
{{примечания}} |
||
{{math-stub}} |
|||
{{rq|sources}} |
|||
[[Категория:Алгоритмы факторизации]] |
|||
[[Категория:Тесты простоты]] |
|||
== Литература == |
== Литература == |
||
* {{книга |автор= Lindsay N. Childs | название=A Concrete Introduction to Higher Algebra |ссылка= https://archive.org/details/concreteintroduc0000chil_t3a9 |издание=3rd ed |место=New York |год=2009 |allpages=603 |ref=Childs}} |
|||
{{reflist}} |
|||
* {{ |
* {{книга |автор= Richard Crandall, Carl Pomerance | название=Prime numbers. A computational perspective |ссылка= https://archive.org/details/primenumberscomp0002cran |издание=2nd ed |место=New York |год=2005 |allpages=597 |ref=Crandall, Pomerance}} |
||
== Ссылки == |
|||
== Внешние ссылки == |
|||
⚫ | |||
* {{Cite web|url = http://ru.math.wikia.com/wiki/Факторизация|title = Факторизация|author = |date = |publisher = wikia|access-date = 2022-03-29|archive-date = 2018-12-28|archive-url = https://web.archive.org/web/20181228053012/http://ru.math.wikia.com/wiki/%D0%A4%D0%B0%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F|deadlink = no}} |
|||
{{Нет источников |дата=2024-10-20}} |
|||
⚫ | |||
[[ |
[[Категория:Алгоритмы факторизации]] |
||
[[ |
[[Категория:Тесты простоты]] |
Текущая версия от 12:54, 20 октября 2024
Перебор делителей (пробное деление) — алгоритм факторизации или тестирования простоты числа путём полного перебора всех возможных потенциальных делителей.
Описание алгоритма
[править | править код]Обычно перебор делителей заключается в переборе всех целых (как вариант: простых) чисел от 2 до квадратного корня из факторизуемого числа n и в вычислении остатка от деления n на каждое из этих чисел. Если остаток от деления на некоторое число i равен 0, то i является делителем n. В этом случае либо n объявляется составным, и алгоритм заканчивает работу (если тестируется простота n), либо n сокращается на i и процедура повторяется (если осуществляется факторизация n). По достижении квадратного корня из n и невозможности сократить n ни на одно из меньших чисел n объявляется простым[1].
Для ускорения перебора часто не проверяются чётные делители, кроме числа 2, а также делители, кратные трём, кроме числа 3. При этом тест ускоряется в три раза, так как из каждых шести последовательных потенциальных делителей необходимо проверить только два, а именно вида 6·k±1, где k — натуральное число.
Данный алгоритм является ресурсоемким при проверке больших чисел на простоту, но для его ускорения можно прибегнуть к следующим методам оптимизации. Для объяснения возьмем три последовательных числа (n-1, n, n+1). Предположим, что число n — простое. Так как n — простое, то слева и справа от него будут стоять числа, кратные двум, а исходя из того, что мы рассматриваем тройку подряд идущих чисел, среди них обязательно найдётся число, кратное трем. Тогда число n-1 и n+1 кратны двум, и одно из них кратно трем; следовательно, одно из этих чисел будет кратно шести. Теперь мы можем сказать, что простое число, большее трех, всегда будет стоять рядом с числом, кратным шести. Оптимизируя наш алгоритм, мы можем изначально проверить окрестность большого числа N, а именно N-1 и N+1, на кратность 6, и после этого запустить алгоритм проверки на простоту. Данный метод можно использовать и на задачах, связанных с отрезком чисел, и перебирать только те, которые стоят рядом с числом, кратным шести.
Скорость
[править | править код]Худший случай, если перебор придется проводить от 2 до корня из n. Сложность данного алгоритма
Пример
[править | править код]Для иллюстрации проведем перебор делителей числа n = 29. i — возможные делители n.
i | n % i |
---|---|
2 | 1 |
3 | 2 |
4 | 1 |
5 | 4 |
Так как ни один из остатков деления 29 не равен 0, то 29 объявляется простым.
Пусть теперь n = 7399, тогда[2]
i | n % i |
---|---|
2 | 1 |
3 | 1 |
4 | 3 |
5 | 4 |
6 | 1 |
7 | 0 |
Так как остаток деления 7399 на 7 равен 0, то 7399 не является простым.
Практическое применение
[править | править код]В практических задачах данный алгоритм применяется редко ввиду его большой вычислительной сложности, однако его применение оправдано в случае, если проверяемые числа относительно невелики, так как данный алгоритм довольно легко реализуем[1].
См. также
[править | править код]Примечания
[править | править код]- ↑ 1 2 Childs, 2009, pp. 117-118.
- ↑ Crandall, Pomerance, 2005, pp. 117-119.
Литература
[править | править код]- Lindsay N. Childs. A Concrete Introduction to Higher Algebra. — 3rd ed. — New York, 2009. — 603 p.
- Richard Crandall, Carl Pomerance. Prime numbers. A computational perspective. — 2nd ed. — New York, 2005. — 597 p.
Ссылки
[править | править код]- Javascript Prime Factor Calculator using trial division Архивная копия от 10 января 2015 на Wayback Machine. Способен обрабатывать числа до 9×1015
- Факторизация . wikia. Дата обращения: 29 марта 2022. Архивировано 28 декабря 2018 года.
В статье не хватает ссылок на источники (см. рекомендации по поиску). |