Насколько Ферма это число?

13

Числа Ферма являются положительными целыми числами, которые могут быть выражены как 2 2 x +1 с целым числом x.

Давайте теперь определим атрибут числа, называемого «Fermat-ness»:

  • Ферматность числа на единицу меньше, чем длина цепочки степеней двух, начиная с основания, с степенями двух, развернутыми таким образом, чтобы максимизировать фермацию.
  • Число, не являющееся числом Ферма, имеет нулевое значение Ферма.

Итак, 17 (= 2 2 2 2 0 +1) имеет Ферматнесс три.

Вызов

Если в качестве входных данных положительное ненулевое целое число, выведите Fermatness числа.

правила

  • Вы можете использовать входные данные в двоичном, десятичном, шестнадцатеричном виде, в виде bignum или любого другого формата, который позволит вам играть в гольф наилучшим образом.
  • Ваше решение должно быть в состоянии обрабатывать числа с длинами битов более 64 независимо от того, какое представление вы используете.
  • Только неотрицательные целые числа.
  • Стандартные лазейки , конечно, запрещены.
  • Это , поэтому выигрывает самый короткий ответ.

Контрольные примеры

Это в формате input->output. Ввод в шестнадцатеричном формате для экономии места.

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

То же в десятичном виде:

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

Спасибо геокавелю за неоценимый вклад в песочницу.

гем
источник
1
Если я введу 1111, как вы узнаете, что это в двоичном, десятичном или шестнадцатеричном формате?
J42161217
1
@ Jenny_mathy Я хотел, чтобы ответчик решил, какой формат ввода они хотят.
HAEM
@ Mr.Xcoder В песочнице выяснилось, что на самом деле не так много чисел Ферма - 64 или менее. Я утверждаю, что вопрос по сути касается bignum, поэтому я могу требовать обработки bignum.
HAEM
2
@ HeikkiMäenpää Помните, что неважно, что другие могут порекомендовать, задача ваша, и вы можете сделать ее как хотите.
Исаак
3
Я думаю, что слишком рано, чтобы принять. Обычно ждут 1 или 2 недели. Некоторые говорят, что никогда не принимают!
геокавель

Ответы:

7

Желе , 15 14 байт

1 байт благодаря Джонатану Аллану.

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

Попробуйте онлайн!

Дрянная Монахиня
источник
2
Сохранить байт с: BḊCL⁸Ạ?->BḊ⁸LṀ?
Джонатан Аллан
1

Python 2 , 103 81 байт

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

Попробуйте онлайн!

Я понял, что глупость поможет снизить количество моих байтов, поэтому я сделал это. Также возведение в степень в отличие от логарифмов.

Арнольд Палмер
источник
0

RProgN 2 , 75 байтов

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

Попробуйте онлайн!

Это только 70 байтов, если вы не добавите, «»'¤=который назначает вычисление Fermatness к¤ персонажу. Если вы сделаете это, вам нужно будет поместить число в разделе заголовка TIO, а не в нижнем колонтитуле, как это сейчас.

Это эффективно использует ту же логику, что и мой ответ на Python, поэтому, если вам не важно, как работает RProgN 2, просто посмотрите на него, чтобы объяснить, что происходит. В противном случае

Разбивка кода:

«\`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

К сожалению, функция log Šи обычная функция возведения в степень не ^имеют точности, чтобы сделать это изначально, поэтому мне пришлось переопределить, как возведение в степень работало, поскольку умножение несет в себе гораздо большую точность. Без этого переопределения этот ответ будет на 23 байта короче.

Арнольд Палмер
источник