Конструктивні n-гони


10

Конструктивний п-кутник є правильним багатокутником з п сторін , які можна побудувати тільки з компасом і без розпізнавальних знаків лінійки.

Як стверджує Гаус, єдиний п, для якого можна сконструйовувати n-гон, - це добуток будь-якої кількості чітко виражених праймів Ферма та потужність 2 (тобто n = 2^k * p1 * p2 * ...з kцілим числом і кожним pвиразним простим числом Ферма).

Простий простим числом Ферма є простим числом, яке може бути виражене як F (n) = 2 ^ (2 ^ n) +1, а на додатне ціле число. Єдиний відомий прайм Fermat є для 0, 1, 2, 3 і 4.

Змагання

Давши ціле число n>2, скажіть, чи n-gon може бути сконструйованим чи ні.

Специфікація

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

Це код-гольф, тому найкоротший виграш відповіді застосовуються стандартні лазівки .

Відповідна OEIS

Приклади

3 -> True
9 -> False
17 -> True
1024 -> True
65537 -> True
67109888 -> True
67109889 -> False

Відповіді:


8

Желе , 7 5 байт

Завдяки Sp3000 за збереження 2 байт.

ÆṪBSỊ

Використовується наступна класифікація:

Це також числа, для яких phi (n) - сила 2.

Де фі - тотієнтська функція Ейлера .

ÆṪ        # Compute φ(n).
  B       # Convert to binary.
   S      # Sum bits.
    Ị     # Check whether it's less than or equal to 1. This can only be the
          # case if the binary representation was of the form [1 0 0 ... 0], i.e. 
          e# a power of 2.

Спробуйте в Інтернеті!

Як варіант (кредити xnor):

ÆṪ’BP
ÆṪ        # Compute φ(n).
  ’       # Decrement.
   B      # Convert to binary.
    P     # Product. This is 1 iff all bits in the binary representation are
          # 1, which means that φ(n) is a power of 2.

Прямий порт моєї відповіді Mathematica на два байти довше:

ÆṪ        # Compute φ(n).
  µ       # Start a new monadic chain, to apply to φ(n).
   ÆṪ     # Compute φ(φ(n)).
      H   # Compute φ(n)/2.
     =    # Check for equality.

Я не знаю Jelly, але ви могли б, можливо, перевірити потужність 2 шляхом факторингу та перевірки, чи максимум 2? Ви також можете перевірити, чи дорівнює біт І його та його попередника 0.
xnor

@xnor Хм, гарна ідея, але мої спроби цього однакової довжини. Якщо є спосіб перевірити, чи є список довжиною 1 менше 3 байтів, він буде коротшим (за допомогою функції факторизації, яка просто дає список експонентів). Я не можу знайти спосіб це зробити.
Мартін Ендер

Я бачу, що є E, щоб перевірити, чи всі елементи списку рівні. Що робити, якщо подвоїти число, множити його і перевірити, чи всі коефіцієнти рівні?
xnor

@xnor Це теж приємна ідея. :) То, мабуть, тоді буде 6 байт, але Sp3000 зазначив, що є Bі що дозволить мені перевірити це в 5.
Мартін Ендер,

Ах, приємно. Будь-який шанс, що декремент, то двійковий, то продукт коротший?
xnor

3

Математика, 24 байти

e=EulerPhi
e@e@#==e@#/2&

Використовується наступна класифікація від OEIS:

Обчислюється як числа такі, що коефіцієнт коефіцієнта дорівнює коефіцієнту тотієнта.

Totient φ(x) цілого числа xє число позитивних цілих чисел нижче , xякі взаємно просто з x. Кототиент - це кількість натуральних чисел, яких немає, тобто x-φ(x). Якщо коефіцієнт тотієнта дорівнює кототієнту, це означає, що тотієнт о φ(x) == x/2.

Більш пряма класифікація

Це також числа, для яких phi (n) - сила 2.

в кінці кінців стає байтом довше:

IntegerQ@Log2@EulerPhi@#&

Що таке cototients та totients? І чи співвідношення кототієнт-тотієнтів і тотієнтів-тотієнтів?
клісмік

@ Qwerp-Derp The totient з nцієї кількості цілих чисел нижче n, які взаємно просто n, і cototient цієї кількості цілих чисел нижче , nякі не є. Я відредагую посилання.
Мартін Ендер

Вбудована система Mathematica ніколи не зупинить мене, щоб здивувати
Сефа

@ Qwerp-Derp Що стосується вашого другого запитання, це просто означає, що ви обчислюєте (спів) коефіцієнт цього корінця n.
Мартін Ендер

3

Сітківка, 51 50 байт

0+$

+`^(.*)(?=(.{16}|.{8}|....|..?)$)0*\1$
$1
^1$

Введення є двійковим. Перші два рядки ділять потужністю дві, наступні два ділять усіма відомими праймерами Ферма (якщо насправді число є добутком праймів Ферма). Редагувати: Збережено 1 байт завдяки @Martin Ender ♦.


бінарне введення чудово, як і припущення про прайми Ферма
Сефа

2

JavaScript (ES7), 61 байт

n=>[...Array(5)].map((_,i)=>n%(i=2**2**i+1)?0:n/=i)&&!(n&n-1)

1

Власне, 6 байт

Ця відповідь ґрунтується на алгоритмі xnor у відповіді Мартіна Ендера . Пропозиції з гольфу вітаються. Спробуйте в Інтернеті!

▒D├♂≈π

Як це працює

         Implicit input n.
▒        totient(n)
 D       Decrement.
  ├      Convert to binary (as string).
   ♂≈    Convert each char into an int.
     π   Take the product of those binary digits.
         If the result is 1,
           then bin(totient(n) - 1) is a string of 1s, and totient(n) is power of two.

0

Пакетна, 97 байт

@set/pn=
@for /l %%a in (4,-1,0)do @set/a"p=1<<(1<<%%a),n/=p*!(n%%-~p)+1"
@cmd/cset/a"!(n-1&n)"

Введення значень на stdin у десятковій частині. Це насправді на 1 байт коротше, ніж обчислення потужностей потужностей 2 ітераційним шляхом. Я врятував 1 байт, використовуючи потужність @ xnor 2 чека.

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