Різні способи визначення простих чисел


32

Одне з моїх улюблених визначень простих чисел:

  • 2 - найменший прайм.

  • Числа, що перевищують 2, є простими, якщо їх не ділити на менший простий.

Однак це визначення здається довільним, чому 2? Чому б не якесь інше число? Що ж, давайте спробуємо деякі інші числа визначити n-prime такі, що

  • n - найменший n-простий.

  • Числа, що перевищують n, є n-простими, якщо вони не діляться меншим n-простим.

Завдання

Завдання тут - написати програму, яка приймає два входи, натуральне ціле n та додатне ціле a . Потім він вирішить, чи є a n -приміром. Ваша програма повинна виводити два різних значення, одне для "так, це n-prime" і одне для "no, це не n-prime".

Це питання з кодовим гольфом, тому відповіді будуть набиратись у байтах, а менше байтів - кращих.

Тести

Ось списки перших 31 прайме для n = 2 до n = 12 (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 є простим)".
Міша Лавров

2
"Числа, що перевищують 2, є простими, якщо їх не розділити на менший простий". - Це визначення дозволяє будь-яке число бути простим. Можливо, ви хочете сказати iff замість if ?

5
@ThePirateBay Я не маю на увазі точний математичний сенс цього слова, якщо. Я збираюся залишити його.
Пшеничний майстер

1
@JeppeStigNielsen Це не дуже важко довести. Усі складені числа, які є n-простими, повинні мати лише прості коефіцієнти, менші ніж n. Ми також знаємо, що жоден підмножина їх факторів не може мати добуток, більший за n, тому що наша кількість поділяється на це. Таким чином, кожен n-простий є або 2-простим, або добуток на 2 числа менше n. Існує лише кінцева кількість пар чисел менше n, тому існує лише кінцеве число складених n-простих чисел. Сподіваюсь, це має сенс, мені довелося скоротити його, щоб вписати його в коментар.
Пшеничний майстер

Відповіді:


9

Haskell , 45 байт

n!a=not$any(n!)[x|x<-[n..a-1],mod a x<1]||n>a

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

Я визначаю хорошу рекурсивну функцію (!):

n!aперевіряє, чи будь-який коефіцієнт aу діапазоні [n,a-1]дорівнює n-prime. Потім це заперечує результат. Це також гарантує цеn>a



@WheatWizard Я сподівався, що хтось опублікує коротше рішення :)
H.PWiz


4

Python 3 , 45 байт

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

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

Як це працює

Це приймає два цілі числа як вхідні, i та k . Спочатку перевіряємо, чи k ≥ i . Потім генерує діапазон [i, k) і для кожного цілого числа N у цьому діапазоні перевіряє, чи N є корінним до k . Якщо обидві умови виконані, то k є i -приміром.


Ви не можете використовувати &замість цього 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&) для кожного числа k від nдо 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є результатом тестування первинності для x(оскільки ми додалиy до початкового діапазону).

Помноження на x >: yте, що ми отримуємо значення фальси ( 0) на xменше y.


3

JavaScript (ES6), 33 32 30 байт

Здійснює введення в синтаксис currying (n)(a). Повертається булевим.

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

Демо


3

Haskell , 30 байт

2 байти збережено завдяки ідеї H.PWiz, яка була запозичена у відповіді Флора

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

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

Добре, оскільки минуло певний час, і єдина відповідь Хаскелла до цих пір - 45 біт, я вирішив опублікувати власну відповідь.

Пояснення

Ця функція перевіряє, що єдине число між n і a , на яке ділиться a, є саме собою.

Тепер визначення лише згадує n -приміри менші за а , тому чому ми перевіряємо всі ці додаткові числа? Чи не виникне у нас проблем, коли a ділиться на деякий n- композит, більший за n ?

Ми цього не зробимо, тому що якщо n -складений більший за n, він повинен бути розділений на менший n -prime за визначенням. Таким чином , якщо вона ділить так повинно менше п -прем'єр.

Якщо a менший за n, [n..a] то, []таким чином, не може бути рівним, що [1]призводить до того, що перевірка не працює.





1

постійного струму , 40 34 37 байт

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

Я б включив посилання TIO, але TIO, здається, має несправний розподіл, dcбачачи, як це працює за призначенням у моїй системі, але Qкоманда помилково функціонує в TIO. Натомість, тут посилання на bashтестовий майданчик з правильно функціонуючою версією dc:

Демонструйте це!


1

APL (Діалог) , 24 байти

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

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

Як?

⍳⍵- 1доa

o←⍺↓- nto a, save too

o|⍨⊂o- модулюйте кожен елемент у oкожному елементіo

0=- перевірити, де вона дорівнює 0(ділиться)

+/¨ - підсумовуйте кількість підрозділів

1= - якщо у нас є лише одне, то число ділиться лише на себе

o/⍨ - тому ми зберігаємо ці випадки

⍵∊- aв цьому залишковому масиві?




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