도달 가능한 숫자


14

정의

  • 오일러 파이 함수 (AKA totient function ) : 양수를 취하여 주어진 수와 같은 프라임 인 주어진 수보다 적은 양수를 반환하는 함수. 로 표시됩니다 φ(n).

  • 연결 가능 수 : 양의 정수가 존재하는 경우 x등 그 φ(x) == n다음 n입니다 도달 .

직무

주어진 양의 정수에 도달 할 수 있는지 판별하기 위해 함수 / 프로그램을 작성하십시오.

입력

합리적인 형식의 양수 숫자가 언어의 능력 내에 있다고 가정 할 수 있습니다. 단항 입력이 허용됩니다.

산출

도달 가능한 숫자와 도달 할 수없는 숫자에 대한 두 개의 일관된 값. 두 값은 일관된 한 아무 것도 될 수 있습니다.

테스트 케이스

도달 가능한 숫자 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의 A002202 )

규칙

표준 허점이 적용됩니다.

승리 기준

이것은 입니다. 가장 적은 바이트 수로 제출하십시오.

참고 문헌



1
나는 한 줄이 일반 정규식 (백틱 없음) 인 한 줄 Retina 답변에 현상금을 제공합니다.
Leaky Nun

@LeakyNun 나는 조금 혼란스러워, 지금까지 나는 phi(n) = count { m : 1 <= m <= n AND (m,n) are coprime }.. 그것이 사실 이라는 것을 이해하고 있습니까?
Khaled.K

@ Khaled.K 네, 맞습니다.
Leaky Nun

답변:


6

젤리 , 7 6 바이트

²RÆṪe@

정확히 빠르지는 않습니다. 1 또는 0을 반환합니다 .

온라인으로 사용해보십시오!

작동 원리

²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.

어떻게 작동합니까?
Leaky Nun

1
무차별 대입 totient 함수에 대한 하한이 있으므로 충분히 큰 범위를 취하고 totient를 매핑하고 입력 발생을 확인하기에 충분합니다.
Dennis

제곱근이 최소임을 증명할 수 있습니까?
Leaky Nun

제곱근은 실제로 하한이 아니지만 sqrt (2)로 나눈 제곱근입니다. 이중화가 필요하지 않다는 점은 긍정적이지만, 잠이들 때까지 증거를 기다려야합니다. 너무 피곤 해요
데니스

4
@LeakyNun 사실, 이 논문 의 lemma 3은 k 가 홀수 인 n = 2k 가 아닌 한 제곱근이 하한임을 증명합니다 . 때문에 K2K는 동일한 totient가 두 배로은 필요하지 않다.
데니스

6

수학, 28 바이트

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

Dennis의 Jelly 답변과 마찬가지로 입력의 제곱까지 모든 숫자의 φ 값을 계산하여 입력이 나타나는지 확인합니다. False입력에 도달 할 수 있고 도달 할 수없는 경우를 반환 합니다 True. 헷갈려요. 그러나 FreeQ바이트보다 짧은 바이트 MatchQ이며, 스펙은 두 가지 일관된 값을 말합니다. :)


2

자바 스크립트 (ES6), 90 82 바이트

반환 0또는 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

이것은 x 가 존재한다면 x ≤ 2n 이라는 가정에 근거합니다 . 거짓으로 판명되면, x=n*n대신 x=n*2동일한 크기, 훨씬 느리게 사용하도록 업데이트해야합니다 .

엣지 케이스는 n = 128 이며 ϕ (255) 를 계산해야합니다 .

데모


편리하게 Fermat 프라임은 모두 연속적으로 연속적인 엣지 케이스를 생성합니다. n=2 , n=8, n=128, n=32768n=2147483648.
Neil

1

공리, 56 바이트

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

그것이 옳은지 모르겠습니다 ... 테스트 코드 및 결과

(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]

입력 x = 500 ...까지 범위 1 .. (2 * x)가 정상입니다 ...




0

05AB1E , 13 12 바이트

편집하다 : 스택에 충분한 요소가 없으면 입력이 재사용되므로 바이트를 저장했습니다.

도달 가능한 경우 1을 출력하고 그렇지 않은 경우 0을 출력합니다.

존재하는 경우 x ≤ 2n이라고 가정합니다.

xGNÕQi1,q}}0

온라인으로 사용해보십시오!

작동 원리

              # 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 바이트

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);}

온라인 시도

#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);
        }
    }
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.