книги / Mathematica 5. ╨б╨░╨╝╨╛╤Г╤З╨╕╤В╨╡╨╗╤М
.pdfEnd Sub |
Multiplier () |
|
|
|
|
|
|
|
|
|
|
|
|
||||
Function |
|
|
|
|
|
|
|
|
|
|
|
|
|||||
I |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Обработка множителя (и его |
степени) |
|
|
|
|
|
|
|
|
||||||||
Макрос записан 26.10.2003 Яков Шмидский |
|
|
|
|
|
|
|
||||||||||
Dim strTemp As |
String |
|
|
Ctxt, |
Response, MyString |
|
|
|
|
|
|||||||
Dim Msg, Style, Title, Help, |
|
|
|
|
|
||||||||||||
Msg = "Хотите продолжить ?" |
' Вопрос к пользователю |
|
|
|
|
|
|||||||||||
Style = vbYesNo + vbCritical + vbDefaultButton2 |
|
' Кнопки |
окна |
|
|||||||||||||
T itle = |
"Очередной множитель: степень простого" |
|
Заголовок |
|
|||||||||||||
Response |
= vbYes |
Пока |
ошибки не обнаружены |
|
|
|
|
|
|
|
|||||||
strTemp = Selection.Text |
Выбираем |
очередной символ |
|
|
|
|
|
||||||||||
Selection.MoveRight Unit:=wdCharacter, Count:=l, Extend:=wdExtend |
|
||||||||||||||||
If strTemp = "{" Then ' Если отрывающая скобка - начало множителя |
|
||||||||||||||||
Selection.Delete |
Unit:=wdCharacter, |
Count:=1 1 |
Скобку |
удаляем |
|
||||||||||||
Selection.Extend |
C h a r a c t e r " ' Расширили |
выделение |
до , |
|
|
||||||||||||
Selection.MoveLeft |
Unit:=wdCharacter, Count:=1; |
Extend:=wdExtend |
|
||||||||||||||
Отменили выделение |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
BaseRepresent |
|
Unit:=wdCharacter, Count:=1 |
Основание |
|
|||||||||||||
Selection.MoveRight |
|
||||||||||||||||
Selection.MoveRight |
Unit:=wdCharacter, Count:=1, Extend:=wdExtend |
||||||||||||||||
strTemp |
= Selection.Text |
* Основание |
отделяется |
от показателя |
|
||||||||||||
If strTemp |
= |
"," |
Then |
' Разделитель |
нашли |
|
|
|
|
|
|
|
|||||
|
PowExp |
' Обрабатываем показатель |
|
Count:=1, |
__ |
|
|
||||||||||
|
Selection.MoveRight Unit:=wdCharacter, |
|
|
||||||||||||||
|
strTemp = Selection.Text |
Этот |
символ |
Extend:=wdExtend |
|
||||||||||||
|
завершает |
множитель |
|
||||||||||||||
|
If strTemp = |
"}" Then ' Это должна быть |
закрывающая скобка |
|
|||||||||||||
|
Else |
Selection.Delete Unit:=wdCharacter, Count:=1 1 Удалить ее |
|||||||||||||||
|
' Но ведь |
в коде же должна |
быть закрывающая |
|
скобка |
_ |
|||||||||||
|
|
Response |
= MsgBox("***Ошибка в сомножителе: нет } ... |
||||||||||||||
|
|
If Response = vbYes Then |
|
+ Msg, |
Style, |
Title) |
|
||||||||||
|
|
Пользователь выбрал Yes (Да) |
|
||||||||||||||
|
|
|
MyString = |
"Yes" |
* Запомним, |
что |
выбрал пользователь |
||||||||||
|
|
Else |
|
' Пользователь выбрал No (Нет) |
выбрал |
пользователь |
|||||||||||
|
|
End |
MyString = |
"No" |
' Запомним, |
что |
|||||||||||
|
End |
If |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
If |
|
- а где же |
запятая? |
|
|
|
|
|
|
|
|
|||||
Else * Иначе |
|
|
|
|
, ... |
_ |
|
||||||||||
|
Response |
= MsgBox("***Ошибка в сомножителе: нет |
|
||||||||||||||
|
If Response |
= vbYes |
Then |
|
|
+ Msg, |
Style, |
Title) |
|||||||||
|
Пользователь |
выбрал |
Yes |
(Да) |
|
||||||||||||
|
|
MyString |
= |
"Yes" |
* Запомним, что выбрал |
пользователь |
|
||||||||||
|
Else |
|
' Пользователь выбрал No (Нет) |
выбрал |
пользователь |
|
|||||||||||
|
End |
MyString |
= |
"No" |
' Запомним, что |
|
|||||||||||
End |
If |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
If |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
End If |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Multiplier = Response |
|
|
|
|
|
|
|
|
|
|
|
|
|||||
End Function |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
Sub PowExp () |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
i |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Обработка |
показателя |
|
|
|
|
|
|
|
|
|
|
|
|
||||
Dim strTemp As |
String |
|
|
|
|
|
|
|
|
|
|
|
|
Арифметика: разложение целых чисел на простые множители |
123 |
Selection.Delete |
Unit:=wdCharacter, Count:=1 |
Удаляем |
символ |
||||||
Selection.Extend |
Characters"}" |
1 Расширили |
выделение |
до } |
|||||
Selection.MoveLeft Unit:=wdCharacter, Count:=1, |
Extend:=wdExtend |
||||||||
* Отменили выделение |
} |
Это и |
есть |
показатель |
|
|
|||
strTemp = Selection.Text |
|
|
|||||||
If strTemp = "1" |
Then |
' Если показатель равен 1 |
Удаляем его |
||||||
Else |
Selection.Delete |
Unit:=wdCharacter/ Count:=1 |
|||||||
' В противном случае |
форматируем |
его как надстрочный |
|||||||
|
With Selection.Font |
|
|
|
|
|
|
||
|
.Superscript |
= True 'Надстрочный |
|
|
|
||||
|
End With |
|
|
|
|
Count:=1 |
|
|
|
Selection.MoveRight Unit:=wdCharacter, |
|
|
|||||||
End |
Selection.Font.Reset |
'Восстановить |
стиль |
|
|
|
|||
If |
|
|
|
|
|
|
|
|
|
End |
Sub |
|
|
|
|
|
|
|
|
Sub BaseRepresent () |
|
|
|
|
|
|
|
||
Dim |
strTemp As String |
|
|
|
|
|
|
|
|
strTemp = Selection.Text |
Основание |
|
|
|
|
||||
If Not MultiplierQ(strTemp) Then |
|
|
Count:=1 |
|
|||||
|
' Selection.MoveLeft |
Unit:=wdCharacter, |
|
||||||
|
Selection.InsertBefore "(" ' Перед основанием вставим символ ( |
||||||||
End |
Selection.InsertAfter |
")" |
А после него |
вставим символ ) |
|||||
If |
|
|
|
|
|
|
|
|
End Sub
Function MultiplierQ(strTemp)
ret = True
If Left(strTemp, 1) = |
Then ret = False |
MultiplierQ = ret
End Function
Этот макрос преобразует представление
{{-l,n},{2,-1},{-3,-m},{5,-1},{7,-1},{11,-1},{13,-1},{31,-1}, {61,-1},{2003,1},{5549927,8},{109317926249509865753025015237911,1}}
в такой более привычный вид.
(-1) пх2_1х (-3) "mx5'1x7"1xll"1xl3"1x31"1x
61'1Х2003Х55499278Х109317926249509865753025015237911
Теперь, пользуясь результатами и макросом, можем составить таблицу (табл. Б. 16). Если нужно разложить только, например, числители, можно воспользоваться еле
дующей программой:
Do[Print[n, Factorlnteger[Numerator[BernoulliB[n]]]] ,
{n,2 , 1 0 2 , 2 }] .
Так как это разложение играет чрезвычайно важную роль в доказательстве По следней теоремы Ферма, представим его, как обычно, в виде таблицы (табл. Б. 17).
Эта таблица заслуживает внимания. Прежде всего нужно заметить, она может ока зать неоценимую помощь при поиске больших иррегулярных чисел. (Напомню, чи простое число р называется регулярным, если на него не делится ни один из числите лей чисел Бернулли Въ ВА, Вp_3. В противном случае простое число называете!
124 |
Глава t |
иррегулярным.) Иррегулярные простые числа долгое время были причиной ужасных неприятностей для всех, кто занимался доказательством Последней теоремы Ферма. Дело в том, что для регулярных чисел эта теорема была доказана Куммером еще в 1850 году. Это было настоящее торжество ферматистов! Наиболее отчаянные предпо ложили даже, что число иррегулярных чисел конечно, и, таким образом, им остава лось якобы рассмотреть лишь конечное число случаев! Нужно заметить, что их пред положение не было лишено оснований. Действительно, в пределах первой сотни есть всего лишь три иррегулярных числа: 37, 59 и 67. (В этом легко убедиться, просмотрев составленную нами таблицу.) Однако в 1915 году Иенсен довольно просто доказал, что множество иррегулярных чисел бесконечно. Тогда-то ферматисты занялись изуче нием иррегулярных чисел вплотную. В 1965 году Эйхлер существенно продвинулся в поисках доказательства Последней теоремы Ферма, а десять лет спустя, в 1975 году, Брюкнер ввел индекс иррегулярности числа р — количество числителей чисел Бернулли В2, В4, ..., В ^ , делящихся на р, — и тем самым придал результатам Эйхлера вполне обозримую форму. Понятно, что интерес к таблицам, подобным составленной нами (не без помощи системы Mathematica), значительно возрос. Однако даже в 1985 году, после очередного всплеска интереса к Последней теореме Ферма, когда она была доказана для “почти всех” натуральных показателей, таблица, помещенная в одном из лучших университетских учебников по теории чисел — в учебнике 3. И. Боревича и И. Р. Шафаревича, была доведена лишь до п = 60. Так что едва ли будет преувеличением утверждение, что с помощью системы Mathematica мы состави ли таблицу, о которой несколько поколений ферматистов могли только мечтать!
Кроме того, эта таблица поможет нам понять, как система Mathematica обращается с дробями. Если число дробное (а именно такими и являются числа Бернулли с чет ными индексами), то знак дроби относится к числителю. В этом легко убедиться, про смотрев нашу таблицу. Действительно, как мы видели из таблицы разложения чисел Бернулли Вп на простые множители, числа В4п отрицательны, а числа В4п_2 положитеЛны. Точно так же распределены и знаки числителей в таблице разложения числи телей чисел Бернулли В„.
Итак, с помощью функции F a cto rln teg er можем разлагать на простые множите ли не только натуральные и отрицательные числа, но и дроби, — иными словами, все рациональные числа. Таким образом, кажется, мы научились применять эту функцию ко всем числам, к которым применимо понятие разложения на простые множители. Но возможности этой функции шире. Она умеет еще кое-что. “Как? Неужели... Разве это мыслимо, разлагать на множители комплексные числа?”, — возможно, подумаете вы. И не ошибетесь!
Факторизация гауссовых чисел
Напомним, что гауссовыми называются комплексные числа, у которых действи тельная и мнимая части являются целыми числами. Иными словами, это комплекс ные числа а+Ы, у которых вещественная (а) и мнимая (b) части представляют собой целые числа. Вот примеры гауссовых чисел:
2, 1+2/, /, -/, 1+/, 1-/, 1+7 /, 1+555555/, 9999+444/.
На комплексной плоскости гауссовы числа образуют решетку всех точек с целыми координатами. Гауссовы числа называются в честь К. Ф. Гаусса, который обратил на них внимание еще в 1832 году в работе о биквадратичных вычетах. Именно Гаусс по нял важность изучения этих чисел и установил их основные свойства.
Как оказалось, множество гауссовых чисел, рассматриваемое с обычными опера циями, образует кольцо, являющееся, конечно, подкольцом кольца (даже поля) ком плексных чисел. Кольцо целых гауссовых чисел можно рассматривать как расширение кольца целых чисел Z путем присоединения /, поэтому это кольцо обозначается Z[/].
Арифметика: разложение целых чисел на простые множители |
125 |
В этом кольце делителями единицы являются лишь +1, —1, / и —/. Так что множество делителей единицы в кольце гауссовых чисел конечно. А потому в этом кольце имеет смысл понятие простого элемента, а, значит, можно выполнять разложение элементов этого кольца на простые множители. Нетрудно доказать, что кольцо целых гауссовых чисел евклидово. Поэтому с точностью до делителей единицы разложение на простые множители в нем единственно. Так что кольцо гауссовых чисел (как и всякое евкли дово кольцо) является гауссовым, или факториальным.
Нормой комплексного числа называется квадрат модуля, т.е. квадрат длины отрез ка, соединяющего комплексное число с началом координат. Иными словами, это сумма квадратов вещественной и мнимой частей комплексного числа:
N(a+bi) = (а+Ы)(а—Ы) = а2 + Ь2
Нечетное простое число р является простым гауссовым числом тогда и только то гда, когда оно дает в остатке 3 при делении на 4: р = 3 (mod 4). Если же р = 1 (mod 4), то р не является простым в кольце целых гауссовых чисел. Не является простым в кольце целых гауссовых чисел и число 2.
Давайте теперь найдем несколько разложений гауссовых чисел на простые множи тели.
F a c t o r ln t e g e r [5 -5 1 ] |
= |
{ { - 1 , 1 } , { 1+i , 1}, {1+2 |
i , 1 } , { 2 + i , 1}} |
|||
F a c t o r ln t e g e r [3+1] |
= |
|
{ { - i , 1 } , { 1 + i , 1 } , { 1 + 2 |
i , l } } |
||
F a c t o r ln t e g e r [-9 0 -1 8 0 1 ] = { { 1 + i , 2 } , { 1 + 2 i , 2 } , { 2 + i , 1 } , { 3 , 2 } } |
||||||
F a c t o r ln t e g e r [-1 8 2 -1 2 6 1 ] = { { 1 + i , 3 } , { 2 + i , 3 } , { 7 , 1 } } |
||||||
F a c t o r ln t e g e r [3+1 |
5] |
|
= { { 1 + i , 1 } , { 4 + i , 1}} |
|
||
F a c t o r ln t e g e r [777+1 |
111] |
= |
{ { - 1 , 1 } , { 1 + i , 1 } , { 1 + 6 |
|||
i , l } , { 2 + i , 2 } , { 3 , 1 } , { 6+i , |
1}} |
|
|
|||
F a c t o r ln t e g e r [153+1 |
374] |
= |
{ { - i , 1 } , { 1 + 4 i , |
1}, {2 + i , 1}, { 4 +i , 1}, {8+7 |
||
i/1}} |
|
= |
{{7 +8 |
i , 1}} |
|
|
F a c t o r ln t e g e r [7+81] |
|
Число 7+8 /', как видим, оказалось простым. Заметьте, что Mathematica сама поня ла, что разложение нужно выполнять в кольце целых гауссовых чисел. Но как разло жить на простые множители в кольце целых гауссовых чисел натуральные числа! Ведь, например, Factorlnteger[41] = {{41,1}}.
В подобных случаях, т.е. когда в качестве аргумента функции Factorlnteger выступает рациональное вещественное число, а разложить аргумент нужно на про стые гауссовы числа, область разложения нужно указать явно. Для этого необходи мо с помощью второго аргумента функции Factorlnteger установить опцию Gaussianlntegers равной True. Вот несколько примеров, в которых показано, кн это делается.
F a c t o r ln t e g e r [4 1 ,G a u ssia n In teg e rs-> T r u e ] |
= |
{ { - i , l } , { 4 + 5 |
i , l } , { 5 + 4 |
i , 1}} I |
|
F a c t o r ln t e g e r [ 5 , G a u ssia n In te g e r s -> T r u e ] |
= |
{ { —i , l } , {1+2 |
i , |
1 } , { 2 + i , 1}} |
|
F a c t o r ln t e g e r [ 2 ,G a u ssia n In te g e r s -> T r u e ] |
= |
{ { - i f 1 } f { 1 + i / 2} |
} |
I |
F a c t o r ln t e g e r [1 1 ,G a u ssia n In te g e r s -> T r u e ] |
= |
{ { 1 1 , 1 } } |
|
F a c t o r ln t e g e r [1 3 ,G a u ssia n In te g e r s -> T r u e ] |
= |
{ { - i , 1 } , { 2 + 3 i , l } , {3+2 |
I |
i f 1}} |
|
|
|
Как видите, ничего сложного!
Факторизация очень больших чисел
Как мы уже видели, функция Factorlnteger вполне справляется с разложение* чисел, десятичная запись которых содержит не более 60-70 десятичных знаков (эти примерно две сотни двоичных). Хотя именно такие числа чаще всего встречают»* на практике, их множество конечно. Дополнение же этого множества до множеств!
126 |
Главе |
натуральных чисел бесконечно! Поэтому иногда приходится раскладывать и числа, со держащие несколько сотен, а то и тысяч десятичных знаков. Конечно, в таких случаях зачастую приходится полагаться на удачу. Однако и здесь может помочь Mathematica. Например, если известно, что некоторое число является большой степенью некото рого основания, то достаточно разложить только основание. Так что этот случай большого числа для процедуры факторизации можно считать тривиальным. Несколько менее тривиальным является случай факториала.
Факторизация факториалов
Факториалы являются классическим примером больших чисел. В школе, примерно класса с шестого, учителя плавно готовят детей к тому, что факториалы очень быстро растут, а при изучении комбинаторики говорят, что уже 8! = 40320. Тех же, кто этого не устрашится, на школьном кружке пугают тем, что 100! — невообразимо большое число. Такое большое, что даже вычислить его немыслимо. (Но члены школьного ма тематического кружка обычно знают, что это число вычислил Мольтерер еще до по явления ЭВМ.) Для тех же, кто не убоялся этого числа и (зачастую вопреки устраше ниям учителей) преодолел конкурсный отбор в вузы, у профессоров есть очередная страшилка: 1000!. Что-то я не видел профессора, который бы выписал десятичную запись этого числа на доске! Наверное, для профессоров оно и вправду страшное! Но не для нас. Мы его (вместе с системой Mathematica) выпишем раньше, чем про фессор успеет моргнуть оком.
1 0 0 0 ! =
402 38726 00770 93773 54370 24339 23003 98571 93748 64210
71463 25437 99910 42993 85123 98629 02059 20442 08486 96940 48004 79988
61019 71960 58631 66687 29948 08558 90132 38296 69944 59099 74245 04087
07375 99188 23627 72718 87325 19779 50595 09952 76120 87497 54624 97043
60141 82780 94646 49629 10563 93887 43788 64873 37119 18104 58257 83647
84997 70124 76632 88983 59557 35432 51318 53239 58463 07555 74091 14262
41747 43493 47553 42864 65766 11667 79739 66688 20291 20737 91438 53719
58824 98081 26867 83837 45597 31746 13608 53795 34524 22158 65932 01928
09087 82973 08431 39284 44032 81231 55861 10369 76801 35730 42161 68747
60967 58713 48312 02547 85893 20767 16913 24484 26236 13141 25087 80208
00026 168,31 51027 34182 79777 04784 63586 81701 64365 02415 36913 98281
26481 02130 92761 24489 63599 28705 11496 49754 19909 34222 15668 32572
08082 13331 86116 81155 36158 36546 98404 67089 75602 90095 05376 16475 k84772 84218 89679 64624 49451 60765 35340 81989 01385 44248 79849 59953 31910 17233 55556 60213 94503 99736 28075 01378 37615 30712 77619 26849 03435 26252 00015 88853 51473 31611 70210 39681 75921 51090 77880 19393 17811 4i945 45257 22386 55414 61062 89218 79602 23838 97147 60885 06276 86296 71466 74697 56291 12340 82439 20816 01537 80889 89396 45182 63243 67161 67^21 79168 90977 99119 03754 03127 46222 89988 00519 54444 14282 01218 73617 45992 64295 65817 46628 30295 55702 99024 32415 31816 17210 46583 20367 86906 11726 01587 83520 75151 628.42 25540 26517 04833 04226 14397 42869 33061 69089 79684 82590 12545 83271 68226 45806 65267 69958 65268 22728 07075 78139 18581 78889 65220 81643 48344 82599 32660 43367 66017 69996 12831 86078 83861 50279 46595 51311 56552 03609 39881 80612 13855 86003 01435 69452 72242 06344 63179 74605 94682 57310 37900 84024 43243 84656 57245 01440 28218 85252 47093 51906 20929 02313 64932 7^497 56551 39587 20559 65422 87497 74011 41334 69627 15422 84586 23773 87538 23048 38656 88976 46192 73838 14900 14076 73104 46640 25989 94902 22221
76590 43399 01886 01856 65264 85061 79970 23561 93897 01786 00408 11889
72991 83110 21171 22984 59016 41921 06888 43871 21855 64612 49607 98722
908.51 92968 19372 38864 26148 39657 38229 11231 25024 18664 93531 43970
13742 85319 26649 87533 72189 40694 28143 41185 20158 01412 33448 28015
05139 96942 90153 48307 76445 69099 07315 24332 78288 26986 46027 89864
Арифметика: разложение целых чисел на простые множители |
127 |
32113 |
90835 |
06217 |
09500 |
25973 |
89863 |
55427 |
71967 |
42822 |
24875 |
75867 |
65752 |
34422 |
02075 |
73630 |
56949 |
88250 |
87968 |
92816 |
27538 |
48863 |
39690 |
99598 |
26280 |
95612 |
14509 |
94871 |
70124 |
45164. |
61260 |
37902 |
93091 |
20889 |
08694 |
20285 |
10640 |
18215 |
43994 |
57156 |
80594 |
18727 |
48998 |
09425 |
47421 |
73582 |
40106 |
36774 |
04595 |
74178 |
51608 |
29230 |
13535 |
80818 |
40096 |
99637 |
25242 |
30560 |
85590 |
37006 |
24271 |
24341 |
69090 |
04153 |
69010 |
59339 |
83835 |
77793 |
94109 |
70027 |
75347 |
20000 |
ооооо |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
ооооо |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
00000 |
ооооо |
Действительно, число огромное! Правда, факторизовать его совсем несложно, так как его простые делители известны: даже пятиклассник без труда сообразит, что ими будут все простые числа, меньшие п = 1000. Что же касается определения показате лей, с которыми они входят в каноническое разложение, то здесь положение более сложное. Обычно пятикласснику (участнику городской или районной олимпиады по математике) нужно от пяти до десяти минут на вывод и проверку необходимой фор мулы. Но ведь Mathematica (точнее, функция Factor-Integer) не проверяет, является ли каждое предлагаемое ей число факториалом некоторого другого числа, и потому применить формулу не сможет! Так сколько же ей понадобится времени на фактори зацию этого монстра? На самом деле ответ получается в мгновение ока.
F a c to r ln te g e r [п] = 2994х 3498х5249х71б4х 1198х1381х1761х 1954х2344х2935х 3133х 3727х 4124х4323х 4721х5318х591бх 611бх б714х7114х7313х7912х8312х 8911х 9710х 1019х 1039х 1079х 1099х 1138х1277х 1317х 1377х 1397х 14 9бх 151бх 157бх 1636х1675х1735х 1795х 1815х 1915х 1935х1975х1995х2114х2234х2274х2294х2334х2394х2414х251Зх 257Зх 263Зх 269Зх 271Зх 2773х2813х2833х2933х3073х3113х3133х3173х3313х3372х3472х34 92х3532х3592х3672х 3732х3792х3832х3892х3972х4012х4092х4192х4212х4312х4332х43 92х4432х4492х4572х 4612х4632х4672х4792х4872х4912х4992х503х509х521х523х541х547х557х563х569х 571x577x587x593x599x 601x 607x 613x 617x 619x 631x 641x 643x 647x 653x 659x 661X67Зх 677x 683x 691x701x709x719x727x 733x 739x743x751x757x761x 769x773x 787x797x809х 811x821x823x827x829x839x853x857x 859x863x877x881x883x 887x 907x 911x 919х929х 937x 941x 947x 953x 967x 971x 977x 983x 991x 997
Почему же тогда это разложение получается так быстро? Тому есть две причины. Во-первых, функция F a c to r ln te g e r реализует довольно хитрый алгоритм (и к тому же усовершенствованный в версии 5), который умеет пользоваться особенностями числа и ранее найденными множителями. Во-вторых, число имеет малые простые де лители, притом в достаточно больших степенях (взгляните на разложение и убедитесь в этом самостоятельно). Поэтому уже в самом начале, как только найден очередной небольшой простой делитель, число делится на его достаточно большую степень, и поиск следующего делителя выполняется для уже значительно меньшего числа. Например, когда найдены все простые делители, меньшие 500, остается факторизо вать число
15691 |
53857 |
18474 74009 |
83807 |
62903 |
18629 |
41145 |
72096 |
17012 |
19604 99858 |
85055 |
99420 |
2860160316 |
94401 |
22137 |
22852 |
86216 |
37326 |
13501 |
59916 38173 |
00885 |
96291 |
76502 03413 |
58819 |
32577 |
52694 |
92805 |
54593 |
08494 |
87900 72440 |
14847 |
75831 |
74209 25608 |
64073 74119. |
|
|
|
|
|
А ведь это число существенно меньше первоначального. К тому же его простые делители также являются последовательными простыми числами. И потому, хотя уже и не так стремительно, но подлежащее факторизации число все время уменьшается. А это значит, что не приходится испытывать числа, большие 1000. Добавьте сюда еш одну техническую деталь: работать приходится с все более короткими числами, и вы поймете, почему процесс заканчивается столь быстро.
128 |
Глава 4 |
Но есть огромное множество гораздо меньших чисел (вроде 1001—1, (1079—1 )/9 и т.д.), которым повезло гораздо меньше. Быстро разложить их функция Factorlnteger не может. Как же быть?
функция FactorJntegerECM:
попытка факторизации больших чисел Мерсенна
Давайте на примере попытки разложения больших чисел Мерсенна рассмотрим, как Mathematica позволяет приблизиться к решению задачи факторизации очень больших чисел.
факторизация 317-го числа Мерсенна М317
Конечно, можно попытаться применить функцию Factorlnteger. Но это не даст результата (за приемлемое время). Можно, правда, “попросить” функцию Factorlnteger найти хоть какие-нибудь делители числа Мерсенна Л/317. Для этого нужно воспользоваться опцией FactorComplete->False.
F a c to r ln te g e r [2Л317-1,FactorComplete->False]
Результат будет таким.
F a c to r ln te g e r ::fa c fn :
Unable to factor 28072587476617 « 6 4 » 65592773657961. More...
Чуть ниже будут и найденные множители.
{{9511,1}, {28072587476617996036103218722657345634038278340298769450465 797600439224658035965592773657961,1}}
Хорошо, конечно, что нашли множитель 9511, но вот второй множитель... Неиз вестно, даже простой ли он. Можно, конечно, попытаться повторить процедуру для него, но это ни к чему новому не приведет.
Factorlnteger::facfn:
Unable to factor 28072587476617 « 6 4 » 65592773657961. More...
{{28072587476617996036103218722657345634038278340298769450465797600439
224658035965592773657961,1}}
В этом случае все придется сделать вручную... Возможно, вы подумали о формулах сокращенного умножения. Да, действительно, часто они помогают. (Мы в этом уже не раз убеждались.) Но в данном случае 317 — простое число (я специально так по добрал индекс числа Мерсенна), и применить формулы сокращенного умножения просто так, “в лоб”, не удастся. Придется использовать другую функцию. Она есть в па кете теории чисел, который загружается так: «NumberTheory'FactorlntegerECM'
Сама функция называется FactorlntegerECM. Ее первоначальный алгоритм приду мал X. Ленстра (Н. W. Lenstra) в 1985 году. В нем используется теория эллиптических кривых. Функция FactorlntegerECM очень эффективна там, где Factorlnteger не справляется. Правда, с другой стороны, она не столь услужлива, как Factorlnteger. Она находит только один множитель, притом не обязательно простой. К тому же она привередлива: ее поведение не предсказуемо, если в качестве аргумента передать ей простое число. Поэтому предварительно нужно проверить, что аргумент не являет ся простым числом. Это делается с помощью функции PrimeQ.
Давайте теперь попытаемся применить функцию FactorlntegerECM для какогонибудь небольшого числа, например 91. (Это число, как мы знаем, не простое.)
FactorlntegerECM [91 ]
Арифметика: разложение целых чисел на простые множители |
129 |
А вот и результат.
13
Да, найден только один множитель... Остальное приходится делать вручную. Рассмотрим теперь более сложный пример.
т =12
n = Prime[10Лт] Prime[10лт+1]
Вот что получилось:
12
899773470806612917304808883
Теперь давайте разложим п (оно составное, так как является произведением двух последовательных достаточно больших простых чисел).
FactorlntegerECM[п]
И вот один из сомножителей:
29996224275851
Вот еще один пример применения функции FactorlntegerECM.
п=(2А58 - 27) * (2А127 - 1) 49039857307708438873655151436140637119954221204852703259
Теперь ищем какой-нибудь делитель этого числа.
288230376151711717
Наконец, освоившись с функцией FactorlntegerECM на этих более или менее про стых примерах, можем попытаться применить ее к факторизации числа Мерсенна Л/3|7. Как мы помним, оно имеет делитель 9511. Сначала убедимся, что он простой.
PrimeQ[9511]
True
Теперь можем разделить на него число Мерсенна Л/317.
п=(2л317-1)/9511 2807258747661799603610321872265734563403827834029876945046579760043922 4658035965592773657961
После этого нужно убедиться, что это число составное.
PrimeQ[п]
False
Значит, можно применить функцию FactorlntegerECM.
m=FactorIntegerECM[n]
Через 205,375 с (процессор Pentium 2,4 ГГц) получаем один из его делителей:
587492521482839879
Он простой.
PrimeQ[m]
True
Поэтому можем заниматься только частным п = п/т.
130 |
Гпава 4 |
n=n/m
4778373587762847926838735873159342707436119775645430680034874628800586
6959
Опять нужно проверить, простое ли оно.
PrimeQ [п]
Эта проверка занимает всего лишь 0,016 с, и оказывается, что оно составное.
False
Значит, можем снова применить функцию FactorlntegerECM.
m=FactorIntegerECM[n]
На этот раз понадобится 727,047 с, чтобы найти очередной делитель.
4868122671322098041565641
Снова нужно проверить, прост ли найденный делитель.
PrimeQ [m]
Эта проверка выполняется почти мгновенно, и оказывается, что делитель действи тельно прост.
True
Значит, снова можем заниматься только частным п = п/т.
n= n /m
9815639231755686605031317440031161584572466128599
Опять нужно проверить, простое ли оно.
PrimeQ [п]
Эта проверка занимает всего лишь 0,015 с, и оказывается, что найденное частное является простым числом.
PrimeQ[ п ]
True
Таким образом, мы нашли все простые множители 317-го числа Мерсенна МЗХ1 и тем самым разложили этого числового великана на простые множители.
Мзп = 9511X587492521482839879X4868122671322098041565641X981563923175568 6605031317440031161584572466128599
Факторизация 337-го числа Мерсенна /И337
Чтобы освоить методику применения функций Factorlnteger и FactorlntegerECM, попробуем разложить на простые множители 337-е число Мерсенна М331. Сначала можно попытаться применить функцию Factorlnteger. Но как и в случае 317-го числа Мерсенна Л/317, это не даст результата за приемлемое время. Тогда применим функцию Factorlnteger с опцией FactorComplete->False, чтобы найти хоть какиенибудь делители 337-го числа Мерсенна М331.
Factorlnteger [2Л337-1/FactorComplete->False]
Результат будет таким.
Factorlnteger::facfn:
Unable to factor 57238939242563 « 5 1 » 465444456568561. More...
Арифметика: разложение целых чисел на простые множители |
131 |
Зато чуть ниже будут найдены делители.
{{18199,1},{2806537,1},{95763203297,1},{572389392425637497118853974356
80799950268490508661316904465621201465444456568561,1}}
Иными словами,
М337 = 18199X2806537X95763203297X572389392425637497118853974356807999502 68490508661316904465621201465444456568561
Теперь нужно проверить, просты ли найденные делители.
PrimeQ[18199]
True
PrimeQ[2806537]
True
PrimeQ[95763203297]
True
PrimeQ[572389392425637497118853974356807999502684905086613169044656212
0146544445656561]
False
Как видите, все они, за исключением последнего (обозначим его временно через п), самого большого, простые. (Все это заняло менее двух секунд.)
Поскольку 337 — простое число (я опять специально подобрал индекс числа Мерсенна), формулы сокращенного умножения “в лоб” применить не удастся. Но ведь мы можем загрузить пакет теории чисел.
<<NumberTheory'FactorlntegerECM4
Теперь, когда пакет загружен, можно вызвать функцию FactorlntegerECM.
FactorIntegerECM[57238939242563749711885397435680799950268490508661316
90446562120146544445656561]
Мгновенно находится множитель.
726584894969
Давайте проверим, прост ли он.
PrimeQ[726584894969]
True
Оказывается, прост. Поэтому разделим на найденный множитель полученное на предыдущем шаге число, присвоим частное переменной п и проверим, является ли частное простым числом.
п=572389392425637497118853974356807999502684905086613169044656212014 65 44445656561/726584894969
78778047326466742993612420842416198311394008068822475527239136925369
PrimeQ[п] True
Поскольку полученное частное является простым числом, мы нашли все простые множители 337-го числа Мерсенна Л/337 и тем самым разложили и этого числового ве ликана на простые множители.
М337 = 18199x2806537x95763203297x726584894969x78778047326466742993612420 842416198311394008068822475527239136925369
132 |
Гпава 4 |