Алгоритми обчислення, якщо число кратне 3


13

Роблячи розумовий аналіз, можна:

  • Давши ціле k, підсумовуйте всі цифри (в базі 10), і якщо результат кратний 3, то k кратне 3.

Чи знаєте ви, що алгоритм працює аналогічно, але працює на двійкових цифрах (бітах)?

  • Спочатку я думав використати готові функції моєї мови для перетворення цілого числа в ascii для здійснення перетворення з бази 2 в базу 10, а потім застосувати трюк розумового числення. Але, звичайно, тоді я також міг би сам закодувати базову конверсію 2 до 10. Я ще цього не зробив, але спробую.

  • Тоді я подумав про евклідовий поділ у базі 2 ...

Однак мені цікаво, чи існують інші засоби, алгоритми.


Відповіді:


22

Розглянемо наступні два спостереження (залишені читачем як вправа):

  1. Рівні сили двох - 1 модуль 3.
  2. Непарні сили двох - -1 модуль 3.

Ми робимо висновок, що число (у двійковій) ділиться на три, якщо і лише тоді, коли сума бітів у парних позиціях дорівнює сумі бітів у непарних позиціях за модулем 3.


7
Це як правило, щоб ділити на 11 у десятковій частині.
Yuval Filmus

1
@YuvalFilmus: Точно. Я збирався додати ще одну вправу для читача, але вирішив проти.
mhum

3
Добре, а як дізнатися, чи число, записане шістнадцяткою, ділиться на 17 (десятковий)? Або 15 (десятковий) з цього питання? ;-)
фонбранд

33

А як щодо автоматичного обмеженого стану для роботи?

введіть тут опис зображення

Звичайно, магія просто обчислення по модулю 3. Додавання символу за рядком означає «двійкове значення» рядок йде від для до для . Отже, із стану та символу переходимо до стану , для та . Примітка - це рядок, wheras - це її значення у вигляді двійкового рядка.axval(x)x2val(x)+axapa2p+amod3p{0,1,2}a{0,1}x{0,1}val(x)N


1
Мені подобається ідея, спробуємо з 9. Я подаю 1001 у двійковій формі. Перший біт надішліть мені до state1, потім state2, тоді state1, а потім назад до state0. Отже, state0 кратно 3. А складність алгоритму - це кількість використаних бітів, не більше того. Це приголомшливо !
Стефан Ролланд

Чи пов’язана ця концепція у посиланні? Я думаю, що це простіше. geomathry.wordpress.com/2017/02/13/0-1-and-a-new-number

1
@WaqarAhmad Так, пов'язано, не простіше. Переходи в кінцевому автоматі також можна використовувати для опису оцінки L2R, як у вашому поясненні. Переходи визначають , , , , , . Тут у нас є три стани, тому три символи для держав необхідні. Ваші символи - це оцінки чисел за модулем відповідно, а перший символ у вашій оцінці L2R - це "стан". Якщо ви хочете обговорення, можливо, краще почати нове запитання на сайті! 0¯0=0¯0¯1=1¯1¯0=2¯1¯1=0¯2¯0=1¯2¯1=2¯Θ,1,01,2,0
Гендрік Ян

Не про програмування. Чи буде ця річ ефективнішою у потрійному комп’ютері?

4

У двійкових числах 1, 100, 10000 (= 100 × 100), 1000000 (= 100 × 100 × 100) і т. Д. Всі дають однаковий залишок після ділення на 11 (три). Тому, якщо ми розділимо двійкове число на частини парної довжини , сума частин дає такий самий залишок, що і вихідне число.

(Розбиваючи число, ми додаємо стільки нулів, скільки потрібно для початку . Наприклад, ми розділимо 10111 на групи 01,01,11 або 0001,0111.)

Математично просто розділіть число на групи з двох цифр, а потім додайте групи; і повторюйте це, поки ваш результат не стане 00 або 11 = початкове число було кратним три; або 01 або 10 = початкове число не було кратним три.

Для комп'ютерної програми використання груп з восьми або шістдесяти або тридцяти двох бітів може бути швидшим для вашого процесора. Наприклад, якщо восьмибітове додавання найшвидше, просто складіть суму всіх байтів, і ще раз, поки результат не впишеться в один байт. Потім скористайтеся однією інструкцією для визначення залишків після ділення на три.

(Примітка. Ми припускаємо тут непідписані цілі числа. З підписаним числом потрібно трохи більше уваги. Наприклад, 129 кратне 3, але -127 - ні, хоча біти 10000001 означають для колишніх як безпідписаний байт і останній як підписаний байт.)


0

Хоча це не бінарне специфічне, коли сумніваєтесь, повторне віднімання завжди є вірним способом обчислити ділення з залишками (і, таким чином, якщо число кратне 3).


2
Повторне віднімання - погана ідея. Ділення з залишками набагато швидше.
Yuval Filmus

3
напевно, дійсно дуже дорого коштує процесор, але це інший алгоритм :-), який не заслуговує -1 :-(
Стефан Роллан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.