Files

89 lines
2.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: 5900f3ce1000cf542c50fee0
title: 'Завдання 97: Велике просте число не-Мерсенна'
challengeType: 5
forumTopicId: 302214
dashedName: problem-97-large-non-mersenne-prime
---
# --description--
Перше відоме просте число, що перевищувало один мільйон цифр, було виявлено в 1999 році, і воно є Мерсеннським простим числом у формі $2^{6972593} 1$; воно містить рівно 2,098,960 цифр. Згодом, виявилося, що інші Мерсеннівські числа, у формі $2^p 1$, містять більше цифр.
Однак, у 2004 році винайшли масивне немерсеннівське просте число, яке містить 2,357,207 цифр: $28433 × 2^{7830457} + 1$.
Знайдіть останні десять цифр простих чисел у вигляді $multiplier × 2^{power} + 1$.
# --hints--
`largeNonMersennePrime(19, 6833086)` має вивести рядок.
```js
assert(typeof largeNonMersennePrime(19, 6833086) === 'string');
```
`largeNonMersennePrime(19, 6833086)` має вивести рядок `3637590017`.
```js
assert.strictEqual(largeNonMersennePrime(19, 6833086), '3637590017');
```
`largeNonMersennePrime(27, 7046834)` має вивести рядок `0130771969`.
```js
assert.strictEqual(largeNonMersennePrime(27, 7046834), '0130771969');
```
`largeNonMersennePrime(6679881, 6679881)` має вивести рядок `4455386113`.
```js
assert.strictEqual(largeNonMersennePrime(6679881, 6679881), '4455386113');
```
`largeNonMersennePrime(28433, 7830457)` має вивести рядок `8739992577`.
```js
assert.strictEqual(largeNonMersennePrime(28433, 7830457), '8739992577');
```
# --seed--
## --seed-contents--
```js
function largeNonMersennePrime(multiplier, power) {
return true;
}
largeNonMersennePrime(19, 6833086);
```
# --solutions--
```js
function largeNonMersennePrime(multiplier, power) {
function modStepsResults(number, other, mod, startValue, step) {
let result = startValue;
for (let i = 0; i < other; i++) {
result = step(number, result) % mod;
}
return result;
}
const numOfDigits = 10;
const mod = 10 ** numOfDigits;
const digitsAfterPower = modStepsResults(2, power, mod, 1, (a, b) => a * b);
const digitsAfterMultiply = modStepsResults(
digitsAfterPower,
multiplier,
mod,
0,
(a, b) => a + b
);
const lastDigits = (digitsAfterMultiply + 1) % mod;
return lastDigits.toString().padStart(10, '0');
}
```