Ero a casa di un amico per cena e mi hanno suggerito l'idea di uno "spazio vettoriale primo fattore". In questo spazio interi positivi sono espressi come vettore tale che l' n -esimo elemento del vettore è il numero di volte che il n ° divide primi il numero. (Nota che questo significa che i nostri vettori hanno un numero infinito di termini.) Ad esempio 20 è
2 0 1 0 0 0 ...
Perché la sua scomposizione in fattori primi è 2 * 2 * 5 .
Poiché la scomposizione in fattori primi è unica, ogni numero corrisponde a un vettore.
Siamo in grado di aggiungere vettori aggiungendo a coppie le loro voci. Ciò equivale a moltiplicare i numeri a cui sono associati. Possiamo anche fare una moltiplicazione scalare, che è simile all'aumento del numero associato ad una potenza.
Il problema è che questo spazio non è in realtà uno spazio vettoriale perché non ci sono inversioni. Se andiamo avanti, aggiungiamo gli inversi e chiudiamo lo spazio vettoriale, ora abbiamo un modo per esprimere ogni numero razionale positivo come vettore. Se manteniamo il fatto che l'aggiunta vettoriale rappresenta la moltiplicazione. Quindi l'inverso di un numero naturale è reciproco.
Ad esempio il numero 20 aveva il vettore
2 0 1 0 0 0 ...
Quindi la frazione 1/20 è il suo inverso
-2 0 -1 0 0 0 ...
Se volessimo trovare il vettore associato a una frazione come 14/15 , ne troveremmo 14
1 0 0 1 0 0 ...
e 1/15
0 -1 -1 0 0 0 ...
e moltiplicarli eseguendo l'aggiunta vettoriale
1 -1 -1 1 0 0 ...
Ora che abbiamo uno spazio vettoriale, possiamo modificarlo per formare uno spazio prodotto interno dandogli un prodotto interno. Per fare ciò rubiamo il prodotto interno che gli spazi vettoriali sono dati in modo classico. Il prodotto interno di due vettori è definito come la somma della moltiplicazione a coppie dei loro termini. Ad esempio 20 · 14/15 verrebbe calcolato come segue
20 = 2 0 1 0 0 0 ...
14/15 = 1 -1 -1 1 0 0 ...
2 0 -1 0 0 0 ... -> 1
Come altro esempio il prodotto 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
Il tuo compito è quello di implementare un programma che esegue questo prodotto punto. Dovrebbe prendere due numeri razionali positivi tramite una coppia di numeri interi positivi (numeratore e denominatore) o un tipo razionale (i float non sono consentiti, perché causano problemi di precisione e divisibilità) e dovrebbero generare un numero intero che rappresenta il punto prodotto dei due ingressi.
Si tratta di code-golf, quindi le risposte verranno classificate in byte con un numero inferiore di byte migliori.
Casi test
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