11のないパリンドローム素数


14

偶数桁のパリンドロームは11で割り切れるので、偶数桁の唯一の[回文素数]が11です。- デイビスワッサーマン、OEIS

私は今日、これを手作業で学びました。調査を行う前に、パリンドローム素数の計算時にプログラムが偶数桁(11を除く)の数値をスキップしたときです。あなたのタスク:整数入力Nが与えられると、StephenのPalindromic Sequence™のN番目の項を出力するプログラムまたは関数を作成します。

スティーブンのパリンドロームシーケンス™

Stephenの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は定義上フィボナッチ数でもありません:)
スティーブン

回答:


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

パイソン276の 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

@WheatWizardに3バイトのゴルフをしてくれてありがとう!

1バイトのゴルフをしてくれた@ØrjanJohansenに感謝します!

68バイトへの道を開いてくれた@xnorと@ØrjanJohansenに感謝します!

入力は0から始まります。オンラインでお試しください!または、最初の31個のテストケースを確認します。

バックグラウンド

リコールそのウィルソンの定理のように述べているすべての整数のためのp> 1

つまり(p-1)!+ 1はで割り切れるP場合にのみ、pは素数です。

p> 1が素数でない場合、合成されます。聞かせてqが最小の素数除数ことのp。明らかに、q≤p / qです。次の2つの場合があります。

  • q = p / qの場合、p =q²です。

    q = 2の場合、(p-1)!= 3!= 6なので、(p-1)!2モジュロpと一致します。

    もしP / Q = Q> 2、そうP <2Q。この方法では、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に対して

現在、すべての整数合同およびすべての整数ab、およびcについて、以下が成り立ちます。

とき= -1B = 11、およびC = -1、我々は従うこと

また、21-2344を法とする合同であり、-111p-111pを法とする合同であるため、次の結論に達します。

すべての可能な値についてP、結果(1121、又は11P - 1)の範囲内に入る0、...、11P - 1、これらの値はPythonのによって返されるものと一致するように%オペレータに。

使い方

入力をnに保存した後、ck、およびm11に初期化します。cは、プログラムの残りの部分では一定です。そこの3つの出現しているので、Cの次の行には、および割り当てcのコストだけで2バイトを、このバイトを保存します。kは、前の段落のpの意味を使用して11pと考えることができます。最初は、k = 11 = 11・1!m11・(p-1)の代わりになります!; 最初は、m = 11 = 11・0!kおよびm関係m = 11・(k / 11)を満たします!常に。

nは、見つけなければならない「スティーブンの回文」の数を表します。以来、K = 11最初に、我々は出力できKさらなる計算なしにそのまま。ただし、nが正の場合、whileループに入ります。ループは、mk / c = pを乗算し、次にk11を加算して、pをインクリメントすることから始まります。場合、kはシーケンスのメンバーであり、我々は減算1からNとやり直します。一旦N到達0、我々は、所望のインデックスのシーケンス部材を発見し、ループから抜け出す、その後の最後の値印刷Kを

表現

`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`[::-1]kの文字列表現が得られるので、それを比較してkが回文である​`k`​かどうかを調べます。そうである場合、すべての条件が満たされ、kはシーケンスメンバーです。ただし、pが素数でない場合、大きな範囲のステップとkが常に1桁以上になるという事実は、それと同じ桁数はもちろん、同じ桁数を持たないことを意味します。​`k`[::-1]​`k`​


4
私は言わなければならない、あなたの素数性テストは本当に素晴らしいです。私はこの答えに対抗できません。
ポストロックガーフハンター

2
これは有望ですが、121をスキップします。
xnor17年

@xnor余分なバイトを犠牲にして121を含めることができました。ありがとう!
デニス

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

この答えで2つの実現:

  • 渡す入力がない場合は、メタ述語(with )に上付き文字を渡すことが機能しないという事実を修正する必要があります(これがを追加する必要がある理由です:I)。
  • メタN述語を追加して、述語のth番目の結果を取得する必要があります(ᶠ⁽t代わりにand を使用しないようにしⁿ⁽ます)。

両方の変更を実装すると、その回答は14バイトになります。


5

Mathematica、65 60バイト

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

を使用して素数を直接反復し、NextPrime11倍の素数が回文であるかどうかを確認します。N = 528まで機能します。結果528と529は2 16素数以上離れ//.ているため、十分な数の置換を試みることができません。


4

パイソン2111 107 103 102 101 100の 91 90の 89バイト

デニスはここでbeatられので、彼の答えをチェックしてください。

この答えはゼロインデックスです

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=1rプライムと11の積であるパリンドロームの検索をカウントアップします。1を見つけるたびnに、0に達するまでデクリメントします。

そこで、ループを開始します。

while n:

最初に行うことはインクリメントです r

r+=1

変数cの文字列表現として変数も事前定義しますr*11

c=`r*11`

nそのような数値が見つかった場合、デクリメントします。r*11パターンに適合するかどうかを表すブール値を単に減算しrます。これがFalseゼロの場合、ゼロTrueを減算し、1を減算します。

ブール値を計算するには:

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

最初の部分は、素数であるallかどうかを決定しrます。cif ris primeで結果を乗算しますcが、これは単純ですが、rコンポジットの場合は""空の文字列になります。次に、これをc[::-1]の逆と比較しcます。場合はr素数であるとcされ、これが可能になる回文Trueのいずれかが失敗した場合、全体のことを偽として評価されます。

ときnゼロ、我々は単にですprint c

83バイト

これはより短い再帰的ソリューションですが、残念ながら仕様を満たしていません。Pythonの再帰キャップが速すぎるためです。

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

Haskell94 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からインデックス化するにはゼロが必要です)。nこのリストのそれぞれについてn==(read.reverse.show)n、それがn回文であるかどうかをチェックします。最大で2つの素因数がある3>2#nかどうかnをチェックします。なぜならn 11によって常に割り切れる、我々は、任意の実際の素数だけ半素数を得ることはありません。

編集: 4バイトのゴルフをしてくれたØrjanJohansenに感謝します!


かっこは必要ありませんdiv n h。また、それは効率にのみ影響しますが、2#おそらく最初の可能性がありますh#
Ørjanヨハンセン

(==)=<<reverse$show n短いです。
Ørjanヨハンセン

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;コマンドラインバージョンで提供された入力変数がある
イェルクHülsermann

入力が10である場合は、1つだけの「$ ARGN = 81」の書き込み入力変数にそう例えば、単に「$ ARGN = 10」OK、ありがとう、それを書き換えていますので、
RosLuP

はい@RosLuPあなたが望む入力して数81を置き換える
イェルク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)

ungolf、テストコードと結果

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.