Essays.club - Получите бесплатные рефераты, курсовые работы и научные статьи
Поиск

Реализаия метода согласования и Полига-Хеллмана на JavaScript

Автор:   •  Октябрь 23, 2022  •  Лабораторная работа  •  654 Слов (3 Страниц)  •  163 Просмотры

Страница 1 из 3

Реализаия метода согласования и Полига-Хеллмана на JavaScript

Введем три константы для дальнейших расчетов:

a = 110

b = 12

p = 11807

Метод согласования (метод больших и малых шагов).

В основе метода лежит следующий факт: пусть  и ; тогда для любого целого числа x, , найдутся такие целые числа l,t, что , . В этих условиях для нахождения числа x из сравнения [pic 1][pic 2][pic 3][pic 4][pic 5]

[pic 6]

Воспользуемся полученным разложением:

.[pic 7]

Это означает, что искомое значение l, t, могут быть найдены перебором величин  и  в указанных границах, а после этого будет определена и величина x.[pic 8][pic 9]

Вычилслим h, составим таблицы  и  и найдем индексы общих элементов:[pic 10][pic 11]

BGsteps = (pab=> {

    p = BigInt(p), a = BigInt(a), b = BigInt(b)

    let h = BigInt(Math.ceil(Math.sqrt(Number(p))))

    let bat = [...Array(Number(h)).keys()].map((st=> b * a ** BigInt(t) % p)

    let ahl = [...Array(Number(h)).keys()].map((sl=> (a ** h) ** BigInt(l + 1) % p)

    let ret = bat.filter(s => ahl.includes(s)).map(s => {

        let [tl] = [bat.indexOf(s), ahl.indexOf(s) + 1]

        return Number(h) * l - t

    })

    return ret.length ? ret : 'Нет решений'


Метод Полига-Хеллмана.

Пусть задано сравнение , и известно разложение p−1 на простые множители:[pic 12]

[pic 13]

Необходимо найти натуральное число x, удовлетворяющее сравнению. Заметим, что на практике всегда рассматривается случай, когда a – первообразный корень по модулю p. В этом случае сравнение имеет решение при любом b, взаимно простом с p.

Составим таблицу значений  в переменную rij, составим систему уравнений по этой таблице и перебором значений (сложность перебора равна O(n)) найдем решение[pic 14]

SilverPH = (pab=> {

    p = BigInt(p), a = BigInt(a), b = BigInt(b)

    let dups = []

    let factors = factorizen(p - 1n)

    factors.forEach(s => dups[s] = 1 + (dups[s] || 0))

    factors = [...dups.keys()].map(s => ({ qBigInt(s), aBigInt(dups[s] || 0) })).filter(s => s.a)

    let rij = Array(factors.length).fill().map((si=> Array(Number(factors[i].q)).fill()).map((si=> s.map((sj=> a ** (BigInt(j) * (p - 1n) / factors[i].q) % p))

    let findMod = (qx=> BigInt(rij[q].indexOf(rij[q].find(s => s == x) || rij[q].find(s => s == x < 0 ? x + p : x - p)))

    let xs = factors.map((ei=> {

        let x0 = findMod(ib ** ((p - 1n) / e.q) % p)

        let x1 = findMod(iBigInt((b * BigInt(Math.ceil(Number(a) ** Number(-x0))))) ** (p - 1n) / (e.q ** 2n) % p)

        let m = e.q ** e.a

        return { val: (x0 + x1 * e.q) % m == 0 ? 1 : (x0 + x1 * e.q) % mmodm }

    })

    let x = 2n

    while ((x < p ** 2n) && !xs.every(s => x % s.mod == s.val)) x++;

    return x == p ** 2n - 1n ? 'Нет решений' : Number(x)


...

Скачать:   txt (3.9 Kb)   pdf (184.9 Kb)   docx (841.6 Kb)  
Продолжить читать еще 2 страниц(ы) »
Доступно только на Essays.club