Негативні праймери XOR


9

Близько року тому вас попросили знайти праймери XOR . Це числа, єдиними факторами яких є 1, і вони самі при виконанні множення XOR у базі 2 . Зараз збиралися трохи приправити речі.

Ми знайдемо праймери XOR в базі -2

Перехід до бази -2

База -2 дуже схожа на будь-яку іншу базу. Найбільше ліве місце займає 1-е місце (1 = (-2) 0 ), поруч з ним - -2-е місце (-2 = (-2) 1 ), поруч із цим 4-е місце (4 = (-2) ) 2 ) тощо і так далі. Велика різниця полягає в тому, що негативні числа можна представити в базі -2 без будь-якого негативного ознаки.

Ось кілька прикладів переходів:

Decimal | Base -2
-----------------
 6      |   11010
-7      |    1001
 12     |   11100
-15     |  110001

Додавання XOR в базі -2

Додавання XOR в Base -2 майже аналогічно додаванню XOR у двійковій. Ви просто конвертуєте число в Base -2 і XOR кожну цифру на своєму місці. (Це те саме, що додавання без перенесення)

Ось приклад, розроблений поетапно:

(Ми будемо використовувати символ +'для позначення додатку Base -2 XOR)

Початок з бази 10:

6 +' -19

Перетворити в базу -2:

11010 +' 10111

Додайте їх, не несучи:

   11010
+' 10111
---------
   01101

Перетворіть результат назад у базу 10:

-3

Множення XOR в базі -2

Знову множення XOR у базі -2 майже те саме, що множення XOR у двійковій. Якщо ви не знайомі з XOR множення в базі 2 є відмінне пояснення тут я пропоную вам поглянути на це перше.

Множення XOR в Base -2 - це те саме, що виконувати довге множення в базі -2, за винятком випадків, коли мова йде про останній крок замість додавання всіх чисел до традиційного, який +ви використовуєте у +'визначеному нами вище.

Ось приклад, розроблений нижче:

Почніть з десяткової:

8 *' 7

Перетворити в базу -2:

11000 *' 11011

Налаштування довгого поділу:

   11000
*' 11011
---------

Помножте перше число на кожне місце у другому

      11000
*'    11011
------------
      11000
     11000
        0
   11000
  11000

Додайте всі результати за допомогою додавання бази -2 XOR

       11000
*'     11011
-------------
       11000
      11000
         0
    11000
+' 11000
-------------
   101101000

Перетворити результат назад у десятковий:

280

Змагання

Ваше завдання полягає в тому, щоб перевірити, чи число є простим числом XOR в базі -2. Число є простим числом XOR в базі -2, якщо єдиною парою цілих чисел, що множать його в базі, є 1 і сама. (1 не є простим)

Ви візьмете число і виведете булеву, тритуму, якщо в іншому випадку вхід є простім XOR в базовій -2 хибній.

Рішення будуть оцінюватись у байтах із досягненням якнайменшої кількості байтів.

Тестові справи

Нижче наведено всі праймери XOR в базі -2:

-395
-3
-2
 3
 15
 83

Нижче не є праймерами XOR у базі -2:

-500
-4
 0
 1
 258
 280

258здається рівним-2 *' -129 = 10 *' 10000011
JungHwan Min

@JungHwanMin моє погано, що один повинен був бути в іншій категорії. Прошу вибачення, якщо це спричинило вам якісь неприємності.
Ad Hoc Garf Hunter

Відповіді:


3

Математика, 156 101 байт

IrreduciblePolynomialQ[FromDigits[{#}//.{a_,p___}/;a!=1&&a!=0:>{-⌊a/2⌋,a~Mod~2,p},x],Modulus->2]&

Як зазначено тут , це працює, тому що множення XOR по суті є множенням у поліномному кільці F_2.

Пояснення

{#}//.{a_,p___}/;a!=1&&a!=0:>{-⌊a/2⌋,a~Mod~2,p}

Почніть з {input}. Неодноразово замінюйте число a(крім 0 і 1) aмодом 2 і додайте -поверх ( a/ 2), поки воно не зміниться. Це обчислює вхід в базі -2.

FromDigits[ ... ,x]

Створіть многочлен, використовуючи цифри базового числа -2, використовуючи xяк змінну. наприклад {1, 1, 0}->x^2 + x

IrreduciblePolynomialQ[ ... ,Modulus->2]

Перевірте, чи не утворюється отриманий многочлен, з модулем 2.

Стара версія (156 байт)

If[#==1,1,Outer[FromDigits[BitXor@@(#~ArrayPad~{i++,--l}&)/@Outer[i=0;l=m;1##&,##],-2]&,k=Tuples[{0,1},m=Floor@Log2[8Abs@#~Max~1]]~Drop~{2},k,1,1]]~FreeQ~#&

Список прайменів

Ось список базових -2 праймерів XOR від -1000 до 1000 (пастбін)

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