11이없는 회 문동 프라임


14

짝수의 자릿수를 가진 모든 회문은 11로 나눌 수 있으므로 11은 짝수의 자릿수를 가진 유일한 [팔린 색 소수]입니다. - 데이비드 Wasserman, OEIS

나는 회문 소수를 계산할 때 프로그램이 짝수의 숫자 (11 제외)로 숫자를 건너 뛰는 것을 연구하기 전에 오늘 수동으로 이것을 배웠습니다. 작업 : 정수 입력 N이 주어지면 Stephen의 Palindromic Sequence ™에서 N 번째 항을 출력하는 프로그램 또는 함수를 만듭니다.

Stephen 's Palindromic Sequence ™

Stephen 's Palindromic Sequence ™는 11로 시작하여 11 로 나눌 수 있는 회문 세미 프라임으로 계속 됩니다. 기본적으로 11이 "카운트"가 아닌 경우 프라임이되는 모든 세미 프라임입니다. 이 목록에는 짝수의 숫자가 포함되어 있습니다! 예 그리고 홀수 자릿수를 가진 많은 숫자는 이미 소수이므로 건너 뜁니다.

시퀀스의 시작 :

1   : 11
2   : 22
3   : 33
4   : 55
5   : 77
6   : 121
7   : 737
8   : 979
9   : 1111
10  : 1441
11  : 1661
12  : 1991
13  : 3113
14  : 3223
15  : 3443
16  : 3883
17  : 7117
18  : 7447
19  : 7997
20  : 9119
21  : 9229
22  : 9449
23  : 10901

* 1331 (11 ^ 3)과 유사성이이 순서의 정신에 맞지만 규칙에 맞지 않습니다.

더 긴 테스트 사례 :

26  : 91619
31  : 103301
41  : 139931
51  : 173371
61  : 305503
71  : 355553
81  : 395593
91  : 725527
101 : 772277
127 : 997799
128 : 1099901
141 : 3190913
151 : 3739373
161 : 7589857
171 : 9460649
200 : 11744711
528 : 39988993

입력

정수 N,> = 1. 답변에 0 인덱스 N (테스트 사례를 조정해야 함)을 지정할 수 있습니다. 후행 줄 바꿈이 허용됩니다.

산출

Stephen 's Palindromic Sequence ™의 N 번째 용어. 후행 줄 바꿈이 허용됩니다.

규칙

  • 프로그램 / 기능이 취할 수있는 유일한 입력은 N입니다. 예를 들어, 프로그램은 OEIS에서 시퀀스를 가져올 수 없습니다 (일명 표준 허점 적용 ).
  • 최대 6 자리의 출력을 인쇄 할 수 있어야합니다 (N = 127). 시간은 중요하지 않습니다. 그러나 프로그램 / 기능이 매우 빠르게 길어지면 알고리즘이 작동한다는 것을 증명해야합니다. 언어가 자연스럽게 더 긴 출력을 허용하는 경우 자연스럽게 최대 한도까지 확장하거나 원하는 10 자리로 제한 할 수 있습니다. 유효한 출력으로 보이지 않는 한 한계를 초과하는 출력 / 종료는 중요하지 않습니다.
  • 유효하지 않은 입력의 프로그램 / 기능 기능은 관련이 없습니다.


7
11을 포함해야합니까? 세미 프라임이 아닙니다.
xnor

1
@xnor 11은 시퀀스의 시작으로 정의됩니다. 당신은 그것이 세미 프라임이 아니라는 것이 맞지만, 1은 피보나치 숫자도 아닙니다. :)
Stephen

답변:


9

젤리 , 18 13 바이트

ṬÆẸש11ŒḂµ#ṛ®

어떤 이유로 든 이것은 정확히 동일한 작업에도 불구하고 초기 개정보다 훨씬 느립니다.

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

N = 127

dennis-home:~$ time jelly eun 'ṬÆẸש11ŒḂµ#ṛ®' <<< 127
997799

real    1m43.745s
user    1m43.676s
sys     0m0.113s

작동 원리

ṬÆẸש11ŒḂµ#ṛ®  Main link. No arguments.

         µ     Combine all links to the left into a chain.
          #    Read an integer n from STDIN and call the chain monadically, with
               argument k = 0, 1, 2, ... until n values of k result in a truthy
               output. Return the array of all matching values of k.
Ṭ                Untruth; yield [0, 0, 0, ..., 1] (k-1 zeroes followed by a 1) or
                 [] if k = 0.
 ÆẸ              Unexponents; consider the resulting array as exponents of the
                 sequence of primes and yield the corresponding integer. For k = 0,
                 this yields 1. For k > 0, it yields the k-th prime.
   ש11          Multiply the result by 11 and copy the product to the register.
       ŒḂ        Test if the product is a palindrome.
           ṛ®  Replace the resulting array with the integer in the register.

15

파이썬 2 , 76 73 72 70 69 68 바이트

n=input();c=k=m=11
while n:m*=k/c;k+=c;n-=`k`==`k`[::~m%k-c]
print k

3 바이트를 사용하지 않는 @WheatWizard에게 감사합니다!

1 바이트를 골라내는 @ ØrjanJohansen에게 감사합니다!

68 바이트로 포장하는 @xnor 및 @ ØrjanJohansen에게 감사합니다!

입력은 0 인덱스입니다. 온라인으로 사용해보십시오! 또는 처음 31 개의 테스트 사례를 확인하십시오 .

배경

리콜이 윌슨의 정리 된 상태 모든 정수에 대한 P> 1 ,

그 의미는 (p-1)! p 가 소수 인 경우에만 + 1p 로 나눌 수 있습니다.

p> 1 이 소수 가 아닌 경우 합성입니다. qp 의 가장 작은 소수로 하자 . 분명히 q ≤ p / q 입니다. 두 가지 경우가 있습니다.

  • 경우 Q = P / Q , 우리는이 P = q²을 .

    만약 Q = 2 , (P - 1)! = 3! = 6 이므로 (p-1)! 2 개의 모듈로 p에 적합하다 .

    만약 P / Q = Q> 2 이므로 분기 <p . 이런 식으로 q2q 는 모두 1,…, p-1 이며, 곱은 p-1 의 계승 이므로 2p = 2q² = q · 2q 나누기 (p-1)! 고르게.

  • 경우 Q <p / Q , QP / Q는 가운데 모두 1, ..., P - 1 이므로 , P = Q · P / Q의 분할 (p - 1)! 고르게.

합산,

모든 정수 p> 1 입니다.

이제 모든 정수 합동과 모든 정수 a , bc 에 대해 다음이 유지됩니다.

경우 A = -1 , B = 11C = -1 , 우리가 따라야

그리고, 이후 21-23 합동이다 모듈 (44)-111P-1 이다 합동 모듈 11P , 우리는 다음과 같은 결론에 도달.

p의 가능한 모든 값에 대해 결과 ( 11 , 21 또는 11p-1 )는 0,…, 11p-1 범위 에 속하므로이 값은 Python %연산자 가 반환하는 값과 일치합니다 .

작동 원리

입력을 n에 저장 한 후 c , km11로 초기화 합니다. c 는 프로그램의 나머지 기간 동안 일정합니다. 이 세 가지 사건 때문에 C 다음 줄에가와 할당 된 c 비용 2 바이트 만,이 바이트를 저장합니다. k 는 이전 단락 의 p 의 의미를 사용하여 11p 로 생각할 수 있습니다 . 처음에 k = 11 = 11 · 1! . m11 · (p-1)를 대신합니다! ; 처음에는 m = 11 = 11 · 0! . kmm = 11 · (k / 11) 의 관계를 만족시킵니다 ! 항상.

n 은 우리가 찾아야 할“스티븐 회문”의 수를 나타냅니다. 처음에는 k = 11 이므로 추가 계산없이 k를 그대로 출력 할 수 있습니다 . 그러나 n 이 양수이면 while 루프에 들어갑니다. 루프는 mk / c = p 를 곱한 다음 k에 11 을 더하여 p 를 증가시켜 시작 합니다. k 가 시퀀스의 멤버 이면 n 에서 1 을 빼고 다시 시작합니다. 일단 N 개의 도달 0 , 우리가 원하는 인덱스 시퀀스 부재를 발견 루프를 탈출 한 후 마지막 값 인쇄 케이.

표현식

`k`==`k`[::~m%k-c]

실제 테스트를 수행하고 결과 ( 시퀀스 멤버 의 경우 True / 1 , 그렇지 않으면 0 / False )를 n 에서 뺍니다 . 앞서 본 바와 같이, ~ m의 %의 K = (-m - 1) % K = (-11 * (p - 1)! - 1) %의 11P가 동일 (10) 경우 , p는 소수이고, 21 의 경우 , P = 4 , 및 11P - 1 p> 4 가 합성 이면 > 43 입니다. 따라서 c = 11 을 빼면 소수 p에 -1 이 남고 그렇지 않으면 9 보다 큰 양의 정수 가 남습니다 .

소수 p의 경우 , k​`k`[::-1]문자열 순서로 뒤집어 k 를 회문 인지 여부 를 확인합니다 . 그렇다면 모든 조건이 충족되고 k 는 시퀀스 멤버입니다. 그러나 p 가 소수가 아닌 경우 , 넓은 범위 단계와 k 가 항상 둘 이상의 숫자 를 갖는다 는 사실 은와 같은 숫자를 가질 수 없다는 것을 의미 합니다.​`k`​​`k`[::-1]​`k`​


4
당신의 우선 성 테스트는 정말 훌륭합니다. 이 답변과 경쟁 할 수 없습니다.
Post Rock Garf Hunter

2
이것은 유망하지만 121을 건너 뜁니다.
xnor

@xnor 추가 바이트 비용으로 121을 포함하도록 관리되었습니다. 감사!
Dennis

8

Brachylog , 17 바이트

:I{11|ṗ×₁₁≜.↔}ᶠ⁽t

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

이것은 1 인덱스입니다.

설명

:I{          }ᶠ⁽t    Find the Input'th result of the following:
   11                  Output = 11
     |                 Or
          ≜.           Output is an integer…
      ṗ×₁₁             …which is the result of multiplying a prime by 11…
           .↔          …and Output reversed is still the Output

이 답변으로 두 가지 실현 :

  • 전달할 입력이없는 경우 (with ) 메타 술어에 전달하는 위 첨자 가 작동하지 않는다는 사실을 수정해야합니다 (따라서 추가해야합니다 :I).
  • N술어의 결과 를 얻으려면 메타 술어 를 추가해야합니다 ( ᶠ⁽t예를 들어 대신 대신 사용하지 마십시오 ⁿ⁽).

두 가지 변경 사항을 모두 구현하면 해당 응답이 14 바이트가됩니다.


5

Mathematica, 65 60 바이트

n=NextPrime;11Nest[n@#//.x_/;!PalindromeQ[11x]:>n@x&,1,#-1]&

프라임을 사용하여 직접 반복 NextPrime하고 프라임의 11 배가 회문인지 확인합니다. N = 528 까지 작동합니다 . 결과 528과 529는 2 16 이상의 소수이며,이 시점 //.에서 충분한 수의 치환을 시도하지 못합니다.


4

파이썬 (2) , 111 (107) 103 102 101 100 91 90 89 바이트

데니스는 내가 여기서 구타 를 했으므로 그의 답변을 확인하십시오.

이 답변은 인덱스가 0입니다

n=input()
r=1
while n:r+=1;c=`r*11`;n-=all(r%x for x in range(2,r))*c==c[::-1]
print r*11

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

수학 중독자 덕분에 1 바이트 절약

설명

먼저 입력을 받아 n새로운 변수를 r=1만듭니다. 우리는 r소수와 11의 곱인 회문 검색을 계산합니다 . 하나를 찾을 n때마다 0에 도달 할 때까지 감소 합니다.

그래서 우리는 루프를 시작합니다 :

while n:

우리가하는 첫 번째 일은 증가입니다 r

r+=1

또한 c문자열 표현으로 변수 를 미리 정의합니다.r*11

c=`r*11`

이제 우리 n는 그러한 숫자를 찾으면 감소하고 싶습니다 . r*11패턴 이 맞는지 나타내는 부울을 빼기 만하면 됩니다 r. 이것이 False0이면 0 True을 빼고 1 이면 1을 뺍니다.

부울을 계산하려면 다음을 수행하십시오.

all(r%x for x in range(2,r))*c==c[::-1]

첫 번째 부분 은 소수 all인지 결정합니다 r. 우리는 결과 가 소수 인 c경우에 결과를 곱 하지만 r이것은 복합 일 경우 빈 문자열입니다. 우리는 이것을 이것 과 반대로 비교합니다 . 경우 소수와 A는이 될 것 회문입니다 중 하나가 false로 평가합니다 모든 일을 실패하면.cr""c[::-1]crcTrue

n제로 우리는 간단하다 print c.

83 바이트

짧지 만 불행히도 파이썬의 재귀 캡에 너무 빨리 도달하기 때문에 사양을 충족시키지 않는 재귀 솔루션이 있습니다.

f=lambda n,r=1:n and f(n-all(r%x*(`r*11`==`r*11`[::-1])for x in range(2,r)),r+1)+11

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


4

05AB1E , 15 바이트

인덱스가 0입니다.

11Iµ11N*DÂQNp*½

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

설명

11               # initialize stack with 11
  Iµ             # loop over N in [1 ... inf] until counter equals input
    11N*         # multiply N by 11
        D        # duplicate
         ÂQ      # check if the copy equals its reverse
           Np    # check if N is prime
             *   # multiply the results of the checks together
              ½  # if 1, increase counter

3

하스켈 , 94 90 바이트

h#n|n<2=0|mod n h<1=1+h#div n h|j<-h+1=j#n
([n|n<-[0,11..],(==)=<<reverse$show n,3>2#n]!!)

온라인으로 사용해보십시오! 사용법 예 : ([n|n<-[0,11..],(==)=<<reverse$show n,3>2#n]!!) 127.

[0,11..]무한 목록 [0,11,22,33, ...]을 구성합니다 (시퀀스를 1- 색인화하려면 0이 필요함). n이 목록의 각 항목 에 대해 n==(read.reverse.show)n, 즉 n회문 인지 여부를 확인 합니다 . 최대 2 개의 소수를 가지고 3>2#n있는지 확인합니다 n. n항상 11로 나눌 수 있기 때문에 실제 소수는 아니지만 세미 프라임 만 얻습니다.

편집 : 4 바이트 골프를위한 Ørjan Johansen에게 감사드립니다!


주위에 괄호가 필요하지 않습니다 div n h. 또한 효율성에만 영향을 미치지 만 첫 번째 2#는 아마도 효율성 일 수 있습니다 h#.
Ørjan Johansen

(==)=<<reverse$show n더 짧습니다.
Ørjan Johansen

2

PHP, 82 바이트

for(;$d<$argn;$i>1||($p=11*$n)!=strrev($p)?:$d++)for($i=++$n;--$i&&$n%$i;);echo$p;

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


"온라인으로 시도"에서 입력을 작성해야합니까? "입력"상자에 1을 쓰면 395593을 반환합니다.
RosLuP

@RosLuP 일반적으로 -R 옵션을 사용하여 명령 줄에서 실행됩니다. 온라인 버전에는 한계 $argn=81;가 있으며 명령 행 버전에서 사용할 수있는 입력 변수입니다.
Jörg Hülsermann

예를 들어 입력이 10이면 "$ argn = 10"으로 다시 작성하십시오. 감사합니다
RosLuP

@RosLuP 예 81을 원하는 입력으로 바꾸십시오
Jörg Hülsermann

1

공리, 105 바이트

g(n)==(i:=c:=1;repeat(c=n=>break;i:=i+1;if(prime? i)then(x:=(11*i)::String;x=reverse(x)=>(c:=c+1)));i*11)

언 골프, 테스트 코드 및 결과

f(n)==
   i:=c:=1
   repeat
      c=n=>break
      i:=i+1
      if(prime? i)then(x:=(11*i)::String;x=reverse(x)=>(c:=c+1))
   i*11


(5) -> [[i,g(i)]  for i in 1..23]
   (5)
   [[1,11], [2,22], [3,33], [4,55], [5,77], [6,121], [7,737], [8,979],
    [9,1111], [10,1441], [11,1661], [12,1991], [13,3113], [14,3223], [15,3443],
    [16,3883], [17,7117], [18,7447], [19,7997], [20,9119], [21,9229],
    [22,9449], [23,10901]]
                                          Type: List List PositiveInteger
(6) -> [[i,g(i)]  for i in [26,31,41,101,151,200]]
   (6)
   [[26,91619], [31,103301], [41,139931], [101,772277], [151,3739373],
    [200,11744711]]

여기서 g (700) = 92511529이므로 한계는> 700이됩니다. ww (1000) = 703999307이지만 nextPrime () 사용

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