- •Распределение простых чисел на прямой
- •Распределение простых чисел на прямой
- •Введение
- •§ 1. Теоретическая часть
- •Структура плотной n-ки простых чисел
- •§ 2. Практическая часть
- •1. Число, задаваемое кодом плотной 18-ки
- •2. Предварительные рассмотрения
- •3. Условия на простое число p
- •4. Программа gap для нахождения плотных 18-к
4. Программа gap для нахождения плотных 18-к
GAP нужно скачать по адресу
http://www.gap-system.org/Download/index.html
файлы gap4r4p12 и packages-2012_01_12-10_47_UTC.
Учитывая, что искомые 18-ки, находятся в районе , программа должна быть быстро работающей.
Поскольку в году секунд, то даже если в секунду проверяется чисел, то для проверки потребуется лет, т.е. сто миллионов жизней нашей вселенной. Суперкомпьютеру ЮУрГУ потребуется 100 жизней вселенной. И это очень оптимистический прогноз!
Надежд на нахождение хоть одной 18-ки почти нет. Но, может, повезет?
Все команды в GAP заканчиваются ;. В нашей программе будет использоваться только
T:=function() … end – подпрограмма с параметром, задающая нужную нам функцию.
LogTo(“”) – запись в файл.
for in [1…n] do od – цикл;
if ….. then - условный оператор;
return – возврат значения;
[..] – список чисел, в данном случае пустой;
Add(L,p) – добавление в список числа p;
IsPrimeInt – библиотечная функция проверки на простоту. Возвращает true или false. Один из самых быстрых в мире алгоритмов проверки на простоту числа. Это очень трудоемкая работа! Из-за проверки на простоту все проблемы с простыми числами.
У нас в 18-ке - восемнадцать чисел, поэтому и встроенных циклов будет 18!
У кого 15-ка, соответственно 15.
В командной строке, после приглашения gap>
Нужно ввести следующую программу, она будет называться T_18_1.
Программа строится по n-ке, поэтому у ВСЕХ будут разные слагаемые!
(p,p+4,p+10,p+12,p+16,p+22,p+24,p+30,p+36,p+40,p+42,p+46,p+52,p+54,p+60,p+64,p+66,p+70)
и по решениям.
Лучше для каждого решения своя программа. Чтобы быстрее считала.
LogTo(“T_18_1.gap”);
T_18_1:=function(n)
local p,q,L;
L:=[];
for q in [1..n] do p:= 113107 +510510*q;
if IsPrimeInt(p) then p:=p;
if IsPrimeInt(p+4) then p:=p;
if IsPrimeInt(p+10) then p:=p;
if IsPrimeInt(p+12) then p:=p;
if IsPrimeInt(p+16) then p:=p;
if IsPrimeInt(p+22) then p:=p;
if IsPrimeInt(p+24) then p:=p;
if IsPrimeInt(p+30) then p:=p;
if IsPrimeInt(p+36) then p:=p;
if IsPrimeInt(p+40) then p:=p;
if IsPrimeInt(p+42) then p:=p;
if IsPrimeInt(p+46) then p:=p;
if IsPrimeInt(p+52) then p:=p;
if IsPrimeInt(p+54) then p:=p;
if IsPrimeInt(p+60) then p:=p;
if IsPrimeInt(p+64) then p:=p;
if IsPrimeInt(p+66) then p:=p;
if IsPrimeInt(p+70) then Add(L,p);
fi;
fi;
fi;
fi;
fi;
fi;
fi;
fi;
fi;
fi;
fi;
fi;
fi;
fi;
fi;
fi;
fi;
fi;
od;
return(L);
end;
Запись then p:=p; - вынужденная!
GAP требует перед условным оператором if какую-нибудь исполняемую команду!
Какие условия? Вы же еще ничего не сделали!
В принципе, логично.
(Кстати, это моя первая программа на GAP) Вы юные программеры (?) не освоили, а не юный профессор, писавший программы последний раз в 1977 г. на algol60, освоил.
Теперь, чтобы вычислить все нужные нам 18-ки, меньшие n, мы просто вводим оператор
gap> T_18_1(n);
И через некоторое время GAP выдаст список
[s,t,l,…,k] чисел “p” с которых начинаются плотные 18-ки.
Однако, чаще, он будет выдавать просто пустой список.
Нас интересуют значения n равные степеням 10. Поскольку у нас на миллион проверяются всего 2 числа, то вместо N нужно будет подставлять n:
N |
|
|
|
|
|
|
|
|
|
|
n |
2 |
20 |
200 |
2000 |
|
|
|
|
|
|
Если у кого есть 2 или 4 ядерный процессор и 64 Linux, то лучше поставить GAP под Linux. Откомпилировать и запустить пакет ParGAP – параллельный GAP. Он по идее должен распараллелить на ядра и с учетом 64 битной архитектуры считать на порядок быстрее.
Профессор А.В.Рожков
26.04.2012