freeCodeCamp/curriculum/challenges/russian/08-coding-interview-prep/rosetta-code/factors-of-a-mersenne-numbe...

61 lines
8.5 KiB
Markdown
Raw Normal View History

---
title: Factors of a Mersenne number
id: 598eea87e5cf4b116c3ff81a
challengeType: 5
videoUrl: ''
localeTitle: Факторы числа Мерсенны
---
## Description
<section id="description"><p> Число Мерсенна - это число в виде 2 <sup>P</sup> -1. </p><p> Если P является простым, число Мерсенна может быть простым числом Мерсенна </p><p> (если P не является простым, число Мерсенна также не является простым). </p><p> При поиске простых чисел Мерсенна выгодно исключить экспоненты путем нахождения небольшого коэффициента перед началом потенциально длительного <a href="http://rosettacode.org/wiki/Lucas-Lehmer test" title="Тест Лукаса-Лемера">теста Lucas-Lehmer</a> . </p><p> Существуют очень эффективные алгоритмы для определения того, делит ли число 2 <sup>P</sup> -1 (или, что то же самое, если 2 <sup>P</sup> mod (число) = 1). </p><p> Некоторые языки уже имеют встроенные реализации этой операции экспонента и мода (называемые modPow или аналогичные). </p><p> Ниже описано, как реализовать этот modPow самостоятельно: </p><p> Например, давайте вычислим 2 <sup>23</sup> mod 47. </p><p> Преобразуйте экспонента 23 в двоичный код, вы получите 10111. Начиная с <tt>квадрата</tt> = 1, многократно меняйте его. </p><p> Удалите верхний бит экспоненты, и если это 1 умножить <tt>квадрат</tt> на основание экспоненции (2), тогда вычислите <tt>квадрат</tt> по модулю 47. </p><p> Используйте результат модуляции с последнего шага в качестве начального значения <tt>квадрата</tt> на следующем шаге: </p><p> Удалить необязательный </p><p> квадратный верхний бит умножается на 2 mod 47 </p><p> ------------ ------- ------------- ------ </p><p> 1 * 1 = 1 1 0111 1 * 2 = 2 2 </p><p> 2 * 2 = 4 0 111 нет 4 </p><p> 4 * 4 = 16 1 11 16 * 2 = 32 32 </p><p> 32 * 32 = 1024 1 1 1024 * 2 = 2048 27 </p><p> 27 * 27 = 729 1 729 * 2 = 1458 1 </p><p> Так как 2 <sup>23</sup> mod 47 = 1, 47 является фактором 2 <sup>P</sup> -1. </p><p> (Чтобы увидеть это, вычтите 1 с обеих сторон: 2 <sup>23</sup> -1 = 0 mod 47.) </p><p> Поскольку мы показали, что 47 является фактором, 2 <sup>23</sup> -1 не является простым. </p><p> Дальнейшие свойства чисел Мерсенна позволяют нам еще больше усовершенствовать процесс. </p><p> Любой фактор q из 2 <sup>P</sup> -1 должен иметь вид 2kP + 1, k - положительное целое число или ноль. Кроме того, q должно быть 1 или 7 mod 8. </p><p> Наконец, любой потенциальный фактор q должен быть <a href="http://rosettacode.org/wiki/Primality by Trial Division" title="Приоритет Судебного отдела">простым</a> . </p><p> Как и в других алгоритмах пробного деления, алгоритм останавливается, когда 2kP + 1&gt; sqrt (N). </p><p> Эти тесты на примитивность работают только на числа Мерсенна, где P является простым. Например, M <sub>4</sub> = 15 не дает никаких факторов, использующих эти методы, но факторы в 3 и 5, ни один из которых не соот
## Instructions
<section id="instructions">
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: <code>check_mersenne</code> - это функция.
testString: 'assert(typeof check_mersenne === "function", "<code>check_mersenne</code> is a function.");'
- text: <code>check_mersenne(3)</code> должен возвращать строку.
testString: 'assert(typeof check_mersenne(3) == "string", "<code>check_mersenne(3)</code> should return a string.");'
- text: <code>check_mersenne(3)</code> должен возвращать «M3 = 2 ^ 3-1 является простым».
testString: 'assert.equal(check_mersenne(3),"M3 = 2^3-1 is prime","<code>check_mersenne(3)</code> should return "M3 = 2^3-1 is prime".");'
- text: <code>check_mersenne(23)</code> должен возвращать «M23 = 2 ^ 23-1 композитно с коэффициентом 47».
testString: 'assert.equal(check_mersenne(23),"M23 = 2^23-1 is composite with factor 47","<code>check_mersenne(23)</code> should return "M23 = 2^23-1 is composite with factor 47".");'
- text: <code>check_mersenne(929)</code> должен возвращать «M929 = 2 ^ 929-1 является составным с коэффициентом 13007
testString: 'assert.equal(check_mersenne(929),"M929 = 2^929-1 is composite with factor 13007","<code>check_mersenne(929)</code> should return "M929 = 2^929-1 is composite with factor 13007");'
```
</section>
## Challenge Seed
<section id='challengeSeed'>
<div id='js-seed'>
```js
function check_mersenne (p) {
// Good luck!
}
```
</div>
</section>
## Solution
<section id='solution'>
```js
// solution required
```
</section>