Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Mathematica 5. ╨б╨░╨╝╨╛╤Г╤З╨╕╤В╨╡╨╗╤М

.pdf
Скачиваний:
1
Добавлен:
19.11.2023
Размер:
33.75 Mб
Скачать

П Диспетчер задач Windows

0 @ ®

Параметры Вид Завершение работы Справка

Приложения | Процессы j! Быстродействие ,'j Сеть

\ Пользователи]

Хронология загрузки ЦП

 

Фжл подкати

Хронология использования файла подкати

Всего

 

Физниесквя память (КБ)

Дескрипторов

7155

Всего

1047276

Потоков

374

Достугио

4752

Процессов

41

Систеигьй кэш

10200

Выделе»** памяти (КБ)

Пенять ядре (КБ)

 

Всего

1312112

Всего

50216

Предел

2S207I2

Вьгружоенея

23908

Г*я

2059240

Нееыгружеемея

26306

Процессов: 41

Загрузка ЦП: 1%

Выделение памяти: 1281МБ / 6

Рис. 5.2. Отчетливо видно плато Высокой производительности, рассеченное, правда, Каньоном вспомогательных действий. Плато Высокой производительности имеет почти отвесные обрывы

Наконец, проведем вычисления для основания, равного 10.

b a s e = 1 0 ; D[Print[{n,o LargestPrimeGap[baseAn]}],{n,2 , 1 2}]

{2,8}

{3,20}

{4, 36}

{5,72}

{6,114}

{7,154}

{8,220}

No more memory available.

Mathematica kernel has shut down.

Try quitting other applications and then retry.

На этот раз основание довольно велико, и картина на экране Диспетчера задач Windows очень отчетливая (рис. 5.3).

Арифметика: простые числа

151

Файл Параметры Вид Заверида** работы Справка

I Приложегыя i! ГЬоиессы jl Быстродействие ц Сеть ! Пользователи |

Загрузка ЦП Хромология загрузки ЦП

•■■■у/.

Ь

Файл подкачки

Хронология использования файла подкачки

Всего

 

Физическая память (КБ)

Деофилторов

6991

Всего

1047276

Потоков

377

Доступно

863172

Гфоиессов

39

Системный кэш

45968

Выделен** памяти (КБ)

Пенять ядре (КБ)

 

Всего

268168

Всего

59204

Г^едел

2520712

Выружеемея

32896

Пик

2059240

Невыгружаемая

26308

Процессов: 39

Загрузка ЦП: 1%

Выделен** памяти: 261МБ / 6

Рис. 5.3. Отчетливо видно не только плато Высокой производительности, но и почти отвесный об­ рыв Холма увеличения файла подкачки, связанный с завершением работы системы Mathematica

У всякой истории есть мораль, и эта не исключение. Некоторые функции, даже если они описаны в справочной системе (именно оттуда я взял функцию LargestPrimeGap), иногда требуют неоправданно большого объема памяти. Недоста­ точный объем памяти может помешать получить нужные результаты. Даже ночной прогон в таких случаях не помогает.

Давайте посмотрим, мо>кно ли исправить ситуацию. Сначала загрузим пакет тео­ рии чисел.

<<NumberTheory'NumberTheoгуFunctions'

Теперь определим функцию LargestPrimeGapOl.

LargestPrimeGapOl[n_]:=

Block[{pl=2,p2=3,i=2,pk=PreviousPrime[n+1],d=Max[n-pk,1]},

While[p2<pk,{pl=p2;p2=NextPrime[p2];delta=p2-pl; If[delta>d,

d=delta]}];d]

В определении этой функции мы воспользовались функцией PreviousPrime г], которая генерирует наибольшее простое число, меньшее п, и функцией NextPrime п.. которая генерирует наименьшее простое число, большее п. Вот небольшой тест.

152

Гпава 5

LargestPrimeGapOl[11]

4

Этот тест функция выдержала. Теперь можем перейти к главному экзамену.

base=10;Do[Print[{n, LargestPrimeGapOl[baseAn]}],{n,2, 9}] {2,8} {3,20} {4,36} {5,72} {6,114} {7,154}

{ 8 , 2 2 0 }

{9,282}

На этот раз, как видите из рис. 5.4, загрузка ЦП не падает, и потому при нехватке дневного времени ночной прогон программы вполне может спасти ситуацию.

£ Диспетчер ]адач Windows

ЕШ®

rin Параметры Вид

Завершежо работы Справка

1ртложсния \ Процессы' |Быстродействие {сеть

j Погъзоватеяи 1

Загрузка ЦП

Хронология загрузки ЦП

 

Файлподкати Хронология исполыова»1Я файла подкачки

Всего

 

Физическая память (КБ)

Дескрипторов

7068

Всего

1047276

Потоков

375

Доступно

811824

Процессов

40

Систем»** кзш

102280

Выделение памяти (КБ)

Память ядра (КБ)

 

Всего

269664

Всего

51020

ГЧ>елел

2S20712

Выгружаемая

24720

П*

2059240

Невыгружаемая

2630В

Бессов: 40

Загрузка ЦП: 50%

Выделе»*! пвтяти: 263МБ / 6

Рис. 5.4. Отчетливо видно, что файл подкачки не растет, а загрузка ЦП не падает ниже 50% не­ смотря ни на какие переключения задач

В теории чисел длина наибольшего из интервалов между 1 и х, не содержащих простых чисел, обычно обозначается через #(х). Например, #(200) = 14, поскольку са­ мым длинным таким интервалом при х = 200 является интервал от ИЗ до 127. Как мы

Арифметика: простые числа

153

видели, величина g(x) растет очень неравномерно, однако некоторые эвристические соображения, подкрепленные статистическими данными, приводят к асимптотиче­

ской формуле g(x)~(\nx)2 Давайте все-таки проверим на графике, насколько хорошо

согласуется с ожидаемым поведением эта чрезвычайно скачущая функция. Сначала нарисуем график на интервале (1, 1000).

Plot[{LargestPrimeGapOl [х],(Log[х])Л2},{х,1,10л3}, PlotRange->{0,30}, PlotStyle->{{},{Dashing[{0.02,0.02}]}}];

Похоже мало, но неплохо бы уточнить.

Plot[{LargestPrimeGapOl[х],(Log[х])Л2},{х,1,10Л4},

PlotRange->{0,50},PlotStyle->{{},{Dashing[{0.02,0.02}]}}];

Вот еще одно уточнение.

Plot[{LargestPrimeGapOl[х],(Log[х])л2},{х,1,10л5},

PlotRange->{0,100},PlotStyle->{{},{Dashing[{0.02,0.02}]}}];

154

Гпава 5

100

80 ■ /

20000 40000 60000 80000 100000

И, наконец, нарисуем график на интервале (1,1 000 000).

Plot[{LargestPrimeGapOl[х], (Log[х])А2},{х,1,10А6},

PlotRange->{0,200}, PlotStyle->{{},{Dashing[{0.02,0.02}]}}];

Конечно, похоже. Но не более, чем статистика на правду...

Пример 5.9. График разностей между последовательными простыми числами.

Давайте теперь построим график разностей между последовательными простыми числами. Сначала мы используем функции Table и Prime для построения таблицы tl (точнее, списка) первых п простых чисел.

tl= Table[Prime[k],{к,1,n=10A5}];

Теперь составим таблицу t2 (тоже список) разностей между последовательными простыми числами.

t2=Table[tl[[i+l]]-tl[[i]], {i,1,Length[tl]—1} ];

Наконец, мы можем использовать функцию ListPlot для построения графика.

ListPlot [t2, PlotRange->All]

Арифметика: простые числа

155

100

20000 40000 60000 80000 100000

А вот график для п = 10000.

70

60 ■

50 ■

ДП •

••• •

••

• •

 

 

и

• • • • • •

• ••••

••• « •

•••••• • •

^ v-/

 

 

 

 

 

 

 

 

 

 

 

10

2000

4000

6000

8000

10000

Близнецы

Изучая распределение простых чисел, мы узнали, что интервалы, состоящие из со­ ставных чисел, могут быть сколь угодно длинными. Однако встречаются и очень ко­ роткие интервалы, ограниченные простыми числами. Простые числа 2 и 3 следуют друг за другом, не пропуская между собой ни одного составного числа. Но это, ко­ нечно, исключение, больше нигде не встречающееся в натуральном ряду. Но зато немало встречается таких пар простых чисел, между которыми стоит только одно со­ ставное число (четное, естественно). Простые числа, разность которых равна 2, назы­ ваются близнецами. Честно говоря, это наименьшая возможная разность между нечет­ ными простыми числами. (Потому что все простые числа, за исключением 2, нечетны!) Вот как определяется функция, которая отыскивает все пары близнецов среди первых т простых чисел.

TwinPrimes[m_]:=

Module[{s=Prime[Range[m]]},{#,#+2}&/@Extract[s,Position[Drop[s,1]-

Drop[s,-1],2]]]

Вот, например, список пар близнецов среди первой тысячи простых чисел.

TwinPrimes[1000] {{3,5},{5,7},{11,13},{17,19},{29,31},{41,43}, {59,61}, {71,73},

{101,103}, {107,109},{137, 139},{14 9,151},{17 9,181}, {191,193},{ 197, 199},

156

Гпава 5

{227,229}, {239,241},{269,271},{281,283},{311,313},{347,349},{419,421}, {431,433},{461,463},{521,523},{569,571},{599,601},{617,619},{641,643}, {659, 661 }, {809, 811 }, {821,823},{827,829}, {857,859},{881,883},{1019, 1021}, {1031,1033}, {104 9, 1051},{1061,1063}, {1091,1093}, {1151,1153}, {1229, 1231 }, {1277,1279},{1289, 1291},{1301,1303},{1319,1321},{1427, 1429},{1451,14 53}, {1481,14 83},{1487,1489},{1607,1609},{1619,1621}, {1667, 1669}, {1697,1699},{1721,1723},{1787,1789},{1871,1873},{1877, 1879}, {1931,1933}, {194 9, 1951},{1997,1999}, {2027,2029},{2081,2083}, {2087,2089}, {2111,2113},{2129,2131},{2141,2143},{2237,2239},{2267, 2269}, {2309, 2311 }, {2339,2341},{2381,2383},{2549,2551},{2591,2593}, {2657,2659}, {2687,2689}, {2711,2713},{2729,2731},{2789,2791},{2801, 2803 },{2969,2971}, {2999, 3001},{3119,3121},{3167,3169},{3251,3253}, {3257,3259}, {3299, 3301}, {3329, 3331}, {3359, 3361}, {3371,3373}, {3389, 3391 }, {3461,34 63},{34 67,34 69},{3527,3529},{3539, 3541},{3557,3559}, {3581,3583}, {3671,3673}, {37 67,37 69}, {3821,3823}, {3851,3853}, {3917, 3919},{3929,3931 }, {4001,4003}, {4019,4 021}, {4049,4051}, {4091,4 093}, {4127, 4129}, {4157,4159}, {4217,4219},{4229, 4231},{4241,4243},{4259, 4261},{4271,4273},{4337,4339},{4421,4423},{4481,4483},{4517,4519}, {4547, 4549}, {4637,4639},{464 9, 4651}, {4721,4723},{4787,4789},{47 99, 4801 }, {4931,4 933}, {4967, 4969},{5009, 5011},{5021,5023},{5099, 5101}, {5231,5233}, {527 9,5281}, {5417,5419},{5441,5443},{5477,5479}, {5501, 5503},{5519,5521},{5639,5641},{5651,5653},{5657,5659},{5741,5743}, {5849,5851 },{58 67,58 69},{587 9, 5881}, {6089, 6091}, {6131,6133}, {6197, 6199},{6269,6271},{6299,6301},{6359,6361},{6449,6451},{6551,6553}, {6569, 6571 }, {6659, 6661 },{6689, 6691},{6701,6703},{67 61, 6763}, {677 9, 6781},{6791,6793},{6827,6829},{6869,6871},{6947,6949},{6959,6961}, {7127,7129}, {7211,7213}, {7307,7309},{7331,7333}, {734 9, 7351},{7457, 7459}, {7487,7489}, {7547,7549},{7559, 7561}, {7589, 7591}, {7757,7759}, {7877,7879} }

А вот так можно найти список пар близнецов, не превосходящих 1000.

TwinPrimes [PrimePi [1000] ]

{{3,5}, {5, 7},{11,13} ,<17, 19), {29,31),{41 ,43), {59, 61),{71,73} {101,103},■{107, 109), {137, 139), {149,151), {179, 181} ,{191, 193), {197,199},-(227, 229), {239, 241), {269,271), {281, 283} ,{311, 313), {347,349},■{419, 421), {431, 433), {461,463), {521, 523} ,{569, 571), {599, 601 },,{617, 619), {641, 643), {659,661}, {809, 811} ,{821, 823), {827,829},,{857, 859), {881, 883}}

В принципе данная функция работает довольно быстро, хотя едва ли она может найти пару близнецов { 156*5202 —1, 156-5202 +1 }.

Простые числа, близкие к числам определенного вида

В ряде областей науки и техники, например в теории кодирования; важно знать простые числа, близкие к числам определенного вида (чаще всего к степеням таких оснований, как 2, 3 и 10). Вне сомнения, их можно было бы найти в обычных табли­ цах простых чисел. Однако таблицы нужного размера не могли бы поместиться даже в многотомных изданиях. Поэтому существуют специальные таблицы, в которых при­

водятся только простые числа, близкие, например, к 2", 3я и 10"

Но составить такие таблицы для достаточно больших п довольно трудно, и, не­ смотря на компактность, такие таблицы зачастую весьма неполны. С помощью системы Mathematica несложно составить такие таблицы самостоятельно. Допустим, таблица должна содержать десять наибольших простых чисел, предшествующих N, и десять простых чисел, следующих за N. Можно ограничиться случаем достаточно больших N, например N>.1000, поскольку при меньших N вопрос решается с помощью таблиц простых чисел, помещаемых обычно в учебниках для пятиклассников.

Арифметика: простые числа

157

Давайте попытаемся составить нужную нам программу, например, для степеней 10. Чтобы результаты выглядели наглядно, нужно предусмотреть их преобразование в таблицу с помощью текстового процессора, например, Word. Поэтому необходимо предусмотреть такой формат результатов, который было бы легко отформатировать

(преобразовать в таблицу). Для этого можно

предусмотреть двоеточие

в

качества

разделителя колонок и два двоеточия

в

качестве разделителя строк

 

таблицы,

Вот как может выглядеть программа.

 

 

 

 

base=10;

 

 

 

 

Do [{

 

 

 

 

baseN=baseAn;

 

 

 

 

P r i n t [ n , ;

 

 

 

 

PreviouskPrimes[baseN,10];

 

 

 

Print

Print["::"]},'{n,6,20}]

 

 

NextkPrimes[baseN,10];

 

 

В этой программе использованы функции PreviouskPrimes и NextkPrimes. Функция PreviouskPrimes [N, к] должна генерировать к наибольших простых чисел, меньших N. Иными словами, она должна генерировать к простых чисел, предшест- вующих N. Функция NextkPrimes [N, к] должна генерировать к наименьших простых чисел, больших N. Иными словами, она должна генерировать к простых чисел, сле­ дующих за N. Вот и все. Нам осталось только написать код этих двух функций. Давай­ те начнем с функции PreviouskPrimes [N, к ].

PreviouskPrimes[n_Integer?(#>100&), k_Integer?Positive]:=

Block[{p=PreviousPrime[n] ,i=l},

While[i<=k,{Print[p,","],p=PreviousPrime[p] ,++i}]]

Эта функция генерирует простые числа в порядке убывания, т.е. в порядке удале­ ния от заданного числа, что удобно при выборе простого числа, наиболее близкого к заданному.

Не сложнее написать и функцию NextkPrimes [N, к ]. Для этого нужно только за­ менить функцию PreviousPrime на NextPrime.

NextkPrimes[n_Integer?(#>100&), k_Integer?Positive]:=

Block[{p=NextPrime[n],i=l},

While[i<=k,{Print[p,","],p=NextPrime[p],++i}]]

Теперь можем приступить к выполнению составленной программы. Так как функ­ ции PreviousPrime и NextPrime содержатся в пакете теории чисел, в первую оче­ редь нужно загрузить этот пакет.

<<NumberTheory'NumberTheoryFunctions'

Затем нужно загрузить (и проверить) определения наших функций PreviouskPrimes и NextkPrimes. Сначала загрузим (и протестируем) PreviouskPrimes.

PreviouskPrimes[n_Integer?(#>100&) , k_Integer?Positive]:=

Block[{p=PreviousPrime[n],i=l},

While[i<=k,{Print[p,","],p=PreviousPrime[p],++i}]]

PreviouskPrimes[1000,3]

997

991

983

Видим, что функция PreviouskPrimes работает правильно. Значит, теперь можем сделать то же самое и для функции NextkPrimes.

158

Главаi

NextkPrimes[n_Integer?(#>100&), k_Integer?Positive]:=

Block[{p=NextPrime[n],i=l},

While[i<=k,{Print[p,","],p=NextPrime[p],++i}]]

NextkPrimes[1000,3]

1009

1013

1019

Теперь можем ввести программу и выполнить ее. Вот что у нас получится (конец обрезан).

6 :

999983

999979

999961

999959

999953

999931

999917

999907

999883

999863

1000003

1000033

1000037

1000039

1000081

1000099

1000117

1000121

1000133

1000151

7 :

9999991

9999973

9999971

9999943

Конечно, для практического применения результаты удобнее отформатировать в виде таблицы. Для этого в текстовом редакторе нужно сделать всего несколько замен. Сначала нужно убрать пробелы, разрывы строк, символы абзацев (кроме последнего) и запятые перед двоеточием. Затем два двоеточия нужно заменить символом абзаца. Этим самым мы разобьем таблицу на строки. После этого достаточно выделить все, что получилось, и преобразовать текст в таблицу, указав в качестве разделителя столб­ цов двоеточие Конечно, это еще не все. Нужно ведь еще расставить пробелы после запятых, написать название таблицы и заголовки столбцов. Так у меня получилась табл. Б.22.

Число простых чисел, не превосходящихх

(функция PrimePi[x])

Согласитесь, изучив все тонкости искусства составления таблиц простых чисел, было бы нелогично пренебречь искусством составления таблиц на основе уже создан­ ных. Почему бы, имея полную (значит, бесконечную!) таблицу простых чисел, не по­ интересоваться, сколько чисел в этой таблице не превосходят данного числа х. Иными

Арифметика: простые числа

159

словами, определить число простых чисел, не превосходящих х. Это число в учебниках теории чисел обозначается к(х). Функция п(х) привлекала внимание уже античных ма­ тематиков. Евклид, например, установил, что она неограниченно возрастает с ростом аргумента. Изучением этой функции занимались почти все великие математики Про­ шлого, ее исследовали Лежандр, Чебышев, Риман, Адамар, Валле-Пуссен, Чудаков, Виноградов, Коробов, Литлвуд, Сельберг, Эрдеш, Ингам, Прахар, Пан Чен-тонг, Чен-ин-рун, Титчмарш, Мейссель, Рогель, Чипола, Мертенс, Гаусс, Бертран, Вейль, Линник, Бомбьери...

В системе Mathematica эта функция называется PrimePi. Система Mathematica может вычислить ее значения практически в мгновение ока... Правда, не все.

Do[Print[n," PrimePi[n]],{n,15}]

14

225

3168

41229

59592

678498

7664579

85761455

950847534

10455052511

114118054813

1237607912018

13346065536839

143204941750802

PrimePi::largp Argument 1000000000000000

in PrimePi[1000000000000000] is too

large for this implementation. More...

1000000000000000 PrimePi[1000000000000000]

В документации, правда, верхний предел указан примерно равным 260, а на самом

деле...

Do[Print[n,":",PrimePi[2лп]],{n,51}]

11

22

34

46

511

618

731

854

997

10172

11309

12564.

131028

141900

153512

166542

1712251

1823000

1943390

2082025

21155611

22295947

160

Гпава 5