Перелічіть праймери Софі Жермен


10

Питання

Софі Жермен головним є простим р таким чином, що 2р + 1 є простим , а також. Наприклад, 11 - це прем'єр Софі Жермен, тому що 23 є простим. Напишіть найкоротшу програму для обчислення лінійки Софі Жермен у порядку зростання

Правила

  • Праймери Софі Жермен повинні бути створені вашою програмою, а не із зовнішнього джерела.
  • Ваша програма повинна обчислити всі прайми Софі Жермен під 2³ -1
  • Ви повинні надрукувати кожну окрему Софі Жермен, яка є вашою програмою.
  • Перемагає людина з найнижчою оцінкою

Оцінка балів

  • 2 бали за байт вашого коду
  • -10, якщо ви можете показати прайм-генеру, створений вашою програмою більше 2³ -1

Коментарі не для розширеного обговорення; ця розмова була переміщена до чату .
Мартін Ендер

Відповіді:


4

CJam

За 17 знаків ми отримуємо повне перерахування до 2 ^ 32:

G8#,{_mp*2*)mp},`

Для ще чотирьох знаків ми отримуємо діапазон, достатньо великий, щоб включати прайм SG, більший за 2 ^ 32:

G8#K_*+,{_mp*2*)mp},`

оскільки 4294967681 = 2 ^ 32 + 385 <2 ^ 32 + 400.

Звичайно, ми могли б однаково розширити асортимент безкоштовно

C9#,{_mp*2*)mp},`

Це означає, що ви можете подати його без бонусу на 17 символів або з бонусом за 21 символ
Meow Mix

@ user3502615 або з бонусом на 17 символів. Хоча спірним є те, чи справді список SG Prime I був породжений "моєю програмою", оскільки у мене немає достатньо потужного комп'ютера, щоб запустити його так далеко.
Пітер Тейлор

I,розглядає в Iякості підписаного 32-розрядної цілого числа, так що значення для максимального Iце 2 ** 31 - 1.
Денніс

2
@Dennis, це документально підтверджене властивість мови чи химерність реалізації Java?
Пітер Тейлор

Це не задокументовано, але поведінка відповідає як Java, так і онлайн-перекладачу.
Денніс

3

Pyth, 19 байт * 2 - 10 = 28

Зауважте, що онлайн-компілятор / виконавець не показує вихід, оскільки це нескінченний цикл.

K1#~K1I&!tPK!tPhyKK

Пояснили:

K1                      K=1
  #                     While true:
   ~K1                  K+=1
      I                 If
       &                logical AND
        !tPK            K is prime
            !tPhyK      2*K+1 is prime (y is double, h is +1)
                  K     Print K

PZне повертає правдивої чи хибної цінності. Він повертає основну факторизацію Z. Тестування на прайм - це те !tPZ, що перевіряє, чи містить основна факторизація лише один фактор.
Якубе

Так. Зараз це працює. !tPпомилок 0і 1бути першочерговим, оскільки їх основна факторизація містить лише 1 фактор. Легке виправлення - це замінити все ZнаK і призначення K2на початку.
Якубе

Деякі інші гольфи: призначте K1замість цього K2і поміняйте імпульси на приріст. Таким чином ви можете видалити ). І +1*K2це те саме, щоhyK .
Якубе

Ах, я щойно читав про них на сторінці підручника. Це працює для вас на pyth.herokuapp.com/?code=K2%23I%26!tPK!tPhyKK)~K1&debug=0
mbomb007

Онлайн-компілятор не показує результату, оскільки програма застрягла у нескінченному циклі. І веб-сайт показує лише вихід, після закінчення програми. Я перевірив код за допомогою автономного компілятора. Це працює.
Якубе

1

Pyth - 2 * 16 байт - 10 = 22

Використовує звичний метод перевірки простих даних в Pyth з !tPі застосовує його як до числа, так і до його безпечного просте, з невеликою хитрістю, щоб перевірити обидва відразу. Піднімається 10^10, тому я йду на бонус.

f!+tPTtPhyTr2^TT

Пояснення найближчим часом.

f          r2^TT     Filter from 2 till 10^10
 !                   Logical not to detect empty lists
  +                  List concatenation
   tP                All but the firs element of the prime factorization
    T                The filter element
   tP                All but the firs element of the prime factorization
    hyT              2n+1

Спробуйте під 1000 в Інтернеті .


1
Для цього потрібна машина з приблизно 40 ГБ оперативної пам’яті. Досить ефективно ;-)
Jakube

Я не думаю, що ти можеш вимагати - 10, якщо ти фактично не запустив код?
orlp

@orlp ні, я запитав ОП, і він сказав, що достатньо зменшити
Maltysen

1
#include<stdio.h>
#include<math.h>

int isprime(int);
int main(){
    int check,n,secondcheck;
    printf("enter how long you want to print\n");
    scanf("%d",&n);
    for(int i=2;i<n;i++){
        check = isprime(i);
        if(check==0){
        secondcheck = isprime(2*i+1);
        if(secondcheck==0){
        printf("%d\t",i);
        }
        else
        continue;
        }
    }
}
int isprime(int num){   
    int check = num,flag=0;
     num = sqrt(num);
    for(int i=2;i<=num;i++){
        if(check%i==0){
            flag=1;
            return 1;
        }
    }
    if(flag==0){
        return 0;
    }
}

3
Подумайте про програму гольфу (вилучивши простір ..etc) і подивіться, як далеко ви можете дістатися
Mhmd

0

CJam, 34 (2 * 22 - 10)

C9#{ImpI2*)mp&{Ip}&}fI

Друкує всі праймери Софі Жермен під 12 ** 9, що включає 4294967681 > 2 ** 32.

Я вважаю, що це займе приблизно 8 годин на моїй машині. Я запускаю його сьогодні ввечері.


0

Хаскелл, 2 * 54-10 = 98 132

i a=all((>0).rem a)[2..a-1]
p=[n|n<-[2..],i n,i$2*n+1]

i- це головна перевірка. pприймає всі числа, nде обидва nі 2*x+1є простими. p- це нескінченний список.

Редагувати: кращий спосіб перевірити, чи 2*n+1є простим.


0

Юлія, 2 * 49 - 10 = 88

p=primes(2^33)
print(p[map(n->isprime(2n+1),p)])

Друкує їх у вигляді списку, [2,3,5,11,...]. Якщо цей формат, використовуючи primesфункцію або чекаючи, поки всі обчислення будуть виконані для друку, є неприйнятним, він друкує їх по одному на рядок під час проходження.

isprime=f
for i=1:2^33;f(i)&&f(2i+1)&&println(i)end

Трохи довше, 52 символи. Обидва обчислюють усі суми Софі Жермен 2^33, тому вони повинні отримати знижку 10 балів.


0

Python 3, 124 123 байт

i=3
q=[2]
while 1:
 p=1
 for x in range(2,round(i**.5)+1):p=min(p,i%x)
 if p:
  q+=[i];s=(i-1)/2
  if s in q:print(s)
 i+=2

Як це працює?

i=3                                 # Start at 3
q=[2]                               # Create list with first prime (2), to be list of primes.
while 1:                            # Loop forever
 p=1                                # Set p to 1 (true)
 for x in range(2,round(i**0.5)+1): # Loop from 2 to the number's square root. x is the loop value
     p=min(p,i%x)                   # Set p to the min of itself and the modulo of
                                    # the number being tested and loop value (x).
                                    # If p is 0 at the end, a modulo was 0, so it isn't prime.
 if p:                              # Check if p is 0
  q+=[i]                            # Add the current number (we know is prime) to list of primes (q)
  s=(i-1)/2                         # Generate s, the number that you would double and add 1 to make a prime.

  if s in q:print(s)                # If (i-1)/2 is a prime (in the list), then that prime satifies
                                    # the condition 2p+1 is prime because i is 2p+1, and i is prime
 i+=2                               # Increment by 2 (no even numbers are prime, except 2)

Спробуйте його онлайн тут .


Мій комп'ютер каже, що він генерував 0,023283% усіх праймерів Софі Жермен нижче 2 ^ 32.

Коли буде закінчено, я опублікую його на пастібіні, якщо буде достатньо рядків. Ви можете використовувати його, щоб перевірити, чи є у вас їх усі.


.5коротше0.5
mbomb007

0

Perl, 2 * 57-10 = 104

use ntheory":all";forprimes{say if is_prime(2*$_+1)}2**33

2
3
5
11
...
8589934091
8589934271

42 секунди до 2 ^ 32, 1м26 до 2 ^ 33. Запуститься на 50% швидше, якщо 2*$_+1записано як, 1+$_<<1але це ще один байт.

Модуль також встановлює primes.plбагато фільтрів, включаючи один для праймів Софі-Жермен. Отже: primes.pl --so 2**33(20 байт)


0

Рубі, 61 * 2 - 10 = 112

require'prime';Prime.each(1.0/0)do|n|p Prime.prime?(n*2+1)end

Щоб надрукувати всі значення до 2 ** 32, потрібно було б назавжди

Редагувати

Поголив кілька байтів, що замінюють Float :: INFINITY на 1,0 / 0


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