Méthode mathématique pour comparer une paire de 3 variables


14

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é.


Je vote pour clore cette question. Je pense que répondre à cette question aide l'affiche à tricher. Si l'enseignant dit qu'il y a une réponse, il la révélera sûrement à temps. Ce n'est pas le lieu d'interférer
ControlAltDel

@ControlAltDel Ce n'est pas de la triche parce que j'ai déjà envoyé le devoir ... Je demande par curiosité
AceVentuRa

2
Depuis quand n'aide-t-on pas les gens à faire leurs devoirs?
WJS

Pouvez-vous ajouter les cas où la paire était différente et l'affirmation était vraie ?
érythréen

2
@ControlAltDel Ce n'est pas hors sujet parce que l'OP indique clairement quel code ils ont essayé et quelle est leur difficulté à le résoudre. Il n'y a pas d'interdiction catégorique des questions sur les devoirs. Voir le point # 3 du guide sur le sujet .
EJoshuaS

Réponses:


12

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.

(x - a1) * (x - a2) * (x - a3)
(x^2 - (a1 + a2) * x + a1a2) * (x - a3) 
x^3 - (a1 + a2) * x^2 + (a1a2) * x - a3 * x^2 + (a1a3 + a2a3) * x - a1a2a3

x^3 + (-1 * (a1 + a2 + a3)) * x^2 + (a1a2 + a1a3 + a2a3) * x + (-1 * a1a2a3)

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,

(-1 * (a1 + a2 + a3) == (-1 * (b1 + b2 + b3))
      ---equivalently---
a1 + a2 + a3 == b1 + b2 + b3

Et

(a1a2 + a1a3 + a2a3) == (b1b2 + b1b3 + b2b3)

Et

-1 * a1a2a3 == -1 * b1b2b3
      ---equivalently---
a1a2a3 == b1b2b3

Ensuite, nous pouvons conclure les triplets a1, a2, a3et b1, b2, b3sont é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é.

Vérifier le total = 5; Total cumulé = 5

Deuxième vérification: produit, somme et comparaison. Cela nécessite 6 multiplications totales, 4 additions totales et 1 vérification de l'égalité.

Chèque total = 11; Total cumulé = 16

Troisième vérification: produit et comparaison. Cela nécessite 4 multiplications totales et 1 vérification de l'égalité.

Vérifier le total = 5; Total cumulé = 21

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:

23 opérations binaires

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:

35 opérations binaires

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)* :

23 + 32 + 45 = 100
24 + 30 + 46 = 100

23 * 32 * 45 = 33120
24 * 30 * 46 = 33120

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:

23 * 32 + 23 * 45 + 32 * 45 = 3211
24 * 30 + 24 * 46 + 30 * 46 = 3204

* 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.


1
Je souhaite que nous puissions utiliser LaTeX
Joseph Wood

1
Mais dans votre méthode FTA, tous les tests doivent être effectués. Dans l'approche par force brute, certaines des comparaisons seront court-circuitées. Ce n'est donc pas aussi mauvais qu'il n'y paraît.
WJS

2
@WJS, d'accord. Vous pouvez dire la même chose à propos de cette approche, mais pas autant que vous le pouvez avec l'approche par force brute. En fait, je parie que l'approche par force brute dans la majorité des cas serait aussi rapide ou plus rapide à cause du court-circuit. TBH, Si je devais coder cela, j'utiliserais probablement l'approche par force brute car elle est beaucoup plus facile à comprendre.
Joseph Wood

-1

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)


pouvez-vous expliquer cette réponse, s'il vous plaît?
AceVentuRa

1
Si le tri est autorisé, il vous suffit de comparer si a1 == b1 et a2 = b2 et a3 == b3.
JB Nizet

Je comprends qu'on lui a demandé une méthode mathématique ...
Bruno

@Bruno Je suis sûr que ce que mon professeur voulait dire était d'avoir une ifdéclaration et en cela ifd'écrire la manière mathématique de les comparer, sans trier.
AceVentuRa

Comment utilisez-vous des nombres premiers avec des valeurs doubles qui peuvent avoir une fraction.
WJS
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.