Modo matematico per confrontare una coppia di 3 variabili


14

Mi è stato assegnato il compito di confrontare una coppia di 3 doppie variabili positive, ignorando il loro ordine, in Java. Ho fatto quanto segue:

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

Ho sentito dall'insegnante che esiste un modo matematico di confrontare questa coppia di 3 numeri.

Finora, ho provato a confrontare la loro addizione, sottrazione, la somma della loro potenza per 2, ma ho sempre trovato un caso in cui la coppia era diversa e l'affermazione era vera.

Qualche idea?

MODIFICARE:

Ho già inviato il compito e l'insegnante ha detto che la mia risposta era vera. Sto chiedendo per curiosità.


Sto votando per chiudere questa domanda, penso che rispondere a questa domanda sia di aiuto al poster nel tradire. Se l'insegnante dice che c'è una risposta, sicuramente la rivelerà in tempo. Non è il posto dove interferire
ControlAltDel,

@ControlAltDel Non è un imbroglio perché ho già inviato il compito ... Lo sto chiedendo per curiosità
AceVentuRa

2
Da quando non aiutiamo la gente a fare i compiti?
WJS,

Puoi aggiungere quei casi in cui la coppia era diversa e l'affermazione era vera ?
Eritreo,

2
@ControlAltDel Non è fuori tema perché l'OP indica chiaramente quale codice hanno provato e quale è la loro difficoltà nel risolverlo. Non esiste un divieto categorico di domande sui compiti a casa. Vedi il punto 3 nella guida sull'argomento .
EJoshuaS - Ripristina Monica il

Risposte:


12

TL; DR

Confronta la somma di ogni tripletta, il prodotto di ciascuna tripletta e la somma dei prodotti di tutte le possibili combinazioni di ciascuna tripletta.

The Nitty Gritty

Dal teorema fondamentale dell'algebra , per un polinomio di grado N, dobbiamo avere N radici.

Usando questo fatto lasciamo essere i nostri zeri a1, a2, and a3. Ora, troviamo i coefficienti di questo polinomio.

(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)

Se due polinomi sono equivalenti, devono avere le stesse radici (di nuovo dall'ALS). Quindi tutto ciò che dobbiamo fare è confrontare i coefficienti dei polinomi generati.

Quindi se,

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

E

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

E

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

Quindi possiamo concludere le terzine a1, a2, a3e b1, b2, b3sono equivalenti.

Ne vale la pena?

Da un punto di vista pratico, vediamo se questo è davvero più efficiente del controllo della forza bruta, come illustrato dall'OP.

Primo controllo: somma e confronto. Ciò richiede 4 aggiunte totali e 1 controllo per l'uguaglianza.

Verifica totale = 5; Totale parziale = 5

Secondo controllo: prodotto, somma e confronto. Ciò richiede 6 moltiplicazioni totali, 4 aggiunte totali e 1 controllo per l'uguaglianza.

Verifica totale = 11; Totale parziale = 16

Terzo controllo: prodotto e confronto. Ciò richiede 4 moltiplicazioni totali e 1 controllo per l'uguaglianza.

Verifica totale = 5; Totale parziale = 21

Aggiungendo le due operazioni logiche AND, il numero totale di operazioni binarie per i "coefficienti dell'approccio polinomiale generato" richiede solo:

23 operazioni binarie

Il controllo della forza bruta richiede 18 controlli di uguaglianza totale, 12 confronti logici AND e 5 confronti logici OR per un totale di:

35 operazioni binarie

Quindi, a rigor di termini , la risposta è sì, i "coefficienti dell'approccio polinomiale generato" sono effettivamente più efficienti. Tuttavia, come sottolinea @WJS, l'approccio della forza bruta ha molte più opportunità di cortocircuito e quindi esegue come / in modo più efficiente dell'approccio matematico.

Per completezza completa

Non possiamo saltare la verifica della somma dei prodotti di tutte le possibili combinazioni di ciascuna tripletta. Se lo omettiamo, ci sono innumerevoli esempi in cui questo fallisce. Considera (23, 32, 45)e (24, 30, 46)* :

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

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

Non sono equivalenti ma danno la stessa somma e lo stesso prodotto. Tuttavia non forniscono la stessa somma dei prodotti di tutte le combinazioni possibili:

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

* Nel caso in cui uno sia curioso di come ottenere un esempio simile a quello sopra, prima genera tutte le partizioni intere di un intero M di lunghezza 3, prendi il loro prodotto, trova i duplicati e scegli una coppia.


1
Vorrei che potessimo usare LaTeX
Joseph Wood il

1
Ma nel tuo metodo FTA, tutti i test devono essere fatti. Nell'approccio della forza bruta, alcuni dei confronti saranno messi in corto circuito. Quindi non è così male come sembra.
WJS,

2
@WJS, d'accordo. Puoi dire la stessa cosa di questo approccio solo nella misura in cui riesci con l'approccio della forza bruta. In effetti, scommetto che l'approccio della forza bruta per la maggior parte dei casi sarebbe altrettanto veloce o più veloce a causa del corto circuito. TBH, Se dovessi codificarlo, probabilmente utilizzerei l'approccio della forza bruta poiché è molte volte più facile da capire.
Joseph Wood,

-1

Se ti è permesso ordinare (a1 <= b1 <= c1 e a2 <= b2 <= c2) prova a confrontare 2 ^ a1 * 3 ^ b1 * 5 ^ c1 con 2 ^ a2 * 3 ^ b2 * 5 ^ c2 (usando i numeri primi 2, 3, 5 come base)


puoi spiegare questa risposta, per favore?
AceVentuRa

1
Se l'ordinamento è consentito, è sufficiente confrontare se a1 == b1 e a2 = b2 e a3 == b3.
JB Nizet,

Capisco che è stato chiesto un modo matematico ...
Bruno,

@Bruno Sono sicuro che ciò che il mio insegnante intendeva era avere una ifdichiarazione e in questo ifscrivere il modo matematico di confrontarli, senza ordinare.
AceVentuRa,

Come usi i numeri primi con valori doppi che possono avere una frazione.
WJS,
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.