Eu estava na casa de um amigo para jantar e eles sugeriram a idéia de um "espaço vetorial de fator primordial". Neste espaço das números inteiros positivos são expressos como um vector de modo a que o n ésimo elemento no vector é o número de vezes que o n th divide primos do número. (Observe que isso significa que nossos vetores têm um número infinito de termos.) Por exemplo, 20 é
2 0 1 0 0 0 ...
Porque sua fatoração principal é 2 * 2 * 5 .
Como a fatoração primária é única, cada número corresponde a um vetor.
Podemos adicionar vetores adicionando suas entradas em pares. É o mesmo que multiplicar os números aos quais estão associados. Também podemos fazer a multiplicação escalar, o que é semelhante a elevar o número associado a uma potência.
O problema é que esse espaço não é de fato um espaço vetorial, porque não há inversos. Se prosseguirmos, adicionarmos os inversos e fecharmos o espaço vetorial, agora temos uma maneira de expressar todo número racional positivo como um vetor. Se mantivermos o fato de que a adição de vetores representa multiplicação. Então o inverso de um número natural é recíproco.
Por exemplo, o número 20 tinha o vetor
2 0 1 0 0 0 ...
Então a fração 1/20 é inversa
-2 0 -1 0 0 0 ...
Se quiséssemos encontrar o vetor associado a uma fração como 14/15 , encontraríamos 14
1 0 0 1 0 0 ...
e 1/15
0 -1 -1 0 0 0 ...
e multiplique-os executando a adição de vetores
1 -1 -1 1 0 0 ...
Agora que temos um espaço vetorial, podemos modificá-lo para formar um espaço interno do produto, fornecendo-lhe um produto interno. Para fazer isso, roubamos o produto interno que os espaços vetoriais recebem classicamente. O produto interno de dois vetores é definido como a soma da multiplicação por pares de seus termos. Por exemplo 20 · 14/15 seria calculado da seguinte forma
20 = 2 0 1 0 0 0 ...
14/15 = 1 -1 -1 1 0 0 ...
2 0 -1 0 0 0 ... -> 1
Como outro exemplo, o produto 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
Sua tarefa é implementar um programa que executa esse produto de ponto. Ele deve receber dois números racionais positivos por meio de um número inteiro positivo (numerador e denominador) ou um tipo racional (flutuadores não são permitidos, porque causam problemas de precisão e divisibilidade) e deve gerar um número inteiro representando o produto escalar dos dois entradas.
Isso é código-golfe, então as respostas serão pontuadas em bytes, com menos bytes sendo melhores.
Casos de teste
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