On m'a confié la tâche de comparer une paire de 3 variables doubles positives, tout en ignorant leur ordre, en Java. J'ai fait ce qui suit:
if ((a1 == a2 && b1 == b2 && c1 == c2) ||
(a1 == a2 && b1 == c2 && c1 == b2) ||
(a1 == b2 && b1 == a2 && c1 == c2) ||
(a1 == b2 && b1 == c2 && c1 == a2) ||
(a1 == c2 && b1 == a2 && c1 == b2) ||
(a1 == c2 && b1 == b2 && c1 == a2))
// if true
J'ai entendu le professeur dire qu'il existe une façon mathématique de comparer cette paire de 3 nombres.
Jusqu'à présent, j'ai essayé de comparer leur addition, leur soustraction, la somme de leur puissance par 2 mais j'ai toujours trouvé un cas où la paire était différente et l'affirmation était vraie.
Des idées?
ÉDITER:
J'ai déjà envoyé le devoir et le professeur a dit que ma réponse était vraie. Je demande par curiosité.
Réponses:
TL; DR
Comparez la somme de chaque triplet, le produit de chaque triplet et la somme des produits de toutes les combinaisons possibles de chaque triplet.
The Nitty Gritty
Par le théorème fondamental de l'algèbre , pour un polynôme de degré N, nous devons avoir N racines.
En utilisant ce fait, nous laissons nos zéros
a1, a2, and a3
. Maintenant, nous trouvons les coefficients de ce polynôme.Si deux polynômes sont équivalents, ils doivent avoir les mêmes racines (là encore par l'ALE). Il suffit donc de comparer les coefficients des polynômes générés.
Donc si,
Et
Et
Ensuite, nous pouvons conclure les triplets
a1, a2, a3
etb1, b2, b3
sont équivalents.Est-ce que ça vaut le coup?
D'un point de vue pratique, voyons si cela est en effet plus efficace que la vérification par force brute comme illustré par l'OP.
Première vérification: additionner et comparer. Cela nécessite 4 ajouts au total et 1 vérification de l'égalité.
Deuxième vérification: produit, somme et comparaison. Cela nécessite 6 multiplications totales, 4 additions totales et 1 vérification de l'égalité.
Troisième vérification: produit et comparaison. Cela nécessite 4 multiplications totales et 1 vérification de l'égalité.
En additionnant les deux opérations ET logiques, le nombre total d'opérations binaires pour les "coefficients de l'approche polynomiale générée" ne nécessite que:
La vérification de la force brute nécessite 18 vérifications d'égalité totale, 12 comparaisons ET logiques et 5 comparaisons OU logiques pour un total de:
Donc, à proprement parler , la réponse est oui, les "coefficients de l'approche polynomiale générée" sont en effet plus efficaces. Cependant, comme le souligne @WJS, l'approche par force brute a beaucoup plus de possibilités de court-circuit et s'exécute donc aussi / plus efficacement que l'approche mathématique.
Pour une précision totale
Nous ne pouvons pas ignorer la vérification de la somme des produits de toutes les combinaisons possibles de chaque triplet. Si nous laissons cela de côté, il existe d'innombrables exemples où cela échoue. Considérez
(23, 32, 45)
et(24, 30, 46)
* :Ils ne sont pas équivalents mais donnent la même somme et le même produit. Ils ne donnent cependant pas la même somme des produits de toutes les combinaisons possibles:
* Si vous êtes curieux de savoir comment dériver un exemple similaire à celui ci-dessus, générez d'abord toutes les partitions entières d'un entier M de longueur 3, prenez leur produit, trouvez les doublons et choisissez une paire.
la source
Si vous êtes autorisé à trier (a1 <= b1 <= c1 et a2 <= b2 <= c2), essayez de comparer 2 ^ a1 * 3 ^ b1 * 5 ^ c1 avec 2 ^ a2 * 3 ^ b2 * 5 ^ c2 (en utilisant les nombres premiers 2, 3, 5 comme base)
la source
if
déclaration et en celaif
d'écrire la manière mathématique de les comparer, sans trier.