Здравствуйте, гость ( Вход | Регистрация )

 

> Правила форума по Математике

Добро пожаловать на форум по математике. Здесь действуют следующие правила:
1. Здесь обсуждаются только вопросы самой математики или связанные с ней (для других вопросов есть иные разделы форума).
2. При создании темы давайте ей осмысленное название с конкретной постановкой вопроса. Помните, что чем точнее вы опишите проблему, тем быстрее получите на нее ответ.
Запрещено называть темы так: "Задача, надо решить, помогите, срочно, горю, завтра экзамен" (и прочие словоформы).
3. В самой теме пытайтесь наиболее полно раскрыть свою проблему, для формул используйте LaTeX.
4. Здесь за вас никто решать не будет!
4.1. Сообщения из одних только условий задач недопустимы, нужно обязательно выкладывать свои наработки (исключения могут составлять только действительно сложные задачи, а не стандартные примеры).
4.2. Сообщения с просьбой о помощи с предложением оплаты недопустимы.
5. Не забывайте соблюдать элементарные правила вежливости: т.е. говорить пожалуйста и спасибо (выразить благодарность можно, подняв рейтинг участнику, который помог вам справиться с проблемой). Ведь когда помощь оказывается безвозмездно, особую роль играет "СПАСИБО" ;-)
6. Модератор всегда прав. Если модератор не прав, см. п.6.
6.1. Выражать свое несогласие с действиями модератора разрешается только в специальном разделе или в личной переписке с администрацией форума.
Темы и сообщения, оформленные не по правилам, будут удаляться без предупреждения.

6 страниц V  1 2 3 > »   
Ответить в эту темуОткрыть новую тему
> Алгоритм "решета Эратосфена", Нахождение простых чисел в натуральном ряду
 Developer
сообщение 21.5.2009, 9:45
Быстрая цитата Сообщение #1


Мастер
Group Icon

Группа: Модераторы
Сообщений: 3 548
Из: Электрогорск, Московия



Репутация:   239  


Георгий обещал за десять минут написать программу для нахождение простых чисел в натуральном ряду. Пока пишет, я приведу пару реализаций алгоритма.
Вот алгоритм:
1 В последовательности чисел 1,2,3,...,n первые два числа простые.
2 Последовательно вычёркиваем каждое второе число после 2, тогда первое незачёркнутое (3) - простое число.
3 Затем вычёркиваем каждое третье после 3, тогда первое незачёркнутое (5) - простое число.
4 Теперь вычёркиваем каждое пятое после 5, тогда первое незачёркнутое (7) - простое число.
5 Продолжаем вычёркивание для 7, 11 и т.д., пока не дойдём до числа, большего \sqrt{n}.
6 Все незачёркнутые числа - простые.
Количество простых чисел в ряду \overline{1,n} не превышает \left(int(\frac{1,6n}{\ln n}+1)\right), если n\leq 200 или \left(int(\frac{n}{\ln n-2}+1)\right), если n>200.


А вот пример на турбо-бейсике:
Код
'=====================================================
'   This  program demonstrates the SIEVE algorithm of determining prime numbers.
'   The algorithm is often used in benchmarking the speed of compilers.
'                                        
'   In order to run this program do the following:
'     1. Load Turbo Basic by typing TB at the DOS prompt.
'     2. Load the file SIEVE.BAS from the Load option of the File pulldown menu.
'     3. Select Run from the Main menu
'=====================================================
' The Classic Sieve of Eratosthenes Benchmark
'
DEFINT A-Z
DIM Flags(8190)

CLS
PRINT "Sieve - 25 iterations"
X# = TIMER

FOR Iter = 1 TO 25
  Count = 0
  FOR I = 0 TO 8190
    Flags(I) = 1
  NEXT I
  FOR I = 0 TO 8190
    IF Flags(I) THEN
      Prime = I + I + 3
      K = I + Prime
      WHILE K <= 8190
        Flags(K) = 0
        K = K + Prime
      WEND
      Count = Count + 1
'    PRINT prime; : PRINT " ";      
    END IF
  NEXT I
NEXT Iter

XX# = TIMER
PRINT USING "#### primes in ##.### seconds";count;XX#-X#

END

А попозже приведу ещё одну на турбо-паскале.


--------------------
Зри в корень...
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 Nataly-Mak
сообщение 21.5.2009, 14:18
Быстрая цитата Сообщение #2


Активный участник
Group Icon

Группа: Заблокированные
Сообщений: 239
Из: Г. Саратов



Репутация:   16  


Цитата(Developer @ 21.5.2009, 9:45) *

Георгий обещал за десять минут написать программу для нахождение простых чисел в натуральном ряду. Пока пишет, я приведу пару реализаций алгоритма.

А для алгоритма Сундарама у вас есть программа?
Я уже писала здесь (в теме “Взаимно простые числа”) о своей рукописи книги “Компьютер решает головоломки”. В этой рукописи есть глава “Простые числа”, а в главе есть программка для алгоритма Сундарама, которая была написана ещё для допотопной ЭВМ на языке BASIC. С помощью этой программы я получила ряд простых чисел в интервале от 5 до 1000. Сейчас проверила эту программу, она прекрасно работает. Вот она:
Код
5 PRINT "VVEDITE M"
7 INPUT M
10 FOR I = 5 TO M STEP 2
15 B = I: A = (B - 1) / 2
17 C = A - 1
20 FOR N = 1 TO C
25 K = (A - N) / (1 + 2 * N)
30 IF INT(K) = K THEN 40
35 NEXT N
37 PRINT B
40 NEXT I
45 PRINT
50 END

Введите в программу любое натуральное M, до которого вы хотите получить простые числа, и программа их вам выдаст (конечно, в разумных пределах). В интервале от 5 до 1000 программа выдала ряд простых чисел за 3 секунды.





Сообщение отредактировал Nataly-Mak - 21.5.2009, 15:14


--------------------
Не решил сегодня - решишь завтра.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 Developer
сообщение 21.5.2009, 16:00
Быстрая цитата Сообщение #3


Мастер
Group Icon

Группа: Модераторы
Сообщений: 3 548
Из: Электрогорск, Московия



Репутация:   239  


Я не математик, поэтому простыми названиями алгоритмов (например, алгоритм Сундарама) меня смутить невозможно, поскольку я просто не знаю, что это такое.
Русским языком изложите этот алгоритм, Nataly-Mak (в Вашем нике я обнаружил пару пробелов, ASCII код 32), а программу на его основе сделать недолго.


--------------------
Зри в корень...
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 Developer
сообщение 21.5.2009, 16:21
Быстрая цитата Сообщение #4


Мастер
Group Icon

Группа: Модераторы
Сообщений: 3 548
Из: Электрогорск, Московия



Репутация:   239  


Проверил Вашу программу, Nataly-Mak.
1 Она не выводит первые три простых числа 1,2,3.
2 "Работает" то есть выводит правильные результаты и при M>1000.
Я задал ей M=1е6.
Программа отработала несколько минут, окончания работы я ждать не стал, поскольку знаю, что простых чисел должно быть не меньше 250001 (на дисплее в это время мелькали: ...72251, 72253, 72269, 72271, 72277, 72287, 72307,...).
Поделитесь алгоритмом Сундарама.


--------------------
Зри в корень...
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 Nataly-Mak
сообщение 22.5.2009, 4:10
Быстрая цитата Сообщение #5


Активный участник
Group Icon

Группа: Заблокированные
Сообщений: 239
Из: Г. Саратов



Репутация:   16  


Цитата(Developer @ 21.5.2009, 16:21) *

Поделитесь алгоритмом Сундарама.

С удовольствием!
Цитата из моей рукописи:
”Очень оригинальное ”решето” для отсеивания простых чисел придумал индийский математик Сундарам. Это решето представляет собой таблицу, состоящую из бесконечного количества бесконечных арифметических прогрессий, причём каждый член первой прогрессии начинает новую прогрессию. Разностями прогрессий являются все нечётные числа, начиная с 3.
Первые три строки таблицы Сундарама:

Код
4  7  10  13  16  19  22  25  28  31  34  37 40  43  46  49...
7  12  17  22  27  32  37  42  47  52  57  62  67  72  77  82  87 ...
10  17  24  31  38  45  52  59  66  73  80  87  94  101  108  115 ...


В чём же секрет этого ” решета ”? Оказывается, если какое либо число N содержится в таблице Сундарама, то число 2*N+1 будет составным, если же число N не попало в таблицу Сундарама, то число 2*N+1 будет простым. Например, числа 5 нет в таблице Сундарама, значит число 2 * 5 + 1 = 11 – простое; число 7 есть в таблице Сундарама, следовательно, число 2 * 7 + 1 = 15 – составное”.
Вот и весь алгоритм. Загляните ещё в тему ”Взаимно простые числа” (на этом форуме), там по этому поводу тоже кое-что написано.
Помню, что Георгий в личной переписке писал мне, что его программа для алгоритма Сундарама есть в Википедии. Непонятно, чего-то он сейчас притих :)

Сообщение отредактировал Nataly-Mak - 22.5.2009, 8:08


--------------------
Не решил сегодня - решишь завтра.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 Георгий
сообщение 22.5.2009, 6:37
Быстрая цитата Сообщение #6


Бывалый
********

Группа: Клуб E-Science.Ru
Сообщений: 2 248



Репутация:   177  


http://ru.wikipedia.org/wiki/Решето_Сундарама

Эту статью я писал.


--------------------
Я очень люблю Математику и готов вступить с ней в интимную связь.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 Developer
сообщение 22.5.2009, 6:52
Быстрая цитата Сообщение #7


Мастер
Group Icon

Группа: Модераторы
Сообщений: 3 548
Из: Электрогорск, Московия



Репутация:   239  


Цитата(Nataly-Mak @ 22.5.2009, 6:10) *
Помню, что Георгий в личной переписке писал мне, что его программа для алгоритма Сундарама есть в Википедии. Непонятно, чего-то он сейчас притих :)

Не буди Лихо, пока оно тихо...


--------------------
Зри в корень...
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 Nataly-Mak
сообщение 22.5.2009, 8:05
Быстрая цитата Сообщение #8


Активный участник
Group Icon

Группа: Заблокированные
Сообщений: 239
Из: Г. Саратов



Репутация:   16  


Цитата(Developer @ 22.5.2009, 6:52) *

Не буди Лихо, пока оно тихо...

Спасибо за мудрый совет! Учту :)
Кстати, я немножко фольклорист.
Так вы всё поняли с алгоритмом Сундарама? Можно сделать программу так, что она будет выдавать простые числа в заданном интервале, например, в интервале (999, 2000). Главное, начало цикла по I задать с нечётного числа, этот цикл идёт с шагом 2, проверяются только нечётные числа. Понятно, что все чётные числа составные.
Я вот собралась написать математическую новеллу "Простые числа". Приглашаю вас и ещё VAL в соавторы, потому что я здорово отстала от современных достижений в этой области.


--------------------
Не решил сегодня - решишь завтра.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 Developer
сообщение 22.5.2009, 9:17
Быстрая цитата Сообщение #9


Мастер
Group Icon

Группа: Модераторы
Сообщений: 3 548
Из: Электрогорск, Московия



Репутация:   239  


Спасибо за приглашение, Nataly-Mak, но боюсь, что в отличие от Вас, я в этой области "вообще не догоняю"...
Лучше приведу программу на паскале, как и обещал (компилятор Turbo-Pascal 5.5; программа будет исполняться и на других версиях TP, BP и вплоть до Delphi 7):
Код
Program Sieve;
  Uses Crt,Dos;
  Label 1;
  Const
    Nmin    = 0;
    Nmax    = 32767;
    Pmax    = 3903;
  Var
    n,n_Pr  : Integer;
    i,j,k   : Word;
    Error   : Word;
    s,r     : Real;
    Row,Col : Byte;
    Prime   : Array[1..Pmax] of Word;
  Procedure Beep;        {Sound signal of input error}
    Begin
      {Sound(220); Delay(40000); NoSound}
      For i:=1 To 5 Do Begin Write(#7); Delay(4000) End
    End;
  Procedure Position;      {Returns cursor location}
    Begin
      Row:=WhereY; Col:=WhereX
    End;
  Procedure Trtmnt;        {Input error treatement}
    Begin
      Error:=1; Beep;
      Write('Error! Repeat iputing!');
      GoToXY(Col,Row); ClrEol
    End;
  Begin
    Write('N = '); Position;
    Repeat
      Error:=0; {SI-} {SR-} GoToXY(Col,Row);
      Readln(n);
      If (n <= Nmin) Or (n > Nmax) Or (IOResult<>0)
        Then Trtmnt
      Else ClrEol; {SI+} {SR+}
    Until ((n > Nmin) And (n <= Nmax)) And (Error=0);
    If (n > 200)
      Then r:=Int(n/(Ln(n)/Ln(10)-2)+1)
      Else r:=Int(1.6*n/Ln(n)/Ln(10)+1);

    Prime[1]:=1; Prime[2]:=2; Prime[3]:=3; j:=3;
    For k:=3 To n Do
      Begin
        If (k/2 <> Int(k/2)) Then
          Begin
            i:=2; s:=Sqrt(k);
            Repeat
              Inc(i);
              If (Prime[i] > s) Then
                Begin
                  Prime[j]:=k; Inc(j); GoTo 1;
                End
            Until(Int(k/Prime[i])*Prime[i] = k)
          End;
        1:
      End;
    WriteLn('Prime numbers less then ',n,' are equal:');
    n_Pr:=0;
    Repeat
      Inc(n_Pr);
    Until(n_Pr = j-1);
    For i:=1 To n_Pr Do
      Begin
        If Prime[i]=0 Then Exit;
        Write('P(',i,')=',Prime[i],' ');
      End
  End.


Сообщение отредактировал Developer - 22.5.2009, 9:18


--------------------
Зри в корень...
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 Георгий
сообщение 22.5.2009, 9:59
Быстрая цитата Сообщение #10


Бывалый
********

Группа: Клуб E-Science.Ru
Сообщений: 2 248



Репутация:   177  


Хорошая прога! Проверено - мин нет!


--------------------
Я очень люблю Математику и готов вступить с ней в интимную связь.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 Developer
сообщение 22.5.2009, 12:50
Быстрая цитата Сообщение #11


Мастер
Group Icon

Группа: Модераторы
Сообщений: 3 548
Из: Электрогорск, Московия



Репутация:   239  


Георгий! А Вы так же красиво оформляете программы?
Я комментарии специально не вставлял, чтобы появились вопросы.
Да вот незадача:
- делаю прогон для n=8190 программы на бейсике, получаю 1899 простых чисел, последнее имеет значение 16381. Парадокс? Абсурд? Где ошибка?
- делаю прогон для n=8190 программы на паскале, получаю всего 1028 простых чисел, последнее имеет значение 8179. Похоже на правду;
- делаю прогон для n=8190 программы на бейсике, которую представила Nataly-Mak, получаю всего 1025 простых чисел, последнее имеет значение 8179. C учётом того, что первые простые числа 1,2,3 эта программа не выявляет, тоже похоже на правду.


--------------------
Зри в корень...
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 Георгий
сообщение 22.5.2009, 13:27
Быстрая цитата Сообщение #12


Бывалый
********

Группа: Клуб E-Science.Ru
Сообщений: 2 248



Репутация:   177  


Интересную задачу подкинули! Ночью вплотную займусь ею. Вдруг здесь аж две-три истины? :)

Сообщение отредактировал Георгий - 22.5.2009, 13:30


--------------------
Я очень люблю Математику и готов вступить с ней в интимную связь.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 Developer
сообщение 22.5.2009, 13:37
Быстрая цитата Сообщение #13


Мастер
Group Icon

Группа: Модераторы
Сообщений: 3 548
Из: Электрогорск, Московия



Репутация:   239  


Да какие там истины? Логическая ошибка в алгоритме...
Вам "скинуть" борландовский Turbo-Basic?
Всего три файла:
- tb.exe - 204317 Bytes
- tbconfig.tb - 886 Bytes
- tbhelp.tbh - 41029 Bytes.
Прикрепленный файл  Tb.zip ( 136.46 килобайт ) Кол-во скачиваний: 34


Сообщение отредактировал Developer - 22.5.2009, 15:05


--------------------
Зри в корень...
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 Inspektor
сообщение 22.5.2009, 21:04
Быстрая цитата Сообщение #14


Мастер
Group Icon

Группа: Модераторы
Сообщений: 2 843
Из: Санкт-Петербург



Репутация:   308  


Я когда-то оба эти алгоритма реализовывал на С++, для кого и зачем писал не помню, ясно только что задания были на списки :) . В обеих прогах есть таймер, который говорит, что решето Эратосфена во много раз эффективнее.
Эратосфен:
исходник Прикрепленный файл  List.rar ( 648 байт ) Кол-во скачиваний: 51

экзешник Прикрепленный файл  List.rar ( 3.01 килобайт ) Кол-во скачиваний: 39

Сандурам(или как-то так)
исходник Прикрепленный файл  main.rar ( 843 байт ) Кол-во скачиваний: 27

экзешник Прикрепленный файл  Sundaram___.rar ( 3.22 килобайт ) Кол-во скачиваний: 21

Пришлось всё запаковать а то форум не пускает.
З.Ы. В википедии алгоритм этого сандурдома не верно описан.

Сообщение отредактировал Inspektor - 22.5.2009, 21:11


--------------------
Эти русские варвары еще в 1945 году непропорционально применили силу, грубо нарушили территориальную целостность Германии и довели до самоубийства ее законно избранного канцлера!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 Георгий
сообщение 22.5.2009, 21:05
Быстрая цитата Сообщение #15


Бывалый
********

Группа: Клуб E-Science.Ru
Сообщений: 2 248



Репутация:   177  


Задача - делать нечего. Меньше чем за минуту пишу прогу на Maple12

s:=0:for i from 1 to 8190 do if isprime(i)=true then s:=s+1;fi;od;print(s):

Правильный ответ 1027. Время счета - мгновение ока.

В http://mindspring.narod.ru/math/ega/Liv/Zagier.htm приведена таблица количества пристых чисел до 10 миллиардов. Я проверил для миллиона - совпадение полное: 78498 . Время счета 2,1 с.

Сообщение отредактировал Георгий - 23.5.2009, 20:03


--------------------
Я очень люблю Математику и готов вступить с ней в интимную связь.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 Inspektor
сообщение 22.5.2009, 21:09
Быстрая цитата Сообщение #16


Мастер
Group Icon

Группа: Модераторы
Сообщений: 2 843
Из: Санкт-Петербург



Репутация:   308  


Цитата(Георгий @ 22.5.2009, 23:05) *

Задача - делать нечего. За 1 минуту пишу прогу на Maple12

s:=0:for i from 1 to 8190 do if isprime(i)=true then s:=s+1;fi;od;print(s):

Ответ 1027. Время счета - менее секунды. ( в качестве контроля - для первых 100 чисел простых 25).

это не прога, а скрипт. В математике ещё проще:
Код
PrimePi[8190]


--------------------
Эти русские варвары еще в 1945 году непропорционально применили силу, грубо нарушили территориальную целостность Германии и довели до самоубийства ее законно избранного канцлера!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 Hottabych
сообщение 22.5.2009, 21:24
Быстрая цитата Сообщение #17


Бывалый
********

Группа: Клуб E-Science.Ru
Сообщений: 1 010



Репутация:   133  


А простые числа между 10^{93} и 10^{93}+10000 найти как? :D (шутка)


--------------------
Если я что-то советую, то обязательно хорошо подумайте, а стоит ли этому верить и это делать.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 Inspektor
сообщение 22.5.2009, 21:30
Быстрая цитата Сообщение #18


Мастер
Group Icon

Группа: Модераторы
Сообщений: 2 843
Из: Санкт-Петербург



Репутация:   308  


Цитата(Георгий @ 22.5.2009, 23:05) *

я давно отошел от таких убожеств, как всякие Turbo и Quickи (и даже от C++ c Ассемблерами).

Точнее "уже не надеюсь освоить си и ассемблер" :lool:


--------------------
Эти русские варвары еще в 1945 году непропорционально применили силу, грубо нарушили территориальную целостность Германии и довели до самоубийства ее законно избранного канцлера!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 Георгий
сообщение 22.5.2009, 21:49
Быстрая цитата Сообщение #19


Бывалый
********

Группа: Клуб E-Science.Ru
Сообщений: 2 248



Репутация:   177  


На Ассемблере я программировал аж в 1973 году. Вот интересно - сколько же Вам лет было?


--------------------
Я очень люблю Математику и готов вступить с ней в интимную связь.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 Inspektor
сообщение 22.5.2009, 21:53
Быстрая цитата Сообщение #20


Мастер
Group Icon

Группа: Модераторы
Сообщений: 2 843
Из: Санкт-Петербург



Репутация:   308  


Цитата(Георгий @ 22.5.2009, 23:49) *

На Ассемблере я программировал аж в 1973 году. Вот интересно - сколько же Вам лет было?

-16 лет. Как же вы могли так деградировать, с асма до скриптов...


--------------------
Эти русские варвары еще в 1945 году непропорционально применили силу, грубо нарушили территориальную целостность Германии и довели до самоубийства ее законно избранного канцлера!
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

6 страниц V  1 2 3 > » 
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 9.2.2010, 2:57