Files
2022-02-28 08:59:21 +01:00

89 lines
2.3 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: 'Problema 97: Grandi numeri primi non-Mersenne'
challengeType: 5
forumTopicId: 302214
dashedName: problem-97-large-non-mersenne-prime
---
# --description--
Il primo numero primo trovato sopra un milione di cifre è stato scoperto nel 1999, ed è un primo di Mersenne nella forma $2^{6972593} 1$; contiene esattamente 2.098.960 cifre. Successivamente sono stati trovati altri primi di Mersenne, della forma $2^p 1$, contenenti più cifre.
Tuttavia, nel 2004 è stato trovato un enorme primo non-Mersenne che contiene 2.357.207 cifre: $28433 × 2^{7830457} + 1$.
Trova le ultime dieci cifre di quel primo non-Mersenne nella forma $multiplier × 2^{power} + 1$.
# --hints--
`largeNonMersennePrime(19, 6833086)` dovrebbe restituire una stringa.
```js
assert(typeof largeNonMersennePrime(19, 6833086) === 'string');
```
`largeNonMersennePrime(19, 6833086)` dovrebbe restituire la stringa `3637590017`.
```js
assert.strictEqual(largeNonMersennePrime(19, 6833086), '3637590017');
```
`largeNonMersennePrime(27, 7046834)` dovrebbe restituire la stringa `0130771969`.
```js
assert.strictEqual(largeNonMersennePrime(27, 7046834), '0130771969');
```
`largeNonMersennePrime(6679881, 6679881)` dovrebbe restituire la stringa `4455386113`.
```js
assert.strictEqual(largeNonMersennePrime(6679881, 6679881), '4455386113');
```
`largeNonMersennePrime(28433, 7830457)` dovrebbe restituire la stringa `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');
}
```