Ulaşılabilir sayılar


14

Tanımlar

  • Euler Phi İşlevi (AKA totient işlevi ): pozitif bir sayı alan ve verilen sayıdan daha düşük olan, verilen sayıdan daha az olan pozitif sayıların sayısını döndüren bir işlev. Olarak belirtilir φ(n).

  • Ulaşılabilir sayı : xöyle bir pozitif tamsayı varsa φ(x) == n, o nzaman erişilebilir .

Görev

Belirli bir pozitif tamsayının erişilebilir olup olmadığını belirlemek için bir işlev / program yazın.

Giriş

Herhangi bir makul biçimde pozitif bir sayı. Sayının dilin yeteneği içinde olduğu varsayılabilir. Tekli giriş kabul edilir.

Çıktı

Biri ulaşılabilir sayılar ve diğeri ulaşılamaz sayılar için olmak üzere iki tutarlı değer. İki değer tutarlı oldukları sürece herhangi bir şey olabilir.

testcases

Aşağıdaki erişilebilir numaralar 100:

1, 2, 4, 6, 8, 10, 12, 16, 18, 20, 22, 24, 28, 30, 32, 36, 40, 42, 44, 46, 48, 52, 54, 56, 58, 60, 64, 66, 70, 72, 78, 80, 82, 84, 88, 92, 96

( OEIS'te A002202 )

kurallar

Standart boşluklar geçerlidir.

Kazanan kriter

Bu . En düşük bayt sayısı ile gönderim kazanır.

Referanslar


ayrıca ilgili: oeis.org/A264739
Limon

1
Bir satırın düz regex (backticks yok) olduğu tek satır Retina cevabına bir ödül teklif ediyorum.
Leaky Nun

@LeakyNun Biraz kafam karıştı, şu ana kadar anlıyorum phi(n) = count { m : 1 <= m <= n AND (m,n) are coprime }.. bu doğru mu?
Khaled.K

@ Khaled.K evet, bu doğru.
Sızdıran Rahibe

Yanıtlar:


6

Jöle , 7 6 bayt

²RÆṪe@

Tam olarak hızlı değil. 1 veya 0 değerini döndürür .

Çevrimiçi deneyin!

Nasıl çalışır

²RÆṪe@  Main link. Argument: n

²       Square; yield n².
 R      Range; yield [1, ..., n²].
  ÆṪ    Compute the totient of each integer in the range.
    e@  Exists swap; test if n occurs in the generated array.

O nasıl çalışır?
Leaky Nun

1
Kaba kuvvet. Totient işlevi için daha düşük bir sınır vardır, bu nedenle yeterince geniş bir aralık almak, totient'i haritalamak ve girişin oluşumlarını kontrol etmek yeterlidir.
Dennis

Karekökün minimum olduğunu kanıtlayabilir misiniz?
Leaky Nun

Karekök aslında bir alt sınır değildir, ancak karekök (2) 'ye bölünür. İki katına çıkmanın gerekli olmadığından eminim, ancak biraz uyuyana kadar bir kanıt beklemek zorunda kalacak. Şu anda çok yorgun.
Dennis

4
@LeakyNun Aslında, bu yazının lemması 3, tek k ile n = 2k olmadığı sürece karekökün bir alt sınır olduğunu kanıtlamaktadır . Yana k ve 2k aynı totient sahip iki katına gerekli değildir.
Dennis

6

Mathematica, 28 bayt

EulerPhi@Range[#^2]~FreeQ~#&

Dennis'in Jelly cevabı gibi, girişin karesine kadar olan tüm sayıların φ değerlerini hesaplıyor ve girişin orada görünüp görünmediğini görüyoruz. FalseGirdiye ulaşılabilir olup Trueolmadığını ve girilmiyorsa döndürür . Evet, kafa karıştırıcı. Ama FreeQbir bayt daha kısa MatchQ, ve hey, spec iki tutarlı değer söyledi> :)


2

JavaScript (ES6), 90 82 bayt

0Veya döndürür true.

f=(n,x=n*2)=>x?(p=i=>(c=(a,b)=>a?c(b%a,a):b<2)(i,x)+(i&&p(--i)))(x)==n||f(n,x-1):0

Bu, x varsa x ≤ 2n olduğu varsayımına dayanır . Yanlış olduğu kanıtlanırsa, x=n*nbunun yerine kullanılacak şekilde güncellenmesi gerekir x=n*2(aynı boyutta, çok daha yavaş).

Kenar durumu = (255) hesaplaması gereken n = 128'dir .

gösteri


Elverişli Fermat asal ardışık uç örnekleri için tüm ardışık veren yükselişi vardır n=2, n=8, n=128, n=32768ve n=2147483648.
Neil

1

Aksiyom, 56 bayt

f(x:PI):Boolean==member?(x,[eulerPhi(i)for i in 1..2*x])

doğru olup olmadığını bilmiyorum ... test kodu ve sonuçları

(35) -> [i  for i in 1..100|f(i)]
   (35)
   [1, 2, 4, 6, 8, 10, 12, 16, 18, 20, 22, 24, 28, 30, 32, 36, 40, 42, 44, 46,
    48, 52, 54, 56, 58, 60, 64, 66, 70, 72, 78, 80, 82, 84, 88, 92, 96, 100]

1 .. aralığı (2 * x) x = 500 girişi girilene kadar iyi olur.



1

05AB1E , 5 bayt

nLÕså

Açıklama:

n       Square [implicit] input
 L      Range [1 .. a]
  Õ     Euler totient
   s    Put first input at the top of the stack
    å   Is it in the list?

Çevrimiçi deneyin!


0

05AB1E , 13 12 bayt

EDIT : Yığın yeterli öğeye sahip değilse giriş yeniden kullanıldığı için bir bayt kaydedildi.

Ulaşılabilirse 1, değilse 0 çıkar.

Varsa x ≤ 2n olduğu varsayımına dayanır.

xGNÕQi1,q}}0

Çevrimiçi deneyin!

Nasıl çalışır

              # implicit input    
x            # push input, 2 * input
 G           # for N in 1..2*input
             # implicit push input
  N          # push N
   Õ         # push totient of N
    Q        # check if both are equal
     i.      # if equal
      1,     # print 1
        q    # quit program
         }   # end if
          }  # end for
           0 # push 0 if condition never reached
             # implicit print

0

C, 123 bayt

g(a,b){return!a?b:g(b%a,a);}
i;r;f(n){for(i=2,r=1;i<n;i++)r+=(g(i,n)==1);}
t;k;s(m){for(k=m,t=0;!t&(k<m*m);)f(++k),t=(r==m);}

Çevrimiçi Deneyin

#include <stdio.h>

// gcd function
g(a,b){return!a?b:g(b%a,a);}

// Euler phi(x) function
i;r;f(n){for(i=2,r=1;i<n;i++)r+=(g(i,n)==1);}

// check if m is reachable, phi(x) for x in (m , m^2]
t;k;s(m){for(k=m,t=0;!t&(k<m*m);)f(++k),t=(r==m);}

main()
{
    // print all reachable number below 50
    for(int x=1; x<50; x++)
    {
        s(x);

        if(t)
        {
            printf(" %d ~ phi(%d) \n", x, k);
        }
    }
}

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.