Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Оцените код  для нахождения простых чисел


Автор: Mura-vey 4.1.2003, 06:24
program Ishem_prostie_chisla_v_sotne;
uses crt;
var
   a,b : array [1..100] of byte;
   p     : byte;
   i,n,z : byte;
label
   l,l2;
begin
ClrScr;
a[1]:=3;
b[1]:=3;
i:=3;
n:=0;
l: p:=0;
  for z := 1 to n do  begin
  b[z]:=b[z]-1;
  if b[z] = 0 then begin
                    b[z]:=a[z];
                    p := 1;
                    {goto l2;}
                   end;

  end;
if p<>1 then begin
    n:=n+1;
    a[n]:=i;
    b[n]:=i;
write(a[n],' ');
end;
l2: i:=i + 2;
{write(i,' ');}
if i<=100 then goto l;
{for i := 1 to 24 do begin
write(a[i],' ');
end;}
write(n);
end.

Я долго коптил, и нашёл закономерность "размножения" простых чисел. (кто не верит пусть компилит!!!!)
Я прошу помощи перевода етого кода на асм, при этом надо сделать возможность бесконечного увеличения массива. заранее сенкс

Автор: podval 5.1.2003, 05:29
И чем конкретно этот метод новый?

Автор: Kefir 10.1.2003, 07:29
Я  вообще особо не рублю на Дельфи/Паскале, но... вообще на кой чёрт тебе искать эти числа? ведь можно просто брать число, проверять простое оно или нет, потом, если оно простое кидать его в файл или куда надо. на С++ что то в роде:

int num_to_check = 1000;
for(int a = 0; a<num_to_check; a++)
 if(Prostoje4islo(a)==TRUE) printf("%i\n", a);

Ф-ция Prostoje4islo проверяет простое ли число и, если да, то printf выводит это число на экран. Не верю, что на Паскали/Дельфи так нельзя сделать.

Автор: Vit 10.1.2003, 08:14
2 Kefir - можно конечно, но проблема с простыми числами остаётся весьма острой, код автора тоже не поможет. Например видоизменим задачу - надо найти все простые числа в интервале от 10^20 до 10^22... Желательно за разумный интервал времени...

Автор: Dapo 10.1.2003, 17:21
"Я долго коптил, и нашёл закономерность "размножения" простых чисел. "
Смелое утверждение :-). Если ты действительно сформулировал закон распределения простых чисел, тогда тебе нужно премию, как минимум, Филдса выдать. Кстати, кажется на Vingrade в каком-то разделе форума кто-то статью выдал, что какие-то ученые составили алгоритм получения простого числа, но чего-то я больше нигде подобной информации не читал. Для тех кто не в курсе (мало ли как бывает) простые числа - число которые деляться только на 1 и на себя (1,2,3,5,7,11,13,17 и т.д. (только вот как так? :-) ) ).

Автор: Kefir 10.1.2003, 18:36
2 Vit:
Это примерно 99 в 20й итераций... нда... хорошего времени не получается, но быстродействие компьютеров постоянно растёт, так что очень возможно, что вскоре и такой способ подойдёт.
Вообще я не имел в виду таких астрономических чисел, просто при довольно нечасто надо находить все простые в этом интервале.
2 Dapo:
Может ты это имел в виду:
http://www.cse.iitk.ac.in/primality.pdf
?
Это алгоритм дающий 100% уверенность в простоте числа (или же в том что оно не простое).

Автор: maxim1000 11.1.2003, 01:05
Дело в том, что над этой проблемой "покоптили" еще в древности. В результате появился метод с названием "решето Эратосфена", который довольно часто изучается в школе...
если интересно - сходите, например, на www.nature.ru и наберите в поиске "решето Эратосфена"

Автор: Kefir 11.1.2003, 01:21
2 maxim1000:
Решето - это конечно хорошо, но и ты тоже не поленись, зайди по ссылке в моём предидущем мсг. Тоже довольно интересно.

Автор: Vit 11.1.2003, 02:46
Тема перемещена в раздел алгоритмов

Автор: Paradox 27.2.2003, 15:43
А как же Кнут с его алгоритмами.....

Автор: BlackWolf 2.4.2003, 21:11
Поиск простых чисел практически нужен например в криптоанализе системы шифрования с открытым ключом (например RSA). По крайней мере очень сильно убыстрит его.

Автор: neutrino 10.4.2003, 14:54
Ну вот, народ, ловите. Кто тут говорил, что статью хотел:
http://www.cse.iitk.ac.in/news/primality.pdf

Автор: df_3 27.5.2003, 08:58
Сделай exe и дизасемблируй его ))) Вот тебе и код в АСМ

Автор: df_3 27.5.2003, 08:59
а так нормально! но лучше в динамической памяти Так как на большие массивы места не хватит)

Автор: Гость_Victor 28.9.2004, 11:18
Выведена формула получения простых чисел
http://www.laplas.narod.ru/moiform.htm

пункт №4



где k целое число от 1 до бесконечности. Выражение в скобках ограниченных снизу обозначает целую часть дроби k/6, либо само значение этой дроби если k кратно 6, ну а функция n=[(k-1)mod(6)] и n=[(k)mod(6)] вам я надеюсь знакома - сравнимость чисел n и k-1, k по модулю 6.
Эта формула даёт все простые числа по порядку начиная с 5. Так же по этой формуле получаются составные числа. Общая доля отсева равна 11/15=0.73333(3).

Автор: cardinal 28.9.2004, 13:05
Цитата(maxim1000 @ 11.1.2003, 00:05)
если интересно - сходите, например, на www.nature.ru и наберите в поиске "решето Эратосфена"

Или посмотритет тут:
http://forum.vingrad.ru/index.php?showtopic=30076

Автор: Y-Vladimir 28.9.2004, 13:07
Может я не вьехал во что-то, но вот фразу:
Цитата
Эта формула даёт все простые числа по порядку начиная с 5. Так же по этой формуле получаются составные числа. Общая доля отсева равна 11/15=0.73333(3).

я не совсем понял... А чем эта формула отличается по смыслу от известной 2^n - 1, там вроде тоже простые получаются числа и составные иногда проскакивают...

Цитата(Dapo @ 10.1.2003, 17:21)
"Я долго коптил, и нашёл закономерность "размножения" простых чисел. "

Есть формула асимптотического распределения простых чисел: p(x) = x/ln x
показывающая, сколько простых числе содержится на интервале 1..x.


Автор: LuckLess 29.9.2004, 17:21
Цитата
Общая доля отсева равна 11/15=0.73333(3).


непойму , какой смысл в формуле , если можно легко сделать общую долю отсева 0.5 проверяя только нечетные числа..

Автор: III.nfo 19.10.2004, 08:19
Для программной проверки на простоту:
// language C#
int IsProstoe = ...; // Объявляется переменная с числом.
// Проверяется делимость на два. % - деление по модулю.
if ((IsProstoe % 2) == 0)
{
MessageBox.Show ("Не простое!");
}

for (i = 3; i != (IsProstoe / 2); i+2)
{
if ((IsProstoe % i) == 0)
{
MessageBox.Show ("Не простое!");
}
}
Суть действия:
Сначала для быстроты исполнения проверяется на 2. -50% случайных чисел.
Затем идёт перебор для нечётных чисел, больших еденицы и меньших половины числа.
По-моему, хоть это и не самый, возможно, быстрый код, но он надёжен и прост в реализации, а затем будущим программерам в него будет легко въехать (начиная от таких, как я, 10-классников).
Для поиска вводится цикл, в который это помещается.
int MaxProstoe = ...;
for (int IsProstoe = 1; IsProstoe != MaxProstoe)
{...}

Автор: Baib 23.10.2004, 20:11
Во-первых, 1 - не простое...
Люди не в курсе где можно найти Кнута в электронном виде? А то вы тут его вспоминали...

Автор: EKoshelev 16.11.2004, 12:36
У меня книжка на винте валяется по криптоанализу. Там вроде метод есть, с помощью которого можно найти простое число нужного порядка. Только там много слов непонятных и не разобрался как это делается.

А по Эратосфену я сам писал. Нашёл все в пределах 80 000 000 000.

Автор: EKoshelev 23.11.2004, 10:10
У меня даже прога валяется где-то (и работает в пределах 20 минут на 400 МГц). Если интересно...

Автор: Guest 23.11.2004, 10:37
smile smile smile smile smile

Автор: Гость_Sanek 14.4.2005, 16:27
Помоему этот попроще будет))... И ищет не только в сотне. И в 1000000 нейдёт... всё простые, только немного подождать придётся smile. Зацените.
Program gen;
uses crt;
var
n,k,t,sum,m: longint;
begin
clrscr;
textcolor (2);
sum:=0;
Read (m);
for n:=1 to m do
begin
t:=1;
k:=2;
while (k<n-1) and (t<>0) do
begin
t:=n mod k;
k:=k+1;
end;
if t=0 then
write ('')
else
begin
Write (' ',n);
inc(sum);
end;
end;
writeLn;
writeLn (sum);
readkey;
end.

Автор: 0d5a 30.5.2007, 09:06
Кнута здесь посмотреть  можно

http://www.poiskknig.ru/

Добавлено через 2 минуты и 16 секунд
А можно так, хотя почти тоже самое
Delphi:

Код


program Project21;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Classes;

var
 a:array [1..1000000] of integer;
 inx,i,j,n:integer;
 l:TStringList;
begin
  readln;
  n:=1000000;             
  //n:=1000;
  inx:=0;
  for i:=2 to n do
  begin
    j:=1;
    while (j<=inx) and ((i mod a[j])<>0) do
      Inc(j);
    if (j>inx) then
    begin
      Inc(inx);
      a[inx]:=i;
      //writeln(i);
    end;
  end;
  l:=TStringList.Create;
  for i:=1 to inx do
    l.Add(inttostr(a[i]));
  l.SaveToFile('e:\temp\easy_num.txt');
  l.Free;
  writeln(inx);
  readln;
end.


Автор: Artemios 30.5.2007, 15:49
Можно, и я свою лепту внесу  smile  
язык Haskell.
Потенциально бесконечная последовательность простых чисел, используется классическое определение простого числа:
Код

divisors n = [x | x <- [1..(n - 1)], rem n x == 0]

primes = [n | n <- [1..], isPrime n]
         where isPrime x = (divisors x == [1])

Пример взят http://ru.wikibooks.org/wiki/%D0%A2%D0%B5%D0%BE%D1%80%D0%B8%D1%8F_%D1%87%D0%B8%D1%81%D0%B5%D0%BB_%D0%B8_%D1%8F%D0%B7%D1%8B%D0%BA_Haskell.

Потенциально бесконечная последовательность простых чисел, используется решето Эратосфена:
Код

notdiv [] p = True
notdiv (x:xs) p = (rem p x /= 0) && (notdiv xs p)

erat = 2:[fnext (take (n+1) erat) (erat!!n + 1) | n<-[0..] ]
    where fnext xs n = if notdiv xs n
        then n
        else fnext xs (n+1)

пример мой.

Автор: dimoid_12 15.6.2007, 01:04
sorry

Автор: SoWa 7.7.2007, 19:52
Еще есть полином Мятисевича (как раз тут и обсуждался) только ничего разумного по нему найти не могу. Кто найдет- дам плюсик )

Автор: Julius 6.8.2007, 10:36
есть еще косвенные методы) сейчас к примеру иногда используется малая теорема ферма за исключением чисел кармайкла. Только для этого нужны компьютеры побольше  smile 

Автор: ProgBeat 7.8.2007, 00:22
Цитата(Mura-vey @ 4.1.2003,  06:24)
......
Я долго коптил, и нашёл закономерность "размножения" простых чисел. (кто не верит пусть компилит!!!!)
Я прошу помощи перевода етого кода на асм, при этом надо сделать возможность бесконечного увеличения массива. заранее сенкс

этот алгоритм ничем не отличается от самого тривиального алгоритма
b[z] = (a[z]-((i-a[z])/2%a[z]))%a[z] // при проверке на равенство нулю
b[z] = a[z]-((i-a[z])/2%a[z])  // после проверки
(a[z]-((i-a[z])/2%a[z]))%a[z] = 0 <=> 
i-a[z]=0(mod 2*a[z]) <=> 
cуществует такое k (1+2*k - нечётное, чётные можно не проверять), при котором i=a[z]*(1+2*k) 
// % - остаток от деления
если заменить 
if b[z] = 0 then begin
на
if i Mod a[z] = 0 then begin
то алгоритм очевидно будет работать от определения простого числа...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)