Список простых чисел Софи Жермен


10

Вопрос

Софи Жермен главным является простым р таким образом, что 2р + 1 является простым , а также. Например, 11 - простое число Софи Жермен, потому что 23 также простое число. Напишите самую короткую программу для вычисления простых чисел Софи Жермен в порядке возрастания

правила

  • Простые числа Софи Жермен должны генерироваться вашей программой, а не из внешнего источника.
  • Ваша программа должна вычислить все простые числа Софи Жермен под 2³²-1
  • Вы должны распечатать каждый отдельный штрих Софи Жермен, найденный вашей программой.
  • Человек с самым низким счетом выигрывает

счет

  • 2 балла за байт вашего кода
  • -10, если вы можете показать простое число, сгенерированное вашей программой, больше чем 2³²-1

Комментарии не для расширенного обсуждения; этот разговор был перенесен в чат .
Мартин Эндер

Ответы:


4

CJam

Для 17 символов мы получаем полное перечисление до 2 ^ 32:

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

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

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

с 4294967681 = 2 ^ 32 + 385 <2 ^ 32 + 400.

Конечно, мы могли бы в равной степени расширить диапазон бесплатно

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

Это означает, что вы можете отправить его без бонуса за 17 символов или с бонусом за 21 персонаж
Мяу Микс

@ 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, и поменяйте местами if и инкремент. Таким образом, вы можете удалить ). И +1*K2это то же самое, что и hyK.
Якубе

Ах, я только что прочитал об этом на странице учебника. Работает
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

@ или нет, я спросил OP, и он сказал, что будет достаточно уменьшить
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
Пожалуйста, рассмотрите игру в гольф (удалив пробел .. и т. Д.) И посмотрите, как далеко вы можете пройти.
Mhmd

0

CJam, 34 (2 * 22 - 10)

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

Печатает все простые числа Софи Жермен 12 ** 9, в том числе 4294967681 > 2 ** 32.

По моим оценкам, это займет около 8 часов на моей машине. Я буду управлять этим вечером.


0

Haskell, 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.

Когда он закончится, я выложу его на pastebin, если будет достаточно строк. Вы можете использовать это, чтобы проверить, что у вас есть все.


.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, от 1m26 до 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.