소수를 정의하는 다른 방법


32

소수에 대한 내가 가장 좋아하는 정의 중 하나는 다음과 같습니다.

  • 2가 가장 작은 소수입니다.

  • 2보다 큰 숫자는 작은 소수로 나눌 수없는 경우 소수입니다.

그러나이 정의는 임의의 것으로 보입니다. 왜 2입니까? 다른 번호는 왜 없습니까? 그럼 다른 숫자를 시도하여 n- 프라임을 정의합니다.

  • n은 가장 작은 n- 프라임입니다.

  • n보다 큰 숫자는 더 작은 n- 프라임으로 나눌 수없는 경우 n- 프라임입니다.

태스크

여기서의 작업은 양의 정수 n 과 양의 정수 a 두 가지 입력을받는 프로그램을 작성하는 입니다. 그런 다음 an -prime 인지 여부를 결정합니다 . 프로그램은 "예, n- 프라임입니다"와 "아니오, n- 프라임이 아닙니다"에 대한 두 개의 고유 한 값을 출력해야합니다.

이것은 코드 골프 질문이므로 적은 바이트로 더 나은 답변을 바이트로 채점합니다.

테스트

다음은 n = 2에서 n = 12까지의 첫 31 개의 소수 목록입니다 (1은 유일한 1- 프라임 숫자입니다)

n=2: [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127]
n=3: [3,4,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127]
n=4: [4,5,6,7,9,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113]
n=5: [5,6,7,8,9,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113]
n=6: [6,7,8,9,10,11,13,15,17,19,23,25,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107]
n=7: [7,8,9,10,11,12,13,15,17,19,23,25,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107]
n=8: [8,9,10,11,12,13,14,15,17,19,21,23,25,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89,97]
n=9: [9,10,11,12,13,14,15,16,17,19,21,23,25,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89,97]
n=10: [10,11,12,13,14,15,16,17,18,19,21,23,25,27,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89]
n=11: [11,12,13,14,15,16,17,18,19,20,21,23,25,27,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89]
n=12: [12,13,14,15,16,17,18,19,20,21,22,23,25,27,29,31,33,35,37,41,43,47,49,53,55,59,61,67,71,73,77]

4
n=6, a=15첫 번째 흥미로운 테스트 사례입니다.

6
비 패턴 "a는 n-prime iff n≤a <2n 또는 (a≥2n이고 a는 소수)"인 경우 처음입니다.
Misha Lavrov

2
"2보다 큰 숫자는 작은 소수로 나눌 수없는 경우 소수입니다." -이 정의는 임의의 숫자가 소수가되도록합니다. 아마 당신은하고 싶은 말 IFF에 대신 하는 경우 ?

5
@ThePirateBay 나는 단어의 정확한 수학적 의미를 의미하지 않습니다. 나는 그것을 떠날거야.
밀 마법사

1
@JeppeStigNielsen 이것을 증명하는 것은 그리 어렵지 않습니다. n- 프라임 인 모든 합성 수에는 n보다 작은 소수만 있어야합니다. 또한 우리는 그 수로 나눌 수 있기 때문에 그들의 인자 중 일부가 n보다 큰 제품을 가질 수 없다는 것을 알고 있습니다. 따라서 모든 n- 프라임은 2- 프라임이거나 n보다 작은 2 개의 숫자의 곱입니다. n보다 적은 수의 숫자 쌍의 한정 만이 있으므로, 한정된 수의 복합 n- 프라임 수만이 존재한다. 잘만되면 그것이 의견에 맞게 약어를 사용해야했습니다.
밀 마법사

답변:




4

파이썬 3 , 45 바이트

lambda i,k:(i>k)<all(k%r for r in range(i,k))

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

작동 원리

이것은 입력으로 ik의 두 정수를 취 합니다. 먼저 k ≥ i 인지 확인합니다 . 그런 다음, 범위 [i, k)를 생성 하고이 범위의 각 정수 N 에 대해 Nk에 대한 코 프라임 인지 확인합니다 . 두 조건이 모두 충족되면 ki- 프라임입니다.


당신은 사용할 수 없습니다 &대신 and하고 >=i대신 >i-1?
밀 마법사

@WheatWizard >=i 는 여전히 공간 때문에 4 바이트입니다.

@Neil로 변경하면 & 하면 공간이 필요하지 않습니다.
밀 마법사


4

R , 44 37 바이트

function(a,n)a==n|a>n&all(a%%n:(a-1))

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

덕분에 -7 바이트 주세페

보고 TRUE 합니다

  • a 와 동등하다 n (또는 a==n|)
  • a보다 큰 n ( a>n&모든 번호에 대한) Kn까지 a-1, a로 균등하게 분할되지 않는 K (all(a%%n:(a-1)) )

FALSE그렇지 않으면 반환


PPCG에 오신 것을 환영합니다! 훌륭한 첫 번째 답변!
FantaC

3

J, 30 바이트

>:*(-{1=[:+/0=[:|/~]+i.@[)^:>:

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

시작 값을 올바른 인수로 사용하고 왼쪽 인수에서 확인할 값을 사용합니다.

나는 원래 엉망이었고 시작 소수보다 적은 좌익을 설명하지 않았다. 나는 지금 내 솔루션의 길이에 다소 불만이 있습니다.

설명

하자 x왼쪽 인자 (체크에 값을)하고 y오른쪽 인자 (시작 프라임)합니다.

>:*(-{1=[:+/0=[:|/~]+i.@[)^:>:
                          ^:>:  Execute left argument if x >= y
                     i.@[         Create range [0..x]
                   ]+             Add y to it (range now: [y..x+y])
                |/~               Form table of residues
            0=                    Equate each element to 0
          +/                      Sum columns
      1=                          Equate to 1
    -{                            Take the element at position x-y
>:*                             Multiply by result of x >= y

노트

위치의 요소는 ( 원래 범위에 추가 한 이후)에 x-y대한 우선 순위 테스트의 결과입니다 .xy

로 곱하면 보다 작은 x >: y값에 대해 잘못된 값 ( 0)을 얻을 수 있습니다.xy


3

자바 스크립트 (ES6), 33 32 30 바이트

카레 구문으로 입력을 (n)(a)받습니다. 부울을 반환합니다.

n=>p=(a,k=a)=>k%--a?p(a,k):a<n

데모


3

하스켈 , 30 바이트

flawr의 답변 에서 빌린 H.PWiz의 아이디어 덕분에 2 바이트가 절약되었습니다.

n!a=[1]==[1|0<-mod a<$>[n..a]]

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

그 이후로 괜찮 았고 지금까지 유일한 Haskell 답변은 45 btyes입니다. 내 답변을 게시하기로 결정했습니다.

설명

이 기능 검사 간의 유일한 수 있음 N 과 것을 A는 로 나누어이다 자체.

이제 정의는 언급 N 보다 -primes 작은 왜 우리가 이러한 모든 여분의 번호를 확인하고 있습니다? 때 우리는 문제가되지 않습니다 A는 몇 가지로 나눌 N -composite보다 큰 n은 ?

우리는하지 않습니다 때문에이 경우 N 보다 큰 -composite N 은 작은으로 나눌 수 있어야 n은 정의에 의해 -prime가. 이는 따라서 분할하는 경우 너무 작은해야 N을 -prime.

경우 A는 보다 작은 N이 [n..a] 있을 것이다 []따라서 동일 할 수없는 [1]체크가 실패하게한다.





1

dc , 40 34 37 바이트

[0p3Q]sf?se[dler%0=f1+dle>u]sudle>u1p

TIO 링크를 포함 시켰지만 TIO는 dc이것이 내 시스템에서 의도 한대로 작동하지만 Q명령이 TIO에서 잘못 작동하는 방식으로 잘못된 분포를 보이는 것 같습니다 . 대신, 다음은 bash올바르게 작동하는 버전의 테스트 그라운드에 대한 링크 입니다 dc.

그것을 데모!


1

APL (Dyalog) , 24 바이트

{⍵∊o/⍨1=+/¨0=o|⍨⊂o←⍺↓⍳⍵}

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

방법?

⍳⍵- 1a

o←⍺↓- na저장o

o|⍨⊂o-모든 항목에 모듈로 모든 o항목에o

0=-그것이 같은지 확인하십시오 0(나누기)

+/¨ -나누기 수를 합산

1= -우리가 하나만 가지고 있다면 숫자는 그 자체로만 나뉩니다.

o/⍨ -우리는이 사건들을 유지합니다

⍵∊- a그 잔여 배열에 있습니까?



0

자바 스크립트 ES5, 34 바이트

for(a=i=(p=prompt)();a%--i;);i<p()

0

추가 ++ , 20 바이트

L,2Dx@rBcB%B]b*!!A>*

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

L,   - Create a lambda function
     - Example arguments:  [5 9]
  2D - Copy below; STACK = [5 9 5]
  x  - Repeat;     STACK = [5 9 [9 9 9 9 9]]
  @  - Reverse;    STACK = [[9 9 9 9 9] 5 19] 
  r  - Range;      STACK = [[9 9 9 9 9] [5 6 7 8 9]]
  Bc - Zip;        STACK = [[9 5] [9 6] [9 7] [9 8] [9 9]]
  B% - Modulo;     STACK = [4 3 2 1]
  B] - Wrap;       STACK = [[4 3 2 1]]
  b* - Product;    STACK = [24]
  !! - Boolean;    STACK = [1]
  A  - Arguments;  STACK = [1 5 9]
  >  - Greater;    STACK = [1 1]
  *  - Product;    STACK = [1]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.