La più piccola somma dei divisori

0

Domanda

Dato un intero n <= 10^18, che è il prodotto dei numeri di Fibonacci, ho bisogno di fattore in detto i numeri di Fibonacci.

Ogni fattorizzazione ha un punteggio, che è uno in meno rispetto al conteggio dei fattori più la somma degli indici dei fattori che la sequenza di Fibonacci che inizia con f(1) = 1, f(2) = 2.

Se più di tali fattorizzazioni sono possibili, ho bisogno di fattorizzazione che riduce al minimo il punteggio.

Esempio:

104 = 13 * 8 o 104 = 13 * 2 * 2 * 2

f(6) = 13, f(5) = 8, f(2) = 2

Per 104 = 13*8 = f(6)*f(5), abbiamo un conteggio di 2, indici di 6 & 5, dandoci 2 + 6 + 5 - 1 = 12.

Per 104 = 13 * 2 * 2 * 2 = f(6) * f(2) * f(2) * f(2), abbiamo un conteggio di 4 e indici di 6, 2, 2, 2, dandoci 4 + 6 + 2 + 2 + 2 - 1 = 15.

Dovremmo scegliere 13 * 8, in quanto ha il punteggio più basso.

Il problema più grande che ho incontrato è quando abbiamo un numero come 1008, che è divisibile per 144 e 21, ma ha bisogno di essere diviso da 21 a causa 1008 % 7 == 0. Perché il mio programma è il primo dividendo da grandi numeri, numero 144 è 'rubare' 3 dal numero 21, quindi il mio programma non trova una soluzione.

algorithm division fibonacci python
2021-11-21 13:44:33
1

Migliore risposta

0

Carmichael teorema dimostra che ogni numero di Fibonacci dopo 144 ha almeno un primo divisore che non divide precedente numero di Fibonacci.

Non ci sono molti numeri di Fibonacci al di sotto dei 10^18; meno di 90.

Creare un array di tutti i numeri di Fibonacci <= 10^18.

Dato un input n, che è il prodotto dei numeri di Fibonacci, la sua fattorizzazione in numeri di Fibonacci deve includere ogni numero di Fibonacci sopra 144 che divide, ripetuta tante volte quante si divide.

Passare attraverso i vostri numeri di Fibonacci, in ordine decrescente e mantenere il dividendo n per ogni numero che divide, fino ad arrivare a 144.

Ora bisogna stare attenti, perché due numeri di Fibonacci non hanno fattori primi non visto nei precedenti numeri di Fibonacci. Queste sono le 8 e 144. Da 8 a 2^a 3 e 2 è un numero di Fibonacci, non è possibile rendere il vostro numero di unfactorable in numeri di Fibonacci, prendendo la 8. Sotto ottimizzazione, si sceglie sempre la 8.

Quindi 144 è l'unico fattore che potrebbe essere necessario rifiutare per un piccolo fattore. Questo può accadere solo se il 34 o il 21 fattori, e il 144 elimina un bisogno di 2 o 3.

34 = 2 * 17, 21 = 3 * 7

Che stato prolisso, ma ci fa un semplice approccio.

Passare attraverso i numeri di Fibonacci <= n in ordine decrescente fino ad arrivare a 144, quindi passare al 34, 21, poi di nuovo a 144 e scendendo a 2.

Questo vi darà l'ottimale fattorizzazione sotto il tuo strano segnando schema.

----- a questo fine ----- [679891637638612258, 420196140727489673, 259695496911122585, 160500643816367088, 99194853094755497, 61305790721611591, 37889062373143906, 23416728348467685, 14472334024676221, 8944394323791464, 5527939700884757, 3416454622906707, 2111485077978050, 1304969544928657, 806515533049393, 498454011879264, 308061521170129, 190392490709135, 117669030460994, 72723460248141, 44945570212853, 27777890035288, 17167680177565, 10610209857723, 6557470319842, 4052739537881, 2504730781961, 1548008755920, 956722026041, 591286729879, 365435296162, 225851433717, 139583862445, 86267571272, 53316291173, 32951280099, 20365011074, 12586269025, 7778742049, 4807526976, 2971215073, 1836311903, 1134903170, 701408733, 433494437, 267914296, 165580141, 102334155, 63245986, 39088169, 24157817, 14930352, 9227465, 5702887, 3524578, 2178309, 1346269, 832040, 514229, 317811, 196418, 121393, 75025, 46368, 28657, 17711, 10946, 6765, 4181, 2584, 1597, 987, 610, 377, 233, 34, 21, 144, 89, 55, 13, 8, 5, 3, 2]

2021-11-21 22:54:18

Il motivo per cui facciamo 34 e 21 ordine sono per garantire che l'utilizzo di 144s non 'utilizzare' il 2s e 3s abbiamo bisogno di dividere il 17 e 7s che si può fare solo utilizzando 34s e 21s.
Dave

In altre lingue

Questa pagina è in altre lingue

Русский
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................