Bu sayı ne kadar Fermat?


13

Fermat sayıları , x tamsayısıyla 2 2 x +1 olarak ifade edilebilen pozitif tamsayılardır .

Şimdi "Fermat-ness" adlı bir sayının niteliğini tanımlayalım:

  • Sayının Fermantasyonu, tabandan başlayarak, fermantasyonu en üst düzeye çıkarmak için genişletilmiş iki kuvvetin zinciriyle iki kişilik güç zincirinin uzunluğundan daha azdır.
  • Fermat numarası olmayan bir sayının Fermatessitesi sıfırdır.

Yani, 17 (= 2 2 2 2 0 +1) Fermatilik üçe sahiptir.

Meydan okuma

Giriş olarak pozitif sıfır olmayan bir tamsayı verildiğinde, sayının Fermatessess'i çıktısını alın.

kurallar

  • Girdiyi ikili, ondalık, onaltılık, bignum olarak alabilir veya en iyi golf oynamanızı sağlayan biçim
  • Çözümünüz hangi temsili kullanırsanız kullanın, bit uzunlukları 64'ün üzerinde olan sayıları işleyebilmelidir.
  • Yalnızca negatif olmayan tamsayı güçler.
  • Standart boşluklar elbette yasaktır.
  • Bu , bu yüzden en kısa cevap kazanır.

Test senaryoları

Bunlar biçimdedir input->output. Yerden tasarruf etmek için giriş onaltılıktır.

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

Ondalık olarak aynı:

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

Kum havuzundaki paha biçilmez giriş için geokavel sayesinde .


1
1111 girersem, bunun ikili, ondalık veya onaltılık olduğunu biliyor musunuz ???
J42161217

1
@Jenny_mathy Yanıtlayan kişinin ne tür girdi istediklerine karar vermesini istedim.
HAEM

@ Mr.Xcoder Kum havuzunda gerçekten çok fazla 64 bit veya daha az Fermat olmadığı ortaya çıktı. Ben bignum işleme talep böylece soru özünde bignum hakkında olduğunu iddia ediyorum.
HAEM

2
@ HeikkiMäenpää Başkalarının önerebileceği ne olursa olsun, meydan okuma sizindir ve istediğinizi yapabilirsiniz.
isaacg

3
Bence kabul etmek için çok erken. Genellikle 1 veya 2 hafta bekleyin. Bazıları asla kabul etmeyeceğini söylüyor!
geokavel

Yanıtlar:



1

Python 2 , 103 81 bayt

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

Çevrimiçi deneyin!

Aptal olmamanın bayt sayımı azaltmaya yardımcı olacağını fark ettim, bu yüzden yaptım. Ayrıca logaritmalara karşı üs alma.


0

RProgN 2 , 75 bayt

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

Çevrimiçi deneyin!

«»'¤=Fermatness hesaplamasını ¤karaktere atayanı eklemezseniz sadece 70 bayt olur . Bunu yaparsanız, numarayı şimdi olduğu gibi Altbilgi yerine TIO'nun Başlık bölümüne girmeniz gerekir.

Bu, Python cevabımla aynı mantığı etkili bir şekilde kullanır, bu nedenle RProgN 2'nin nasıl çalıştığını umursamıyorsanız, neler olup bittiğine dair bir açıklama için sadece buna bakın. Aksi takdirde

Kod dökümü:

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

Ne yazık ki, günlük işlevi Šve normal üs alma işlevi ^bunu doğal olarak yapma hassasiyetinden yoksundur, bu nedenle çarpma işlemi çok daha fazla hassasiyet taşıdığından üs alma işleminin nasıl çalıştığını yeniden tanımlamak zorundaydım. Bu yeniden tanımlama olmadan, bu cevap 23 bayt daha kısa olacaktır.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.