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
fonte
Respostas:
MATL , 12 bytes
Entrada é uma matriz
[num1 den1 num2 den2]
.Experimente online! Ou verifique todos os casos de teste .
Explicação
Considere exemplo de entrada
[20 1 14 15]
.fonte
C (gcc) , 99 + 32 = 131 bytes
-D=F(v,V,e)for(;v%p<1;V+=e)v/=p;
,.Experimente online!
fonte
-D=F(v,V,e)for(;v%p<1;V+=e)v/=p;
(32 bytes) é usado (então 99 + 32 = 131); caso contrário, o código por si só faz pouco sentido.Geléia ,
1211 bytesExperimente online!
fonte
Python 2 , 110 bytes
Experimente online!
Toma entrada como
[num1, num2, den1, den2]
. Usa um número complexor
para armazenar as entradas de primep
para os dois racionais e(r*r).imag/2
extrair seu produtor.real*r.imag
na soma geralt
. Adicionar1j**i
parai=0,1,2,3
cada combinação de incremento ou decremento da parte real ou imaginária dos quatro números de entrada.O Bubbler salvou 2 bytes combinando os valores iniciais
p=t=2
.fonte
p=t=2
em vez dep=2;t=0
uma vezt.real
é ignorada qualquer maneira ( TIO ).Wolfram Language (Mathematica) , 55 bytes
Experimente online!
fonte
JavaScript (Node.js) ,
104...10094 bytesExperimente online!
Passe os números como uma matriz de [Num1, Den1, Num2, Den2].
Obrigado por Arnauld por corrigir os desaparecidos
F=
sem bytes extras e mais 2 bytes a menos.Explicação e não destruídos
fonte
J , 19 bytes
Experimente online!
Explicação:
Um verbo diádico, os argumentos estão do lado esquerdo e do lado direito
fonte
Stax , 11 bytes
Execute e depure
A representação ascii correspondente do mesmo programa é essa.
Basicamente, obtém os expoentes da fatoração principal para cada parte. É preciso a diferença de cada par, depois do produto e, finalmente, soma todos os resultados.
fonte
Python 2 ,
133127 bytesExperimente online!
Roubou a condição de loop da submissão do xnor .
Obrigado pelo conselho de @mathmandan para alterar a função em um programa (Sim, ele realmente salvou alguns bytes).
Solução obsoleta e incorreta (124 bytes):
fonte
p
vai testar valores não primos como 9?return
porprint
e também pode salvar os espaços de indentação se escrever como um programa em vez de uma função.eval()
, a menos que a entrada da função em si seja uma string).Haskell , 153 bytes
Experimente online! Exemplo de utilização para
20 · 14/15
:(2%) [20,1,14,15]
.fonte