Supposons que j'ai deux listes d'entiers positifs de manitude bornée et que je prenne le produit de tous les éléments de chaque liste. Quelle est la meilleure façon de déterminer quel produit est plus grand?
Bien sûr, je peux simplement calculer chaque produit, mais j'espère qu'il existe une approche plus efficace, car le nombre de chiffres dans les produits augmentera linéairement avec le nombre de termes, de sorte que l'ensemble du calcul est quadratique.
Si j'ajoutais au lieu de multiplier, je pourrais utiliser une "stratégie de fermeture éclair" consistant à ajouter progressivement des entrées de la première liste et à soustraire de la seconde, en contournant la nécessité de calculer les (grandes) sommes globales. Les techniques analogues pour les produits seraient de résumer les logarithmes des entrées, mais le problème est maintenant que le calcul des journaux nécessite l'utilisation d'une arithmétique inexacte. À moins qu'il n'y ait un moyen de prouver que l'erreur numérique n'est pas pertinente?
la source
Réponses:
(Je comprends la description du problème afin que les nombres en entrée soient limités par une constante, donc je ne suivrai pas la dépendance à la limite.)
Le problème peut être résolu dans le temps linéaire et l'espace logarithmique en utilisant des sommes de logarithmes. Plus en détail, l'algorithme est le suivant:
Cela prend du temps et les compteurs utilisent l'espace O ( log n ) , car chaque compteur est limité par n en valeur.O ( n ) O ( logn ) n
Soit les nombres premiers sous la limite O ( 1 ) . En distribuant chaque compteur d'un nombre a aux facteurs premiers de a (avec la multiplicité appropriée), et en soustrayant les nombres pour une liste de l'autre liste, nous obtenons ce qui suit dans le temps O ( log n ) :p1, … , Pk O ( 1 ) une une O(logn)
Sinon . Par le théorème de Baker , nous pouvons réduire la borne | Λ | > 2 - C log n pour une certaine constante C . Ainsi, ce qui suit calcule correctement le signe de Λ :Λ≠0
la source