Математический способ сравнения пары из 3 переменных

14

Мне дали задание сравнить пару из 3 положительных двойных переменных, игнорируя их порядок в Java. Я сделал следующее:

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

Я слышал от учителя, что есть математический способ сравнения этой пары из 3 чисел.

До сих пор я пытался сравнить их сложение, вычитание, сумму их мощности на 2, но я всегда находил случай, когда пара отличалась, и утверждение было верным.

Любые идеи?

РЕДАКТИРОВАТЬ:

Я уже отправил задание, и учитель сказал, что мой ответ был правдой. Я спрашиваю из любопытства.

Эйс Вентура
источник
Я голосую, чтобы закрыть этот вопрос. Думаю, что ответ на этот вопрос поможет автору в мошенничестве. Если учитель говорит, что есть ответ, он обязательно покажет его вовремя. Это не место, чтобы вмешиваться
ControlAltDel
@ControlAltDel Это не обман, потому что я уже отправил назначение ... Я спрашиваю из любопытства
AceVentuRa
2
С каких это пор мы не помогаем людям с домашним заданием?
WJS
Можете ли вы добавить те случаи, когда пара была другой, и утверждение было правдой ?
Эритрейская
2
@ControlAltDel Это не вне темы, потому что ОП четко указывает, какой код они пробовали и в чем их сложность при его решении. Категорического запрета на вопросы по домашним заданиям нет. См. Пункт № 3 в тематическом руководстве .
EJoshuaS - Восстановить Монику

Ответы:

12

TL; DR

Сравните сумму каждого триплета, произведение каждого триплета и сумму произведений всех возможных комбинаций каждого триплета.

Нитти Гритти

Согласно основной теореме алгебры , для многочлена степени N мы должны иметь N корней.

Используя этот факт, мы позволяем нашим нулям быть a1, a2, and a3. Теперь мы найдем коэффициенты этого многочлена.

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

Если два полинома эквивалентны, они должны иметь одинаковые корни (опять-таки в FTA). Таким образом, все, что нам нужно сделать, это сравнить коэффициенты сгенерированных полиномов.

Так что если,

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

А также

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

А также

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

Тогда мы можем заключить триплеты a1, a2, a3и b1, b2, b3эквивалентны.

Стоит ли оно того?

С практической точки зрения, давайте посмотрим, действительно ли это более эффективно, чем проверка методом грубой силы, как показано на OP.

Первая проверка: сумма и сравнение. Для этого требуется 4 полных дополнения и 1 проверка на равенство.

Общая сумма проверки = 5; Промежуточный итог = 5

Вторая проверка: продукт, сумма и сравнение. Для этого требуется 6 полных умножений, 4 полных сложения и 1 проверка на равенство.

Общее количество проверок = 11; Промежуточный итог = 16

Третья проверка: продукт и сравнение. Для этого требуется 4 полных умножения и 1 проверка на равенство.

Общая сумма проверки = 5; Промежуточный итог = 21

При добавлении двух логических операций И ​​общее число двоичных операций для «коэффициентов сгенерированного полиномиального подхода» требует только:

23 бинарных операции

Проверка грубой силы требует 18 проверок на полное равенство, 12 логических сравнений И и 5 логических сравнений ИЛИ в общей сложности:

35 бинарных операций

Так что, строго говоря , ответ - да, «коэффициенты порожденного полиномиального подхода» действительно более эффективны. Однако, как указывает @WJS, метод грубой силы имеет гораздо больше возможностей для короткого замыкания и, следовательно, выполняется как / более эффективно, чем математический подход.

Для полной тщательности

Мы не можем пропустить проверку суммы произведений всех возможных комбинаций каждого триплета. Если мы оставим это, есть бесчисленное множество примеров, когда это не удается. Рассмотрим (23, 32, 45)и (24, 30, 46)* :

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

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

Они не эквивалентны, но дают одинаковую сумму и произведение. Однако они не дают одинаковую сумму произведений всех возможных комбинаций:

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

* Если вам интересно, как получить пример, аналогичный приведенному выше, сначала сгенерируйте все целочисленные разбиения целого числа M длины 3, возьмите их произведение, найдите дубликаты и выберите пару.

Джозеф Вуд
источник
1
Я хотел бы, чтобы мы могли использовать LaTeX
Джозеф Вуд
1
Но в вашем методе FTA все тесты должны быть выполнены. При использовании метода грубой силы некоторые сравнения будут короткими. Так что это не так плохо, как кажется.
WJS
2
@WJS, согласился. Вы можете сказать то же самое об этом подходе, но не в такой степени, как при использовании метода грубой силы. На самом деле, держу пари, что в большинстве случаев подход грубой силы будет таким же быстрым или быстрым из-за короткого замыкания. TBH, если бы я должен был это закодировать, я бы, вероятно, использовал бы метод грубой силы, так как это во много раз легче понять.
Джозеф Вуд
-1

Если вам разрешено сортировать (a1 <= b1 <= c1 и a2 <= b2 <= c2), попробуйте сравнить 2 ^ a1 * 3 ^ b1 * 5 ^ c1 с 2 ^ a2 * 3 ^ b2 * 5 ^ c2 (используя простые числа 2, 3, 5 в качестве основы)

Bruno
источник
Можете ли вы объяснить этот ответ, пожалуйста?
AceVentuRa
1
Если сортировка разрешена, то все, что вам нужно сделать, это сравнить, если a1 == b1 и a2 = b2 и a3 == b3.
JB
Я понимаю, что это было запрошено математическим путем ...
Бруно
@ Бруно Я уверен, что то, что имел в виду мой учитель, было иметь ifутверждение и в этом ifнаписать математический способ их сравнения без сортировки.
AceVentuRa
Как вы используете простые числа с двойными значениями, которые могут иметь дробь?
WJS