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

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

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

End 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х 1071099х 1138х1277х 1317х 1377х 1397х 14 9бх 151бх 157бх 1636х1675х1735х 1795х 1815х 1911935х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х4574612х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 787x797x80811x821x823x827x829x839x853x857x 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