LINUX.ORG.RU

Написал программу для вычисления простых чисел. Вроде новый алгоритм.

 , , простое


0

4

Если lim=3*5*7*11*...*n т.е. факториалу простых чисел до n

то простое число m, которое меньше lim, принадлежит множеству: ^( (((m - 3) mod 2*3) = 0) || (((m - 5) mod 2*5) = 0) || (((m - 7) mod 2*7) = 0) || (((m - 11) mod 2*11) = 0) || ... || (((m - n) mod 2*n) = 0) )

Ниже приведен код, вычисляющий все простые числа до 1155. Простые числа в выводе взяты в квадратные скобки. Для удобства перенаправьте вывод в файл.


public class Main
{
	public static void main(String argv[])
	{
		try
		{
			
			
			int n = 3;
			while(true)
			{
				if(n%2==0) {n++; continue; }
				if((n-3)%6==0) System.out.print(" "+n+" ");
				else if((n-5)%10==0) System.out.print(" "+n+" ");
				else if((n-7)%14==0) System.out.print(" "+n+" ");
				else if((n-11)%22==0) System.out.print(" "+n+" ");
				else System.out.print(" ["+n+"] ");
				n++;
				if(n==1155) break;
			}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
}

Ответ на: комментарий от yura_ts

Причем интересно будет сравнивать не этот алгоритм, а повторённыей несколько раз — сначала вычислили простые числа p1, p2, ..., pN, потом вычислили простые числа до p1*p2*...*pN, и так далее.

yura_ts ★★
()
Ответ на: комментарий от aptyp

А для больших чисел — можно его применять несколько раз. См. мой второй коммент в этой теме.

yura_ts ★★
()

А можно сравнить с решетом Эратосфена на числах где-то до миллиона?

Artificial_Thought ★★★★
()

Ну и оптимизацией тут и не пахнет — хотя бы не по всем числам надо ходить в цикле, а по нечётным...

yura_ts ★★
()

Если lim=3*5*7*11*...*n т.е. факториалу простых чисел до n

ЩИТО? это что ещё за новый факториал?

Оно быстрее привычного решета Эратосфена?

а это разве другое решето?

drBatty ★★
()
Ответ на: комментарий от drBatty

а это разве другое решето?

А слона-то я и не приметил, спасибо.

yura_ts ★★
()

Одно из правил криптографии - «Не пытайтесь придумать свой алгоритм шифрования». Учитывая то, что разложение на простые множители (да и простые числа вообще) имеют прямое отношение к криптографии... до остального, думаю, сам додумаешься...

kovrik ★★★★★
()
Ответ на: комментарий от kovrik

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

KivApple ★★★★★
()

Ниже приведен код, вычисляющий все простые числа до 1155...

... а также некоторые составные.

Впрочем, о чем мы тут говорим: твоя программа даже не останавливается.

metar ★★★
()
Ответ на: комментарий от KivApple

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

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

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

drBatty ★★
()

1. Судя по этому выводу:

... 1001  [1003]  1005  [1007]  [1009]  1011  [1013]  1015  1017  [1019]  [1021]  1023  1025  [1027]  1029  
[1031]  [1033]  1035  [1037]  [1039]  1041  1043  1045  1047  [1049]  [1051]  105
3  1055  1057  1059  [1061]  [1063]  1065  1067  [1069]  1071  [1073]  1075  107
7  [1079]  [1081]  1083  1085  [1087]  1089  [1091]  [1093]  1095  [1097]  1099 
 1101  [1103]  1105  1107  [1109]  1111  1113  1115  [1117]  1119  [1121]  [1123
]  1125  1127  [1129]  1131  1133  1135  1137  [1139]  1141  1143  1145  [1147] 
 1149  [1151]  [1153]  1155  [1157]  [1159]  1161 ...
у этого кода проблемы с окончанием.

2. отмеченный 1073 < 1155, однако: 1073 = 29*37

io ★★
()
Ответ на: комментарий от yura_ts

Это я написал чтобы предостеречь автора от дальнейших попыток :)
Ибо математика в этой области просто адовая, если не разбираешься - лучше не соваться - «на выходных с бутылкой пива» ВНЕЗАПНО революционный алгоритм не придумаешь/

kovrik ★★★★★
()

Ниже приведен код, вычисляющий все простые числа до 1155.

Просто ради образования школ^W молодых кадров:
Если действительно выполняется

if(n%2==0) {n++; continue; }

то (n-3)%6 == 0 равносильно n%3 == 0, (n-5)%10==0 — n%5 == 0, (n-7)%14==0 — n%7 == 0 и (n-11)%22==0 — n%11 == 0. Другими словами, приведенный код действительно обычное решето Эратосфена, с той лишь разницей, что при просеивании числами до 11 получится, что со 169 включительно пойдут ошибки.

metar ★★★
()
Последнее исправление: metar (всего исправлений: 1)
Ответ на: комментарий от Lavos

Ты не гcc скомпилируй, а чем-нить нормальным типа watcom c - сразу прирост раза в полтора на ровном месте получишь...

malbolge ★★
()
Ответ на: комментарий от kovrik

Ибо математика в этой области просто адовая, если не разбираешься - лучше не соваться - «на выходных с бутылкой пива» ВНЕЗАПНО революционный алгоритм не придумаешь/

Да ладно, что может быть проще? ;) (python 2):

def list(n):
    x=[1]*n
    for i in xrange(3,int(n**0.5)+1,2):
      if x[i]:x[i*i::2*i]=[0]*((n-i*i-1)/(2*i)+1)
    return [2]+[i for i in xrange(3,n,2) if x[i]]

print list(100)

anonymous
()
Ответ на: комментарий от Oleg_Dorozhko

Буду работать над ошибками.

Ты лучше уроки не прогуливай.

anonymous
()
Ответ на: комментарий от i-rinat

(2k+1)!! :== (2k+1)*(2k-1)*(2k-3)* ... *3*1

про двойной факториал я знаю. А теперь смотри на первый пост:

Если lim=3*5*7*11*...*n т.е. факториалу простых чисел до n

где тут ДЕВЯТКА???

Похоже ТС считает «факториал» как произведение всех простых чисел, почему-то исключая 2.

drBatty ★★
()
Ответ на: комментарий от Oleg_Dorozhko

Буду работать над ошибками.

основная твоя ошибка - ты алгоритмы придумываешь. Это глупо, их тысячи лет придумывали люди, поумнее нас с тобой. Если хочешь придумать что-то новое, для начала изучи старое. Например реализуй тоже самое решето Эратосфена, ну типа

#!/usr/bin/php
<?php

$p1 = array(2,3,5,7,11,13,17,19);
$p2 = array(0,0,0,0, 0, 0, 0, 0);

for($i = 1; $i < 529; $i++)
{
	$prime = TRUE;
	for($j = 0; $j < count($p2); $j++)
	{
		$p2[$j]++;
		if($p2[$j] == $p1[$j])
		{
			$p2[$j] = 0;
			$prime = FALSE;
		}
	}
	if($prime)
		echo "$i ";
}
?>

drBatty ★★
()
Ответ на: комментарий от malbolge

Ты не гcc скомпилируй, а чем-нить нормальным типа watcom c - сразу прирост раза в полтора на ровном месте получишь...

как он кстати жив? последнее что я о нем слышал что он стал open watcom

quest ★★★★
()
Ответ на: комментарий от quest

Latest Release (June 2010), мде...

скачал open-watcom-c-linux-1.9, запускаю: float poin exception стабильненько

quest ★★★★
()

ТС, если хочешь действительно узнать для себя что-то интересное - займись факторизацией полиномов. Для начала в целых числах. Почитай про алгоритм Бухбергера и S-полиномы. ну или хотя бы напиши программу нахождения наибольшего общего делителя для Гауссовых чисел (это целочисленные комплексные числа).

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 1)
5 января 2013 г.
Ответ на: комментарий от dikiy

Спасибо, почитаю. А алгоритм действительно решето.

Oleg_Dorozhko
() автор топика
1 сентября 2013 г.

фуфло же

anonymous
()

if(n==1155) break;

А дальше? Если дальше алгоритм не работает, проще все числа от 3 до 1155 в готовый массив засунуть.

Makefile
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.