in fattori tutti i numeri nell'intervallo da 1 a 10 . Utilizzando una modifica di un setaccio di Eratostene, è possibile calcolare tutti i numeri da 1 a n
nel tempo O(n*log n)
(penso che sia un po 'meglio, O(n*(log log n)²)
o giù di lì) utilizzando lo spazio O(n*log log n)
. Meglio di quello è probabilmente la creazione di un array di solo i fattori primi più piccoli.
// Not very optimised, one could easily leave out the even numbers, or also the multiples of 3
// to reduce space usage and computation time
int *spf_sieve = malloc((limit+1)*sizeof *spf_sieve);
int root = (int)sqrt(limit);
for(i = 1; i <= limit; ++i) {
spf_sieve[i] = i;
}
for(i = 4; i <= limit; i += 2) {
spf_sieve[i] = 2;
}
for(i = 3; i <= root; i += 2) {
if(spf_sieve[i] == i) {
for(j = i*i, step = 2*i; j <= limit; j += step) {
if (spf_sieve[j] == j) {
spf_sieve[j] = i;
}
}
}
}
Per fattorizzare un numero n > 1
utilizzando tale setaccio, guardare in alto il suo fattore primo più piccolo p
, determinare la sua molteplicità nella fattorizzazione di n
(sia guardando in su in modo ricorsivo, o semplicemente dividendo fino a quando non lo fa in modo uniforme p
divide il cofattore rimanente, che è più veloce dipende) e il cofattore. Mentre il cofattore è più grande di 1, cerca il fattore primo successivo e ripeti.
creare una mappa da numeri primi di interi
passare attraverso entrambi gli array, per ogni numero in N
, aggiungere l'esponente di ogni primo nella sua fattorizzazione al valore nella mappa, per i numeri in D
, sottrarre.
Go attraverso la mappa, se l'esponente del primo è positivo, immettere p^exponent
alla matrice N
(potrebbe essere necessario dividere che in diversi indici se l'esponente è troppo grande, e per piccoli valori, combinare diversi numeri primi in una voce - ci sono 664579 numeri primi inferiori a 10 , quindi i 100.000 slot negli array potrebbero non essere sufficienti per memorizzare ogni primo apparente con la potenza corretta), se l'esponente è negativo, fare lo stesso con l'array D
, se è 0, ignora quel numero primo.
Gli slot inutilizzati in N
o D
vengono quindi impostati su 1.
http://stackoverflow.com/questions/12359785/reducing -interferenza-frazioni-algoritmo-soluzione-spiegazione –
Non sai perché hai postato una domanda con un link alla risposta. –
@RaymondChen: Non avevo il codice della soluzione quando ho postato la domanda e non ho capito il codice della soluzione quando l'ho ricevuta, quindi ho inviato una domanda separata per la spiegazione e le ho interconnesse. –