Мне дали задание сравнить пару из 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, но я всегда находил случай, когда пара отличалась, и утверждение было верным.
Любые идеи?
РЕДАКТИРОВАТЬ:
Я уже отправил задание, и учитель сказал, что мой ответ был правдой. Я спрашиваю из любопытства.
Ответы:
TL; DR
Сравните сумму каждого триплета, произведение каждого триплета и сумму произведений всех возможных комбинаций каждого триплета.
Нитти Гритти
Согласно основной теореме алгебры , для многочлена степени N мы должны иметь N корней.
Используя этот факт, мы позволяем нашим нулям быть
a1, a2, and a3
. Теперь мы найдем коэффициенты этого многочлена.Если два полинома эквивалентны, они должны иметь одинаковые корни (опять-таки в FTA). Таким образом, все, что нам нужно сделать, это сравнить коэффициенты сгенерированных полиномов.
Так что если,
А также
А также
Тогда мы можем заключить триплеты
a1, a2, a3
иb1, b2, b3
эквивалентны.Стоит ли оно того?
С практической точки зрения, давайте посмотрим, действительно ли это более эффективно, чем проверка методом грубой силы, как показано на OP.
Первая проверка: сумма и сравнение. Для этого требуется 4 полных дополнения и 1 проверка на равенство.
Вторая проверка: продукт, сумма и сравнение. Для этого требуется 6 полных умножений, 4 полных сложения и 1 проверка на равенство.
Третья проверка: продукт и сравнение. Для этого требуется 4 полных умножения и 1 проверка на равенство.
При добавлении двух логических операций И общее число двоичных операций для «коэффициентов сгенерированного полиномиального подхода» требует только:
Проверка грубой силы требует 18 проверок на полное равенство, 12 логических сравнений И и 5 логических сравнений ИЛИ в общей сложности:
Так что, строго говоря , ответ - да, «коэффициенты порожденного полиномиального подхода» действительно более эффективны. Однако, как указывает @WJS, метод грубой силы имеет гораздо больше возможностей для короткого замыкания и, следовательно, выполняется как / более эффективно, чем математический подход.
Для полной тщательности
Мы не можем пропустить проверку суммы произведений всех возможных комбинаций каждого триплета. Если мы оставим это, есть бесчисленное множество примеров, когда это не удается. Рассмотрим
(23, 32, 45)
и(24, 30, 46)
* :Они не эквивалентны, но дают одинаковую сумму и произведение. Однако они не дают одинаковую сумму произведений всех возможных комбинаций:
* Если вам интересно, как получить пример, аналогичный приведенному выше, сначала сгенерируйте все целочисленные разбиения целого числа M длины 3, возьмите их произведение, найдите дубликаты и выберите пару.
источник
Если вам разрешено сортировать (a1 <= b1 <= c1 и a2 <= b2 <= c2), попробуйте сравнить 2 ^ a1 * 3 ^ b1 * 5 ^ c1 с 2 ^ a2 * 3 ^ b2 * 5 ^ c2 (используя простые числа 2, 3, 5 в качестве основы)
источник
if
утверждение и в этомif
написать математический способ их сравнения без сортировки.