Số nguyên tố Palindromic không có 11


14

Mỗi palindrom có ​​số chữ số chẵn chia hết cho 11, vì vậy 11 là [số nguyên tố palindromic] duy nhất có số chữ số chẵn. - David Wasserman, OEIS

Tôi đã học được điều này ngày hôm nay theo cách thủ công, trước khi tôi thực hiện nghiên cứu của mình, khi chương trình của tôi bỏ qua các số có số chữ số chẵn (trừ 11) khi tính các số nguyên tố palindromic. Nhiệm vụ của bạn: tạo một chương trình hoặc hàm mà khi được cung cấp đầu vào số nguyên N, sẽ xuất ra thuật ngữ thứ N trong Chuỗi trình tự Palindromic ™ của Stephen.

Trình tự Palindromic của Stephen

Stephen's Palindromic Sequence ™ bắt đầu bằng 11, và tiếp tục với bán kết palindromic chia hết cho 11. Về cơ bản, tất cả các bán kết sẽ là số nguyên tố nếu 11 không "đếm". Ưu điểm là danh sách này chứa các số có số chữ số chẵn! Yay. Và, rất nhiều số có số chữ số lẻ được bỏ qua, vì chúng đã là số nguyên tố.

Bắt đầu của chuỗi:

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

* Mặc dù 1331 (11 ^ 3) và tương tự phù hợp với tinh thần của chuỗi này, chúng không phù hợp với các quy tắc.

Các trường hợp thử nghiệm dài hơn:

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

Đầu vào

Số nguyên N,> = 1. Bạn có thể sử dụng N có chỉ số 0 (hãy chắc chắn điều chỉnh các trường hợp kiểm tra) nếu bạn chỉ định như vậy trong câu trả lời của mình. Trailing newlines cho phép.

Đầu ra

Thuật ngữ thứ N trong Stephen's Palindromic Sequence ™. Trailing newlines cho phép.

Quy tắc

  • Đầu vào duy nhất mà chương trình / chức năng của bạn có thể thực hiện là N. Chương trình của bạn không thể, ví dụ, lấy một chuỗi từ OEIS (còn gọi là sơ hở tiêu chuẩn áp dụng ).
  • Bạn phải có thể in một đầu ra tối đa sáu chữ số (N = 127). Thời gian không phải là một yếu tố - tuy nhiên, nếu chương trình / chức năng của bạn trở nên rất dài rất nhanh, bạn phải chứng minh rằng thuật toán hoạt động. Nếu ngôn ngữ của bạn tự nhiên cho phép đầu ra dài hơn, bạn có thể để ngôn ngữ đó mở rộng một cách tự nhiên đến giới hạn của nó, hoặc giới hạn ở mười chữ số, tùy theo bạn thích. Đầu ra / chấm dứt vượt quá giới hạn của bạn không quan trọng, miễn là nó không có vẻ là một đầu ra hợp lệ.
  • Chức năng chương trình / chức năng trên đầu vào không hợp lệ là không liên quan.


7
Có nên bao gồm 11? Đó không phải là bán kết.
xnor

1
@xnor 11 được định nghĩa là bắt đầu của chuỗi. Bạn đúng là nó không phải là một bán kết, nhưng số 1 cũng không phải là số Fibonacci theo định nghĩa :)
Stephen

Câu trả lời:


9

Thạch , 18 13 byte

ṬÆẸש11ŒḂµ#ṛ®

Vì một số lý do, điều này chậm hơn nhiều so với sửa đổi ban đầu của tôi, mặc dù thực hiện chính xác như vậy.

Hãy thử trực tuyến!

N = 127

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

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

Làm thế nào nó hoạt động

ṬÆẸש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

Python 2 , 76 73 72 70 69 68 byte

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

Cảm ơn @WheatWizard vì đã chơi golf 3 byte!

Cảm ơn @ rjanJohansen vì đã chơi golf 1 byte!

Cảm ơn @xnor và @ rjanJohansen đã mở đường tới 68 byte!

Đầu vào là 0 chỉ mục. Hãy thử trực tuyến! hoặc xác minh 31 trường hợp thử nghiệm đầu tiên .

Lý lịch

Hãy nhớ lại rằng định lý của Wilson nói rằng với mọi số nguyên p> 1 ,

nghĩa là (p - 1)! + 1 chia hết cho p khi và chỉ khi p là số nguyên tố.

Nếu p> 1 không phải là số nguyên tố, nó là hợp số; Đặt q là ước nguyên tố nhỏ nhất của p . Rõ ràng, q p / q . Có hai trường hợp:

  • Nếu q = p / q , ta có p = q² .

    Nếu q = 2 , (p - 1)! = 3! = 6 , vì vậy (p - 1)! đồng dạng với 2 modulo p .

    Nếu p / q = q> 2 , thì 2q <p . Theo cách này, q2q đều nằm trong số 1, Mạnh , p - 1 , có sản phẩm là giai thừa của p - 1 , vì vậy 2p = 2q² = q · 2q chia (p - 1)! như nhau.

  • Nếu q <p / q , qp / q đều nằm trong số 1, Số, p - 1 , do đó p = q · p / q chia (p - 1)! như nhau.

Tổng hợp,

cho tất cả các số nguyên p> 1 .

Bây giờ, đối với tất cả các số nguyên và tất cả các số nguyên a , bc , các giá trị sau.

Khi a = -1 , b = 11c = -1 , chúng ta theo đó

và, vì 21-23 là modulo đồng dạng 44-111p-1 là modulo 11p đồng dạng , chúng ta đi đến kết luận sau.

Đối với tất cả các giá trị có thể có của p , kết quả ( 11 , 21 hoặc 11p - 1 ) sẽ nằm trong phạm vi 0, Lít, 11p - 1 , vì vậy các giá trị này khớp với các giá trị sẽ được %toán tử Python trả về .

Làm thế nào nó hoạt động

Chúng tôi khởi tạo c , km thành 11 sau khi lưu đầu vào trong n . c sẽ là hằng số cho phần còn lại của chương trình. Vì có ba lần xuất hiện của c trên dòng sau và việc gán c chỉ tốn hai byte, điều này giúp tiết kiệm một byte. k có thể nghĩ về 11p bằng cách sử dụng nghĩa của p từ đoạn trước; ban đầu, k = 11 = 11 · 1! . m chiếm vị trí 11 · (p - 1)! ; ban đầu, m = 11 = 11 · 0! . kmsẽ thỏa mãn mối quan hệ m = 11 · (k / 11)! mọi lúc

n đại diện cho số lượng palindromes của Stephen Stephen mà chúng ta phải tìm. Vì k = 11 ban đầu, chúng tôi có thể xuất k nguyên văn mà không cần tính toán thêm. Tuy nhiên, khi n dương, chúng ta nhập vòng lặp while. Vòng lặp bắt đầu bằng cách nhân m với k / c = p , sau đó thêm 11 vào k , do đó tăng p . Nếu k là thành viên của chuỗi, chúng ta trừ 1 từ n và bắt đầu lại. Khi n đạt 0 , chúng tôi tìm thấy thành viên chuỗi ở chỉ mục mong muốn và thoát ra khỏi vòng lặp, sau đó in giá trị cuối cùng của k.

Cách diễn đạt

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

thực hiện kiểm tra thực tế và kết quả của nó ( Đúng / 1 cho các thành viên chuỗi, 0 / Sai nếu không) được trừ khỏi n . Như đã thấy trước đây, ~ m% k = (-m - 1)% k = (-11 · (p - 1)! - 1)% 11p bằng 10 nếu p là số nguyên tố, 21 nếu p = 411p - 1 > 43 nếu p> 4 là hợp số. Do đó, sau khi trừ c = 11 , chúng ta còn lại -1 cho số nguyên tố p và số nguyên dương lớn hơn 9 nếu không.

Đối với số nguyên tố p , ​`k`[::-1]cung cấp cho chúng ta biểu diễn chuỗi của k với thứ tự chữ số đảo ngược, do đó so sánh nó với ​`k`​kiểm tra xem k có phải là một bảng màu hay không. Nếu có, tất cả các điều kiện được đáp ứng và k là thành viên chuỗi. Tuy nhiên, nếu p không phải là số nguyên tố, bước phạm vi lớn và thực tế là k sẽ luôn có nhiều hơn một chữ số có nghĩa là ​`k`[::-1]không thể có cùng số chữ số như ​`k`​, hãy để nó bằng với nó.


4
Tôi phải nói rằng, bài kiểm tra nguyên thủy của bạn thực sự xuất sắc. Tôi không thể cạnh tranh với câu trả lời này.
Đăng Rock Garf Hunter

2
Điều này đầy hứa hẹn nhưng bỏ qua 121.
xnor

@xnor Được quản lý để bao gồm 121 với chi phí thêm một byte. Cảm ơn!
Dennis

8

Brachylog , 17 byte

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

Hãy thử trực tuyến!

Đây là 1 chỉ mục.

Giải trình

: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

Hai nhận thức với câu trả lời này:

  • Tôi cần khắc phục thực tế là siêu ký tự chuyển sang siêu dữ liệu (với ) không hoạt động nếu không có đầu vào để vượt qua (đó là lý do tại sao tôi phải thêm :I).
  • Tôi cần thêm một siêu dữ liệu để có Nkết quả thứ của một vị từ (điều này sẽ tránh sử dụng ᶠ⁽tvà thay vào đó, ví dụ ⁿ⁽).

Thực hiện cả hai thay đổi sẽ làm cho câu trả lời 14 byte.


5

Toán học, 65 60 byte

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

Lặp lại trực tiếp thông qua các số nguyên tố bằng cách sử dụng NextPrimevà kiểm tra xem 11 lần số nguyên tố có phải là một bảng màu hay không. Hoạt động tới N = 528 . Kết quả 528 và 529 cách nhau hơn 2 16 số nguyên tố, tại thời điểm đó //.sẽ không thử đủ số lần thay thế.


4

Python 2 , 111 107 103 102 101 100 91 90 89 byte

Dennis đã đánh tôi ở đây , vì vậy hãy kiểm tra câu trả lời của anh ấy.

Câu trả lời này là không có chỉ mục

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

Hãy thử trực tuyến!

Một byte được lưu nhờ vào toán rác

Giải trình

Đầu tiên chúng ta lấy đầu vào và đặt nó vào, nchúng ta cũng tạo một biến mới r=1. Chúng tôi sẽ tính toán rtìm kiếm các palindromes là sản phẩm của một số nguyên tố và 11. Mỗi lần chúng tôi tìm thấy một thứ chúng tôi sẽ giảmn cho đến khi nó đạt 0.

Vì vậy, chúng tôi bắt đầu một vòng lặp:

while n:

Điều đầu tiên chúng tôi làm là tăng r

r+=1

Chúng tôi cũng xác định trước một biến clà biểu diễn chuỗi củar*11

c=`r*11`

Bây giờ chúng tôi muốn giảm nnếu chúng tôi đã tìm thấy một số như vậy. Chúng tôi chỉ đơn giản sẽ trừ một boolean đại diện nếu r*11phù hợp với mô hình từ r. Nếu điều này là Falsechúng ta sẽ trừ đi số 0 và nếu có thì Truenó sẽ trừ đi 1.

Để tính toán boolean chúng ta làm:

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

Phần đầu tiên allsẽ xác định nếu rlà số nguyên tố. Chúng tôi nhân kết quả với cif rlà số nguyên tố này sẽ chỉ là cnhưng nếu rlà tổng hợp thì nó sẽ là ""chuỗi rỗng. Sau đó chúng tôi so sánh điều này với c[::-1]mặt trái của c. Nếu rlà số nguyên tố và clà một bảng màu thì đây sẽ làTrue , nếu một trong hai lỗi, toàn bộ điều sẽ đánh giá là sai.

Khi nbằng không chúng ta chỉ đơn giản print c.

83 byte

Đây là một giải pháp đệ quy ngắn hơn nhưng không may không đáp ứng được thông số kỹ thuật vì nó chạm nắp đệ quy của python quá nhanh.

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

Hãy thử trực tuyến!


4

05AB1E , 15 byte

Chỉ số 0.

11Iµ11N*DÂQNp*½

Hãy thử trực tuyến!

Giải trình

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

Haskell , 94 90 byte

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]!!)

Hãy thử trực tuyến! Ví dụ sử dụng : ([n|n<-[0,11..],(==)=<<reverse$show n,3>2#n]!!) 127.

[0,11..]xây dựng danh sách vô hạn [0,11,22,33, ...](số 0 là cần thiết để tạo chuỗi 1 được lập chỉ mục). Đối với mỗi ntrong danh sách này, chúng tôi kiểm tra n==(read.reverse.show)n, đó là cho dù nlà một palindrom. 3>2#nkiểm tra nếu ncó nhiều nhất hai ước số nguyên tố. Bởi vì nluôn luôn chia hết cho 11, chúng tôi không nhận được bất kỳ số nguyên tố thực sự nào mà chỉ có các bán kết.

Chỉnh sửa: Cảm ơn Ørjan Johansen vì đã chơi golf 4 byte!


Bạn không cần dấu ngoặc đơn xung quanh div n h. Ngoài ra, nó chỉ ảnh hưởng đến hiệu quả, nhưng điều đầu tiên 2#có thể là h#.
Ørjan Johansen

(==)=<<reverse$show nngắn hơn
Ørjan Johansen

2

PHP, 82 byte

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

Hãy thử trực tuyến!


trong "thử trực tuyến" nơi tôi phải viết đầu vào? nếu tôi viết 1 vào ô "đầu vào" thì nó trả về 395593
RosLuP

@RosLuP Thông thường, nó chạy từ dòng lệnh với tùy chọn -R. Trong Phiên bản trực tuyến, bạn có các giới hạn và $argn=81;là biến đầu vào có sẵn trong phiên bản dòng lệnh
Jörg Hülsermann

vì vậy người ta chỉ cần viết biến đầu vào trong "$ argn = 81", ví dụ nếu đầu vào là 10 chỉ cần viết lại "$ argn = 10" ok, Cảm ơn bạn
RosLuP

@RosLuP Có, thay thế số 81 bằng đầu vào bạn muốn
Jörg Hülsermann

1

Tiên đề, 105 byte

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)

ungolf, mã kiểm tra và kết quả

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

Ở đây g (700) = 92511529 nên giới hạn sẽ là> 700; ww (1000) = 703999307 nhưng sử dụng nextPrime ()

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.