Паліндромні прими без 11


14

Кожен паліндром з парною кількістю цифр ділиться на 11, тому 11 є єдиним [паліндромним простим числом] з парним числом цифр. - Девід Вассерман, ОЕІС

Я дізнався це сьогодні ручним способом, перш ніж проводити дослідження, коли моя програма пропускала числа з парною кількістю цифр (крім 11) під час обчислення паліндромних простих чисел. Ваше завдання: створити програму або функцію, яка при заданому цілому вході N видає N-й член у Palindromic Sequence ™ Stephena ™.

Паліндромна послідовність Stephena ™

Palindromic Sequence Stephena ™ починається з 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 (не забудьте скоригувати тестові випадки), якщо ви вказали це у своїй відповіді. Дозволено проходження нових рядків.

Вихідні дані

N-й термін у Palindromic Sequence ™ Stephena ™. Дозволено проходження нових рядків.

Правила

  • Єдиний вхід, який може взяти ваша програма / функція, - N. Ваша програма, наприклад, не може отримати послідовність із OEIS (так само застосовуються стандартні лазівки ).
  • Ви повинні мати можливість надрукувати вихід до шести цифр (N = 127). Час не є фактором - однак, якщо ваша програма / функція стає дуже довго дуже швидкою, ви повинні довести, що алгоритм працює. Якщо ваша мова, природно, дозволяє більш тривалий вихід, ви можете дозволити їй розширюватися природним чином до меж або обмежувати її на десять цифр, залежно від того, що вам зручніше. Вихід / припинення за межами вашого значення не має значення, доки він не здається дійсним результатом.
  • Функція програми / функції на недійсному вході не має значення.


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

Python 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

Дякуємо @WheatWizard за те, що виграли 3 байти!

Дякуємо @ ØrjanJohansen за те, що виграли 1 байт!

Дякуємо @xnor та @ ØrjanJohansen за прокладку шляху до 68 байт!

Вхід 0-індексований. Спробуйте в Інтернеті! або перевірити перші 31 тестовий випадок .

Фон

Нагадаємо, що теорема Вілсона стверджує, що для всіх цілих чисел p> 1 ,

значить, що (р - 1)! + 1 рівномірно ділиться на p, якщо і лише тоді, коли p є простим.

Якщо p> 1 не є простим, він є складовим; нехай q - найменший простий дільник p . Ясно, що q ≤ p / q . Є два випадки:

  • Якщо q = p / q , маємо, що p = q² .

    Якщо q = 2 , (p - 1)! = 3! = 6 , так (р - 1)! відповідає 2 модулю p .

    Якщо p / q = q> 2 , значить, 2q <p . Таким чином, q і 2q обидва серед 1,…, p - 1 , добуток якого є факторієм p - 1 , тому 2p = 2q² = q · 2q ділиться (p - 1)! рівномірно.

  • Якщо q <p / q , q і p / q обидва серед 1,…, p - 1 , то p = q · p / q ділиться (p - 1)! рівномірно.

Підводячи підсумки,

для всіх цілих чисел p> 1 .

Тепер для всіх цілих конгруенцій і всіх цілих чисел a , b і c виконується наступне.

Коли a = -1 , b = 11 і c = -1 , ми випливаємо це

і, оскільки 21 і -23 є конгруентними по модулю 44, а -1 і 11p-1 є конгруентними по модулю 11p , ми дійшли наступного висновку.

Для всіх можливих значень p результат ( 11 , 21 або 11p - 1 ) впаде в діапазон 0,…, 11p - 1 , тому ці значення відповідають тим, які будуть повернуті %оператором Python .

Як це працює

Ініціалізуємо c , k і m до 11 після збереження вводу в n . c буде постійною для решти програми. Оскільки в наступному рядку є три входження c, а призначення c коштує лише два байти, це економить байт. k можна думати 11p, використовуючи значення p з попереднього абзацу; спочатку k = 11 = 11 · 1! . м займає місце 11 · (р - 1)! ; спочатку m = 11 = 11 · 0! . к і мзадовольнить співвідношення m = 11 · (k / 11)! в будь-який час.

n позначає кількість “паліндромів Стівена”, які ми маємо знайти. З тих пір k = 11 спочатку, ми можемо вивести k дослівно без подальшого обчислення. Однак, коли n додатний, ми вводимо цикл while. Петля починається з множення m на k / c = p , потім додаючи 11 до k , тим самим збільшуючи 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 > 43, якщо р> 4 складений. Таким чином, після вирахування з = 11 , ми залишилися з -1 для простого р і ціле позитивне число більше , ніж 9 в іншому випадку.

Для простого р , ​`k`[::-1]дає нам строкове представлення до зі зворотним послідовністю цифр, тому порівнюючи його ​`k`​перевіряє , знаходиться чи до паліндром. Якщо це так, всі умови виконуються і k - член послідовності. Однак, якщо p не є простим, крок великого діапазону і той факт, що k завжди матиме більше однієї цифри, означають, що ​`k`[::-1]не може бути такої ж кількості цифр, що ​`k`​, не кажучи вже, дорівнює йому.


4
Треба сказати, ваш тест на первинність справді геніальний. Я не можу конкурувати з цією відповіддю.
Пост Рок-Гарф Хантер

2
Це багатообіцяє, але пропускає 121.
xnor

@xnor Керував, щоб включити 121 вартість додаткового байта. Спасибі!
Денніс

8

Брахілог , 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

Дві реалізації з цією відповіддю:

  • Мені потрібно зафіксувати той факт, що передача надпрограми до метапредметів (з ) не працює, якщо немає вводу для передачі (саме тому я повинен додати :I).
  • Мені потрібно додати метапредмет, щоб отримати N th результат присудка (що б уникнути використання, ᶠ⁽tа замість нього, наприклад ⁿ⁽).

Реалізація обох змін дозволила б відповісти 14 байтами.


5

Математика, 65 60 байт

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

Ітератує безпосередньо через праймери, використовуючи NextPrimeта перевіряючи, чи є 11 разів простим числом паліндром. Працює до N = 528 . Результати 528 і 529 є більш ніж 2 16 простими елементами, після чого //.не вдасться здійснити достатню кількість замін.


4

Python 2 , 111 107 103 102 101 100 91 90 89 байт

Денніс мене тут побив , тож піди перевірити його відповідь.

Ця відповідь індексується нулем

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

Спробуйте в Інтернеті!

Один байт збережено завдяки математиці наркоману

Пояснення

Спочатку беремо вхід і встановлюємо його, nми також робимо нову змінну r=1. Ми підрахуватимемо rпошук паліндромів, які є продуктом простого і 11. Кожного разу, коли ми знайдемо один, будемо зменшувати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є простим. Ми помножимо результат на, cякщо rє простим, це буде просто, cале якщо rскладеним, то буде ""порожнім рядком. Потім ми порівнюємо це c[::-1]із зворотним c. Якщо rце просто і cє паліндром, це буде True, якщо будь-який не вдасться, то вся справа буде оцінена як помилкова.

Коли 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

Haskell , 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-індексованою). Для кожного nз цього списку ми перевіряємо n==(read.reverse.show)n, чи nє паліндром. 3>2#nперевіряє, чи nмає максимум два простих дільника. Оскільки nзавжди ділиться на 11, ми не отримуємо ніяких справжніх прайменів, а лише напівпримітки.

Редагувати: Дякую Шріану Йохансену за те, що гольфували 4 байти!


Круглі дужки навколо не потрібні 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

тож просто потрібно написати вхідну змінну у "$ argn = 81", тому, наприклад, якщо вхід є 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)

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.