книги / Mathematica 5. ╨б╨░╨╝╨╛╤Г╤З╨╕╤В╨╡╨╗╤М
.pdfП Диспетчер задач 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["::"]},'{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 |