Нахождение количества всех пар чисел, которые дают одни и те же НОД и НОК

Рейтинг: 0Ответов: 0Опубликовано: 13.06.2023

Нужно написать программу, которая получает на вход два числа через пробел. Эти числа являются НОД и НОК каких-то двух чисел. Нужно найти количество всех пар чисел, которые дают эти НОК и НОД. Вот код, который я написал:

from itertools import chain, combinations
from math import prod


def all_subsets(ss):
    return chain(*map(lambda x: combinations(ss, x), range(0, len(ss)+1)))


def factorization(number):
    all_divisors = []
    divisor = 2
    while divisor <= number:
        if number % divisor == 0:
            all_divisors.append(divisor)
            number /= divisor
        else:
            divisor += 1
    all_divisors = set(all_divisors)
    return all_divisors


def gcd(a, b):
    while b:
        a, b = b, a % b
    return a


def mcd(n, m):
    return (n/gcd(n, m))*m


def finding_count_private_key(set_, number):
    global public_key
    lst = []
    set_ = list(map(list, all_subsets(set_)))
    for subset in range(1, len(set_)):
        value = prod(set_[subset])
        value_2 = number // value
        gcd_value = gcd(value, value_2)
        mcd_value = mcd(value, value_2)
        if gcd_value == public_key[0] and mcd_value == public_key[1] and sorted([value, value_2]) not in lst:
            lst.append(sorted([value, value_2]))
    return len(lst) * 2


public_key = list(map(int, input().split(" ")))
composition = public_key[0] * public_key[1]
decomposition = factorization(composition)
print(finding_count_private_key(decomposition, composition))

Он на одном из тестов выдает ошибку, можете подсказать, что не так? Желательно, найти ошибку в моем решении, а не придумать свое, так как я хочу хоть что-то вложить от себя в решение задачи, а не тупо скопировать код. И да, насчет вот этой строчки:

return len(lst) * 2

В задаче требуется найти эти числа, чтобы создать ключ, а если их поменять местами, то это уже другой ключ, поэтому я умножаю количество всех найденных пар на 2.Вот всё условие задачи, кому надо: Во всех крупных IT-компаниях немалое внимание уделяется вопросам информационной безопасности, и Яндекс не является исключением.

Дима и Егор разрабатывают новый сервис YD (Yandex Dorogi) и в данный момент занимаются аудитом его безопасности. Для шифрования пользовательских данных в YD используется алгоритм шифрования с открытым ключом YS (Yandex Shifrovatel).

Схема работы алгоритма YS такова: для каждого сервиса генерируется закрытый ключ (p,q), где p и q — натуральные числа. По закрытому ключу (p,q) генерируется открытый ключ (НОД(p,q), НОК(p,q)), который доступен всем пользователям. Если злоумышленник сможет по открытому ключу получить закрытый ключ, то он получит доступ ко всем данным YD и нанесёт сервису непоправимый вред. Конечно же, Егор и Дима не хотят этого допустить, поэтому они хотят сделать так, чтобы злоумышленнику пришлось перебрать очень много вариантов открытого ключа, прежде чем он сможет его угадать.

Дима уже сгенерировал закрытый ключ для YD и получил на его основе открытый ключ (x,y). Егору сразу же стало интересно, сколько вариантов закрытого ключа придётся перебрать злоумышленнику для взлома YD в худшем случае, иными словами, сколько существует закрытых ключей (p,q) таких, что открытым ключом для них является (x,y). К сожалению, у Егора есть много других задач, очень важных для запуска YD, поэтому он просит вас вычислить это количество за него.

Формат ввода В первой строке содержатся два целых числа x и y (1≤x≤y≤10¹²) — описание открытого ключа.

Формат вывода Выведите одно целое число — количество закрытых ключей, для которых данный ключ является открытым.

Примечание В первом примере существует два закрытых ключа, для которых (5,10) является открытым ключом: (5,10) и (10,5).

Во втором примере Дима ошибся, потому что ни один закрытый ключ не порождает открытый ключ (10,11).

В третьем примере подходящими закрытыми ключами являются (527,9486), (1054,4743), (4743,1054), (9486,527).

НОД (наибольшим общим делителем) двух натуральных чисел p и q называется наибольшее число k такое, что p делится на k и q делится на k. Например, НОД(6,15) равен 3, а НОД(16,8) равен 8.

НОК (наименьшим общим кратным) двух натуральных чисел p и q называется наименьшее число k такое, что k делится на p и k делится на q. Например, НОК(2,3) равен 6, а НОК(10,20) равен 20.

Пример 1 Ввод 5 10 Вывод 2 Пример 2 Ввод 10 11 Вывод 0 Пример 3 Ввод 527 9486 Вывод 4

Ответы

Ответов пока нет.