Confrontando due prodotti di elenchi di numeri interi?


10

Supponiamo di avere due elenchi di numeri interi positivi di virilità limitata e prendo il prodotto di tutti gli elementi di ciascun elenco. Qual è il modo migliore per determinare quale prodotto è più grande?

Ovviamente posso semplicemente calcolare ogni prodotto, ma spero che ci sia un approccio più efficiente, poiché il numero di cifre nei prodotti aumenterà linearmente con il numero di termini, in modo che l'intero calcolo sia quadratico.

Se aggiungessi invece di moltiplicare, potrei usare una "strategia zippering" per aggiungere in modo incrementale voci dal primo elenco e sottrarre dal secondo, aggirando la necessità di calcolare le somme (grandi) complessive. Le tecniche analoghe per i prodotti sarebbero la somma dei logaritmi delle voci, ma il problema ora è che il calcolo dei registri richiede l'uso di aritmetica inesatta. A meno che non ci sia modo di dimostrare che l'errore numerico è irrilevante?


Se conosciamo il valore intero massimo e che è indipendente da n (cioè una costante k), allora possiamo creare una tabella di ricerca dei fattori di tutti i numeri da 1 a k. Ora penso che se scrivi tutto in base [prodotto di fattori] diventa lineare poiché puoi calcolare i prodotti in tempo lineare con quella base quindi confrontare ogni cifra (a partire dalla cifra di ordine più alto) a turno fino a quando una è maggiore dell'altra. I dettagli sono un po 'complicati, ma penso che dovrebbe funzionare se k è una costante.
Phylliida,

Preferirei dire che la tecnica analoga per i prodotti consiste nel mantenere un numero razionale uguale ai primi elementi del primo elenco diviso per i primi elementi del secondo (più la gestione di s). Ma questo non è davvero utile perché se tutti i numeri sono coperti, calcolerà entrambi i prodotti. | Inoltre non sono sicuro che l'algoritmo ingenuo sia quadratico. Il calcolo di un prodotto di numeri interi di dimensione può richiedere fino a C ( m , m ) + C ( m , 2 m ) + . . . + C ( m , ( nn m0nm dove C ( x , y ) è il costo della moltiplicazione dinumeri interi a x bit con numeri interi a y bit. A meno che non si consideri che i prodotti rientrano anche nel formatoC(m,m)+C(m,2m)+...+C(m,(n1)m)C(x,y)xy
xavierm02

1
Potrebbe esserci un modo per estendere il metodo in math.stackexchange.com/a/1081989/10385
xavierm02

Un miglioramento dell'approccio ingenuo: contare il numero di occorrenze di ciascun fattore (in tempo lineare) e calcolare il prodotto solo alla fine, utilizzando un algoritmo di alimentazione efficiente. Funziona nel tempo , che è O ( nO(M(n)) usando l'attuale metodo asintoticamente più veloce. O(nlogn2O(logn))
Emil Jeřábek,

2
Penserò alla precisione necessaria per i registri. In realtà potrebbe essere più efficiente.
Emil Jeřábek,

Risposte:


6

(Comprendo la descrizione del problema in modo che i numeri di input siano delimitati da una costante, quindi non traccerò la dipendenza dal limite.)

Il problema è risolvibile nel tempo lineare e nello spazio logaritmico usando somme di logaritmi. Più in dettaglio, l'algoritmo è il seguente:

  1. Utilizzando i contatori binari, contare i numeri di occorrenze di ciascun possibile numero di input in entrambi gli elenchi.

Questo richiede tempo e i contatori usano lo spazio O ( log n ) , poiché ogni contatore è limitato da n in valore.O(n)O(logn)n

Sia i numeri primi sotto il limite O ( 1 ) . Distribuendo ogni contatore per un numero di una per i fattori primi di un (con adeguate molteplicità), e sottraendo i conteggi per una lista dall'altro lista, si ottiene la seguente nel tempo O ( log n ) :p1,,pkO(1)aaO(logn)

  1. Calcola numeri interi con bit O ( log n ) in modo tale che il problema sia equivalente alla determinazione del segno di Λ : = k i = 1 β i log p i .β1,,βkO(logn)Λ:=i=1kβilogpi

  2. Se , rispondi che i prodotti sono uguali.β1==βk=0

Altrimenti . Con il teorema di Baker , possiamo abbassare il limite | Λ | > 2 - C log n per una certa costante C . Pertanto, quanto segue calcola correttamente il segno di Λ :Λ0

|Λ|>2Clogn
CΛ
  1. Emette il segno di , dove π i è un'approssimazione del log p i in m : = C log n + k + 1 bit di precisione.i=1kβiπiπilogpim:=Clogn+k+1

M(m)mM(m)=O(mlogm2O(logm))O(m2)logpimO(M(m)logm)iβiπiO(M(m))O(M(m)logm)O(lognpoly(loglogn))

O(n)


Grazie! Dovrò esaminare i dettagli in seguito, ma questo sembra molto promettente!
user168715,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.