N-gons construtíveis


10

Um n-gon construtível é um polígono regular com n lados que você pode construir apenas com uma bússola e uma régua não marcada.

Conforme afirmado por Gauss, o único n para o qual um n-gon é construtível é um produto de qualquer número de primos Fermat distintos e uma potência de 2 (isto é, n = 2^k * p1 * p2 * ...por kser um número inteiro e todos os pprimos Fermat distintos).

Um primo de Fermat é um primo que pode ser expresso como F (n) = 2 ^ (2 ^ n) +1 com um número inteiro positivo. Os únicos Fermat prime conhecidos são para 0, 1, 2, 3 e 4.

O desafio

Dado um número inteiro n>2, diga se o n-gon é construtível ou não.

Especificação

Seu programa ou função deve pegar um número inteiro ou uma sequência que represente o número inteiro (em unário, binário, decimal ou qualquer outra base) e retornar ou imprimir um valor verdadeiro ou falso.

Este é o código-golfe, portanto, a resposta mais curta vence, as brechas padrão se aplicam.

OEIS relevante

Exemplos

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

Respostas:


8

Geléia , 7 5 bytes

Agradecimentos ao Sp3000 por salvar 2 bytes.

ÆṪBSỊ

Usa a seguinte classificação:

Estes também são os números para os quais phi (n) é uma potência de 2.

Onde phi é a função totiente de Euler .

ÆṪ        # 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.

Experimente online!

Alternativamente (créditos para 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.

Uma porta direta da minha resposta do Mathematica tem dois bytes a mais:

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

Eu não conheço Jelly, mas você poderia verificar a potência de 2 fatorando e verificando se o máximo é 2? Você também pode verificar se o AND bit a bit e seu predecessor são 0. #
xnor

@ xnor Hm, boa ideia, mas minhas tentativas são do mesmo tamanho. Se houver uma maneira de verificar se uma lista tem comprimento 1 em menos de 3 bytes, ela seria mais curta (usando a função de fatoração que fornece apenas uma lista de expoentes). Mas não consigo encontrar uma maneira de fazer isso.
Martin Ender

Vejo que há E para verificar se todos os elementos de uma lista são iguais. E se você dobrar o número, fatorá-lo e verificar se todos os fatores são iguais?
Xnor

@xnor Essa também é uma boa ideia. :) Isso provavelmente seria 6 bytes, em seguida, mas SP3000 apontou que há Be que me deixe testá-lo em 5.
Martin Ender

Ah legal. Alguma chance de que o decremento, o binário e o produto sejam menores?
xnor

3

Mathematica, 24 bytes

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

Usa a seguinte classificação do OEIS:

Computável como números de modo que o cototiente de totiente seja igual ao totiente de totiente.

O totiente φ(x) de um número inteirox é o número de números inteiros positivos abaixo dos xquais é coprime x. O cototiente é o número de números inteiros positivos que não são, ou seja x-φ(x). Se o totiente é igual ao cototiente, isso significa que o totiente de φ(x) == x/2.

A classificação mais direta

Estes também são os números para os quais phi (n) é uma potência de 2.

acaba sendo um byte mais longo:

IntegerQ@Log2@EulerPhi@#&

O que são cototientes e totientes? E as proporções cototiente-de-totients e totient-of-totients?
clismique 5/09/16

@ Qwerp-Derp O totiente de né o número de números inteiros abaixo nque são ncoprimes e o cototiente é o número de números inteiros abaixo nque não são. Vou editar em um link.
Martin Ender

Built-in do Mathematica nunca vai parar de me surpreender
Sefa

@ Qwerp-Derp Quanto à sua segunda pergunta, apenas significa que você calcula o (co) totiente do totiente de n.
Martin Ender

3

Retina, 51 50 bytes

0+$

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

A entrada está em binário. As duas primeiras linhas se dividem por uma potência de duas, as duas seguintes se dividem por todos os primos Fermat conhecidos (se, de fato, o número é um produto dos primos Fermat). Editar: salvou 1 byte graças a @Martin Ender ♦.


entrada binária é bom, assim como a suposição sobre números primos de Fermat
Sefa

2

JavaScript (ES7), 61 bytes

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

1

Na verdade, 6 bytes

Esta resposta é baseada no algoritmo do xnor na resposta de Martin Ender Jelly . Sugestões de golfe são bem-vindas. Experimente online!

▒D├♂≈π

Como funciona

         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

Lote, 97 bytes

@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)"

A entrada está em stdin em decimal. Na verdade, é 1 byte menor que o cálculo dos poderes de potências de 2 iterativamente. Salvei 1 byte usando o poder de verificação de @ xnor.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.