Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задание группе ПС-377.doc
Скачиваний:
0
Добавлен:
06.09.2019
Размер:
406.02 Кб
Скачать

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

15