Математичний спосіб порівняння пари з 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

Чи можете ви додати ті випадки, коли пари були різними і твердження було правдивим ?
Eritrean

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)

Якщо два поліноми рівнозначні, вони повинні мати однакові корені (знову ж таки, ЗВТ). Таким чином, все, що нам потрібно зробити, - порівняти коефіцієнти утворених многочленів.

Отже, якщо

(-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рівнозначні.

Чи варто того?

З практичної точки зору, давайте подивимось, чи справді це більш ефективно, ніж перевірка грубої сили, як показано в ОП.

Перша перевірка: підсумовуйте та порівняйте. Для цього потрібно 4 загальних доповнення та 1 перевірка на рівність.

Перевірка всього = 5; Всього працює = 5

Друга перевірка: продукт, сума та порівняння. Для цього потрібно 6 загальних множин, 4 сумарних додавання та 1 перевірка рівності.

Перевірка загальна = 11; Всього працює = 16

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

Перевірка всього = 5; Всього працює = 21

Додаючи дві логічні операції AND, загальна кількість двійкових операцій для "коефіцієнтів генерованого поліноміального підходу" вимагає лише:

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, погодився. Ви можете сказати те саме про цей підхід, тільки не настільки, наскільки це можливо при грубому підході. Насправді, я думаю, що підхід з грубою силою для більшості випадків був би таким же швидким чи швидшим через коротке замикання. ТБН, Якби я це кодував, я, мабуть, застосував би грубу силу підходу, оскільки це в багато разів простіше зрозуміти.
Джозеф Вуд

-1

Якщо вам дозволено сортувати (a1 <= b1 <= c1 і a2 <= b2 <= c2), спробуйте порівняти 2 ^ a1 * 3 ^ b1 * 5 ^ c1 з 2 ^ a2 * 3 ^ b2 * 5 ^ c2 (використовуючи прості числа 2, 3, 5 як основу)


чи можете ви пояснити цю відповідь, будь ласка?
AceVentuRa

1
Якщо сортування дозволено, то все, що вам потрібно зробити, - це порівняти, якщо a1 == b1 і a2 = b2 і a3 == b3.
JB Nizet

Я розумію, його просили математичним шляхом ...
Бруно

@Bruno Я впевнений, що те, що мав на увазі мій вчитель, - це мати ifвисловлювання і ifнаписати математичний спосіб їх порівняння, не сортуючи.
AceVentuRa

Як ви використовуєте праймери з подвійними значеннями, які можуть мати дріб.
WJS
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.