Я был в доме друга на обед, и они предложили идею "векторного пространства Prime-factor". В этом пространстве положительные целые числа выражаются в виде вектора, так что n- й элемент в векторе является числом раз, которое n- е простое число делит число. (Обратите внимание , что это означает , что наши векторы , имеющие бесконечное число слагаемых.) Например 20 является
2 0 1 0 0 0 ...
Потому что его первичная факторизация составляет 2 * 2 * 5 .
Поскольку первичная факторизация уникальна, каждому числу соответствует один вектор.
Мы можем добавить векторы, попарно добавив их записи. Это то же самое, что умножение чисел, с которыми они связаны. Мы также можем выполнить скалярное умножение, которое сродни увеличению числа до степени.
Проблема в том, что это пространство на самом деле не является векторным пространством, потому что там нет инверсий. Если мы пойдем дальше и добавим инверсии и закроем векторное пространство, у нас теперь есть способ выразить каждое положительное рациональное число в виде вектора. Если мы сохраним тот факт, что сложение векторов представляет собой умножение. Тогда обратная сторона натурального числа является его обратной величиной.
Например, число 20 имело вектор
2 0 1 0 0 0 ...
Таким образом, дробь 1/20 является ее обратной
-2 0 -1 0 0 0 ...
Если бы мы хотели найти вектор, связанный с дробью, такой как 14/15, мы бы нашли 14
1 0 0 1 0 0 ...
и 1/15
0 -1 -1 0 0 0 ...
и умножить их, выполнив сложение векторов
1 -1 -1 1 0 0 ...
Теперь, когда у нас есть векторное пространство, мы можем изменить его, чтобы сформировать внутреннее продуктовое пространство, дав ему внутренний продукт. Для этого мы крадем внутреннее произведение, что векторные пространства заданы классически. Внутреннее произведение двух векторов определяется как сумма попарного умножения их членов. Например, 20 · 14/15 будет рассчитываться следующим образом
20 = 2 0 1 0 0 0 ...
14/15 = 1 -1 -1 1 0 0 ...
2 0 -1 0 0 0 ... -> 1
В качестве другого примера продукт 2/19 · 4/19
2/19 = 1 0 0 0 0 0 0 -1 0 0 0 ...
4/19 = 2 0 0 0 0 0 0 -1 0 0 0 ...
2 0 0 0 0 0 0 1 0 0 0 ... -> 3
Ваша задача - реализовать программу, которая выполняет этот точечный продукт. Он должен принимать два положительных рациональных числа через пару положительных целых чисел (числитель и знаменатель) или рациональный тип (числа с плавающей запятой не допускаются, поскольку они вызывают проблемы с точностью и делимостью) и должен выводить целое число, представляющее скалярное произведение двух входы.
Это код-гольф поэтому ответы будут оцениваться в байтах, причем меньшее количество байтов будет лучше.
Тестовые случаи
4 · 4 = 4
8 · 8 = 9
10 · 10 = 2
12 · 12 = 5
4 · 1/4 = -4
20 · 14/15 = 1
2/19 · 4/19 = 3