Я был в доме друга на обед, и они предложили идею "векторного пространства 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
источник
Ответы:
MATL , 12 байт
Ввод является массивом
[num1 den1 num2 den2]
.Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
Рассмотрим пример ввода
[20 1 14 15]
.источник
C (gcc) , 99 + 32 = 131 байт
-D=F(v,V,e)for(;v%p<1;V+=e)v/=p;
.Попробуйте онлайн!
источник
-D=F(v,V,e)for(;v%p<1;V+=e)v/=p;
(32 байта) (таким образом, 99 + 32 = 131); в противном случае сам по себе код не имеет большого смысла.Желе ,
1211 байтПопробуйте онлайн!
источник
Python 2 , 110 байт
Попробуйте онлайн!
Принимает участие как
[num1, num2, den1, den2]
. Использует комплексное числоr
для хранения записей для простогоp
для двух рациональных, и(r*r).imag/2
для извлечения их произведенияr.real*r.imag
в общую суммуt
. Добавление1j**i
fori=0,1,2,3
выполняет каждую комбинацию увеличения или уменьшения действительной или мнимой части для четырех входных чисел.Bubbler сохранил 2 байта, объединяя начальные значения
p=t=2
.источник
p=t=2
вместо,p=2;t=0
такt.real
как игнорируется в любом случае ( TIO ).Wolfram Language (Mathematica) , 55 байтов
Попробуйте онлайн!
источник
JavaScript (Node.js) ,
104...10094 байтаПопробуйте онлайн!
Передайте числа в виде массива [Num1, Den1, Num2, Den2].
Спасибо за Арно, за исправление пропавшего
F=
без лишних байтов и еще на 2 байта меньше.Объяснение и безгольф
источник
J , 19 байт
Попробуйте онлайн!
Объяснение:
Диадический глагол, аргументы находятся как слева, так и справа
источник
Stax , 11 байт
Запустите и отладьте его
Соответствующее представление ascii той же программы таково.
По сути, он получает основные показатели факторизации для каждой части. Он берет разницу каждой пары, затем продукта и, наконец, суммирует все результаты.
источник
Python 2 ,
133127 байтПопробуйте онлайн!
Украл состояние цикла из представления xnor .
Спасибо за совет @mathmandan по превращению функции в программу (да, она действительно сэкономила несколько байтов).
Устаревшее, неправильное решение (124 байта):
источник
p
собирается ли тестировать не простые значения, такие как 9?return
сprint
, и вы можете также сохранить отступ пространство , если вы пишете в качестве программы вместо функции.eval()
если только сам ввод функции не является строкой).Haskell , 153 байта
Попробуйте онлайн! Пример использования для
20 · 14/15
:(2%) [20,1,14,15]
.источник