simple-math-32
Version:
Простая, но полезная математическая библиотека
58 lines (47 loc) • 2.38 kB
JavaScript
let primes = require('./constants/primeNumbers');
const { setOfPrimes } = require('./setOfPrimes');
/**
* Разложение на простые множетели числа n
* @param {number} num Натуральное число
* @returns {Promise<number[]>} Promise => массив из простых множителей числа n (согласно основной теореме арифметики)
* @description
Алгоритм разложения:
Проверяем делимость n на 2 (наименьшее простое число).
Проверяем делимость на 3, 5, 7 и так далее (только простые числа).
Если число делится, записываем множитель и продолжаем разложение для оставшегося числа.
Если оставшееся число больше 1 и является простым, оно также входит в разложение.
*/
async function primeFactorization(num) {
if (typeof num !== 'number' || num <= 0) {
throw new Error('Некорректный тип входных данных');
}
let coefficient = 2;
let currentIndex = 0;
const res = [];
do {
if (!primes[currentIndex]) {
await generatePrimesIfNeeded((currentIndex + 1) * coefficient);
coefficient += 1;
}
if (num % primes[currentIndex] === 0) {
num /= primes[currentIndex];
res.push(primes[currentIndex]);
currentIndex = 0; // Сбрасываем индекс, чтобы проверять деление сначала
} else {
currentIndex += 1;
}
} while (num > 1);
return res;
}
/**
* Генерирует простые числа асинхронно и кэширует их.
*/
async function generatePrimesIfNeeded(n) {
if (primes.length >= n) return; // Если простые числа уже есть, выходим
console.log(`Обновляем простые числа... до ${n}`);
primes = await new Promise((resolve) => {
setTimeout(() => resolve(setOfPrimes(n)), 0); // Асинхронный запуск
});
console.log(`Обновлено: ${primes.length} простых чисел`);
}
module.exports = { primeFactorization };