Como Fermat é esse número?

13

Os números de Fermat são números inteiros positivos que podem ser expressos como 2 2 x +1 com um número inteiro x.

Vamos agora definir um atributo de um número chamado "Fermat-ness":

  • A Fermatividade do número é um menor que o comprimento da cadeia de potências de dois, começando pela base, com potências de duas expandidas, a fim de maximizar a fermatividade.
  • Um número que não é um número de Fermat tem a Fermat-ness de zero.

Portanto, 17 (= 2 2 2 2 0 +1) tem Fermat-ness três.

Desafio

Dado um número inteiro diferente de zero positivo como entrada, imprima a Fermat-ness do número.

Regras

  • Você pode usar a entrada em binário, decimal, hexadecimal, como um bignum ou em qualquer formato que permita melhor
  • Sua solução deve ser capaz de processar números com tamanhos de bits acima de 64, independentemente da representação que você usar.
  • Somente potências inteiras não-negativas.
  • É claro que as brechas padrão são proibidas.
  • Isso é , então a resposta mais curta vence.

Casos de teste

Estes estão em formato input->output. A entrada está em hexadecimal para economizar espaço.

10000000000000000000000000000000000000000000000000000000000000001 -> 2
1000000000000BC00000000000000000000000000000000001000000000000001 ->0
1234567890ABCDEF -> 0
100000000000000000000000000000001 -> 1
5 -> 2
11 -> 3
10001 -> 4
101 -> 1

O mesmo em decimal:

115792089237316195423570985008687907853269984665640564039457584007913129639937 -> 2
115792089237316497527923305698859709742143344804209838213621568094470773145601 -> 0
1311768467294899695 -> 0
340282366920938463463374607431768211457 -> 1
5 ->2
17 -> 3
65537 -> 4
257 -> 1

Obrigado ao geokavel pela contribuição inestimável na caixa de areia.

HAEM
fonte
1
Se eu inserir 1111, como você sabe que é em binário, decimal ou hexadecimal ???
J42161217
1
@ Jenny_mathy Eu quis dizer para o respondente decidir qual o formato de entrada que eles querem.
HAEM 29/07
@ Mr.Xcoder Surgiu na caixa de areia que realmente não existem muitos números Fermat de 64 bits ou menos. Estou afirmando que a pergunta é intrinsecamente sobre bignum, para que eu possa exigir o processamento de bignum.
HAEM 29/07
2
@ HeikkiMäenpää Lembre-se, não importa o que os outros possam recomendar, o desafio é seu, e você pode fazer o que quiser.
Isaacg
3
Eu acho que é muito cedo para aceitar. Normalmente, espere 1 ou 2 semanas. Alguns dizem para nunca aceitar!
31417 geokavel # 07:

Respostas:

7

Geléia , 15 14 bytes

1 byte graças a Jonathan Allan.

’µBḊ⁸LṀ?µÐĿḊḊL

Experimente online!

Freira Furada
fonte
2
Salvar um byte com: BḊCL⁸Ạ?->BḊ⁸LṀ?
Jonathan Allan
1

Python 2 , 103 81 bytes

n=input()-1
i=l=0
while 2**2**i<=n:
 if n==2**2**i:n=2**i;i=-1;l+=1
 i+=1
print l

Experimente online!

Percebi que não ser estúpido ajudaria a diminuir minha contagem de bytes, então fiz isso. Também exponenciação em oposição aos logaritmos.

Arnold Palmer
fonte
0

RProgN 2 , 75 bytes

«\`n=1\]{1-\n*\]}:[»`^=«1-`n=001{]2\^2\^ne{2\^`n=1+0}{1+}?]2\^2\^n>¬}:[»`¤=

Experimente online!

São apenas 70 bytes se você não adicionar o «»'¤= que atribui o cálculo de Fermatidade ao ¤personagem. Se você fizer isso, precisará inserir o número na seção Cabeçalho do TIO, em vez de no Rodapé, como está agora.

Isso efetivamente usa a mesma lógica da minha resposta em Python; portanto, se você não se importa com o funcionamento do RProgN 2, basta olhar para esse para obter uma explicação do que está acontecendo. De outra forma

Repartição do código:

«\`n=1\]{1-\n*\]}:[»`^=
«                  »`^=`                            # Create a local function and assign it to the ^ character (x y ^ is x to the power of y)
 \`n=                                               # Swap the top two values of the stack and assign the new top to the variable n
     1\]                                            # Push a 1 (our starting point for x to the y), swap with the y value, then duplicate y
        {       }:                                  # Start a while loop that pops the top stack value and loops if it is truthy
         1-                                         # Subtract 1 from y to keep a tally of how many multiplications we've done
           \n*                                      # Swap the counter with our current value and multiply it by n
              \]                                    # Swap this new value with the current value of y, and duplicate it to be used as the truthy value for the loop

«1-`n=001{]2\^2\^ne{2\^`n=1+0}{1+}?]2\^2\^n>¬}:[»`¤=# The main Fermatness function (x ¤ to get the Fermatness of x)
«                                               »`¤=# Create another local function for this calculation
 1-`n=                                              # Decrement the input by 1 and assign it to n
      001                                           # Push a counter for Fermatness, a counter for calculating 2^2^i, and an initial truthy value
         {                                   }:     # Start a while loop for calculating the Fermatness
          ]2\^2\^ne                                 # Duplicate i, calculate 2^2^i, and compare it to n
                   {         }{  }?                 # Start an if statement based on the equality of 2^2^i and n
                    2\^`n=                          # n==2^2^i, so set n to 2^i (same as saying n=log_2(n))
                          1+0                       # Increment the Fermatness counter and reset i
                               1+                   # n!=2^2^i, so just increment i
                                   ]2\^2\^n>¬       # Duplicate the counter and check if 2^2^i<=n, if true the loop continues, else it exits
                                               [    # Pop i from the stack, leaving us with just the Fermatness counter

Infelizmente, a função de log Še a função de exponenciação normal ^não têm a precisão necessária para fazer isso nativamente, então tive que redefinir como a exponenciação funcionava, pois a multiplicação carrega muito mais precisão. Sem essa redefinição, essa resposta seria 23 bytes menor.

Arnold Palmer
fonte
0

Perl 6 , 62 bytes

{my@a=first :kv,*>=0,(^∞).map(2**2** *+1-$_);++@a[0]*!@a[1]}

Experimente online!

Sean
fonte