книги / Mathematica 5. ╨б╨░╨╝╨╛╤Г╤З╨╕╤В╨╡╨╗╤М
.pdfА р гу м ен т к о м п л е к с н о г о ч и с л а : ф у н к ц и я A rg
Функция Arg [z] возвращает аргумент комплексного числа z.
Вот как, например, можно получить аргументы корней четвертой степени из 1.
{Arg [1] ,Arg [I] ,Arg [-1] ,Arg[-I] }
{О, 2 ' - у }
Возвращаемый угол всегда по абсолютной величине не превосходит тс.
С о п р я ж е н н о е к о м п л е к с н о е ч и с л о : ф у н к ц и я Conjugate
Выражение Conjugate [z] представляет собой сопряженное комплексное число z . Вот как, например, можно получить число, сопряженное к х+l у.
Conjugate[х+I у]
Conjugate[х]-I Conjugate[у]
Заметьте, что х и у предполагаются комплексными.
Резюме
Мы рассмотрели основные числовые системы, предусмотренные в системе Mathematica. Они полностью охватывают классическую математику. Благодаря такому бо гатству система Mathematica может помочь в решении практически любых математи ческих задач. Но благодаря этому же богатству при решении задач можно столкнуться с теми же проблемами, что и в математике. И потому решение исследовательских за дач с помощью системы Mathematica может потребовать основательного знакомства с методологией применения данной системы в конкретной области науки и техники. Конечно, по высказыванию Гаусса, математика — царица всех наук. И потому в пер вую очередь следует освоить именно методологию применения системы Mathematica к решению математических задач. И начнем мы с царицы математики (по выражению того же Гаусса) — с арифметики.
Задачи
Задача 3.1. Постройте график зависимости количества единиц в двоичном пред ставлении п\ от п.
Задача 3.2. Постройте график зависимости от п количества единиц в троичном представлении целой части числа integerPart [3An-Sqrt [3] Лп].
Числа, их представление и операции над ними |
113 |
Глава 4
Арифметика: разложение целых чисел на простые
множители
Вэтой главе...
♦Факторизация целых чисел с помощью функции Factorinteger
♦Факторизация очень больших чисел
♦Резюме
♦Задачи
С задачей о нахождении делителей... дело обстоит гораздо хуже, чем с проверкой простоты. Мы не знаем даже, суще ствует ли вероятностный алгоритм, который выдает за поли номиальное время делитель большого составного числа с ве роятностью > 1/ 2.
Алкивиядис Г. Акритас. Основы компьютерной алгебры с при ложениями. Часть II. Математические основания и основные алгоритмы. Глава 2. Целые числа. §3. Разложение целых чисел на множители. п°2.3.4. Разложение на множители больших целых чисел
Факторизация целых чисел
спомощью функции Factorinteger
Вряде задач очень важно знать, насколько быстро можно разложить целое число на простые множители. По этой причине давайте рассмотрим, какие числа функция Factorinteger может разложить на простые множители за приемлемое время. Ко
нечно, мы не собираемся факторизовать все числа подряд (для этого не хватило бы и многотомного труда), а займемся только классическими последовательностями.
Факторизация чисел Мерсенна
Числами Мерсенна, как известно, называются числа Мп = 2п- \ . Как следует из формулы разложения двучлена ап—ЬГ, они могут быть простыми лишь при простом п. При четном п выражение 2"-1 можно разложить на множители, пользуясь, например,
формулой для разности квадратов. Вот первые три числа Мерсенна: Л/, = 1; М2= 3; д/3= 7. Дальнейшие вычисления поручим системе Mathematica. Для этого напишем программу для разложения чисел Мерсенна, получающихся при и = 1, 2, 3, к.
Сначала давайте решим какой-нибудь конкретный пример. Разложим, например, на множители число МЬ1. Марен Мерсенн в 1644 году высказал мнение, что это число простое. Однако ошибочность этого утверждения была установлена Э. Люка только в 1875 году. Давайте же посмотрим, сколько времени потребуется системе Mathematica, чтобы справиться с более трудной задачей — разложением на простые множители. Итак, вводим запрос
Factorlnteger! 2л67-1 ]
и мгновенно получаем ответ.
((193707721,1),(761838257287,1))
Вот это да! Mathematica почти мгновенно сделала то, на что математикам потребо валось затратить 231 год!
Теперь можем смело приступить к написанию программы. В качестве последнего числа, разлагаемого на множители, выберем M1S7. Именно это число было исследова но М. Б. Крайчиком, который установил, что оно составное. Программа может вы глядеть так:
Dot Print(n,Factorlnteger[2Лп-1]], (n, 257} ]
Однако вывод такой программы выглядит несколько “однолинейно”.
1П
2{{3,1}}
3((7,1)}
4{(3,1),(5,1)}
5((31,1)}
6((3,2),(7,1) }
7((127,1)}
8((3,1),(5,1),(17,1)} 9 ((7,1),(73,1))
10((3,1),(11,1),(31,1)}
11((23,1),(89,1)}
12((3,2),(5,1),(7,1), (13,1)}
13((8191,1)}
14{(3, 1),(43, 1), (127,1))
15((7,1),(31,1), (151,1)}
16((3,1),(5,1),(17,1),{257,1}}
17((131071,1)}
18((3,3),(7,1),(19,1), (73,1)}
19((524287,1)}
20({3,1),(5,2),(11,1),(31,1),(41,1)}
Кроме того, он и читается с трудом. Поэтому для преобразования вывода в при вычную форму лучше всего использовать макрос, написанный на VBA для Word 2002.
Sub Factorization ()
Обработка списка множителей
Арифметика: разложение целых чисел на простые множители |
115 |
Макрос записан 26.10.2003 Яков Шмидский |
|
|
|||||||
Dim strTemp As String |
|
|
|
|
|
|
|
||
Dim Msg, Style, |
Title, Help, Ctxt, Response, MyString, R |
||||||||
Msg = "Хотите продолжить |
?" |
' Вопрос |
|
Кнопки |
|||||
Style = vbYesNo + vbCritical + vbDefaultButton2 |
|||||||||
Title = "Разложение на множители" |
' Заголовок |
окна |
|||||||
Response = vbYes |
|
Пока ошибки не |
обнаружен^ |
|
|||||
Selection.Find.ClearFormatting |
|
Очистка формата |
в поле поиска |
||||||
With Selection.Find |
Что ищем |
|
открывающую скобку |
||||||
.Text = |
"{" |
|
|||||||
.Forward = True |
|
|
|
|
|
|
|
||
.Wrap = wdFindContinue |
|
|
|
|
|
||||
.Format |
= False |
|
|
|
|
|
|
|
|
.MatchCase |
= False |
|
|
|
|
|
|
||
.MatchWholeWord = False |
|
|
|
|
|
||||
.MatchWildcards = False |
|
|
|
|
|
||||
.MatchSoundsLike |
= False |
|
|
|
|
|
|||
.MatchAllWordForms = False |
|
|
|
||||||
End With |
|
|
Находим |
|
открывающую фигурную скобку списка |
||||
Selection.Find.Execute |
|
||||||||
strTemp = Selection.Text |
|
|
|
|
|
обрабатываем список |
|||
If strTemp = "{" |
Then ' Если нашли скобку, |
||||||||
Selection.Delete Unit:=wdCharacter, Count:=1 ' Удаляем скобку |
|||||||||
Do 1 В цикле обрабатываем все элементы списка |
|
||||||||
Response |
= Multiplier |
1 |
Обработка |
множителя и его показателя |
|||||
If Response = vbYes Then |
Unit:=wdCharacter, Count:=1, _ |
||||||||
Selection.MoveRight |
|||||||||
strTemp |
= Selection.Text |
|
|
Extend:=wdExtend |
|||||
Выбираем очередной символ |
|||||||||
If strTemp = |
"," |
Then |
* Это должна быть запятая |
||||||
|
Selection.Delete |
|
Unit:=wdCharacter, Count:=1 |
||||||
|
Selection.Font.Reset |
Сбрасываем |
' Удаляем ее |
||||||
|
форматирование |
||||||||
|
Selection.InsertSymbol |
Font:="Symbol", _ |
|||||||
|
|
CharacterNumber:=-3916, |
Unicode:=True |
||||||
End |
If |
Запятую заменили |
|
|
* Знак умножения |
||||
знаком умножения |
|||||||||
Else |
|
|
|
|
|
|
|
|
|
R = MsgBox("***0шибка: неправильно записан множитель." |
|||||||||
End If |
|
|
|
|
|
|
|
|
+ Msg, Style, Title) |
|
|
"," |
And |
(Response |
= vbYes) |
||||
Loop While strTemp = |
'Выполняем цикл, пока не обработаем все множители или не обнаружим ошибку
If strTemp = "}" Then |
Список должен заканчиваться закр. скобкой |
||||
Selection.Delete Unit:=wdCharacter, Count:=1 ' Удаляем скобку |
|||||
Else |
|
|
|
нет } ... |
_ |
Response = MsgBox("***Ошибка: в конце списка |
|||||
If Response |
= vbYes |
Then |
+ Msg, |
Style, Title) |
|
Пользователь выбрал Yes |
(Да) |
||||
MyString |
= "Yes" |
|
* Запомним, что выбрал пользователь |
116 |
Глава |
|
Else |
|
Пользователь |
выбрал No |
(Нет) |
|
|
пользователь |
|
|||||||||
|
MyString = "No" |
' Запомним, |
что выбрал |
|
||||||||||||||
End |
End If |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
If |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
End If |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
End Sub |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Function Multiplier () |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
i |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Обработка множителя |
(и |
его степени) |
|
|
|
|
|
|
|
|
|
|
||||||
Макрос записан 26.10.2003 Яков Шмидский |
|
|
|
|
|
|
|
|
|
|||||||||
Dim strTemp As String |
|
|
|
|
Response, MyString |
|
|
|
|
|
||||||||
Dim Msg, Style, Title, Help, Ctxt, |
|
|
|
|
|
|
||||||||||||
Msg = "Хотите продолжить |
?" |
' Вопрос к пользователю |
|
|
|
|
|
|||||||||||
Style = vbYesNo + vbCritical + vbDefaultButton2 |
|
1 Кнопки |
|
окна |
|
|||||||||||||
T itle = "Очередной множитель: степень простого" |
|
Заголовок |
|
|||||||||||||||
Response = vbYes |
Пока |
ошибки |
не |
обнаружены |
|
|
|
|
|
|
|
|
||||||
Selection.MoveRight |
Unit:=wdCharacter, |
Count:=1, Extend:=wdExtend |
|
|||||||||||||||
strTemp = Selection.Text |
' Выбираем очередной |
символ |
|
|
|
|
|
|||||||||||
If strTemp = "{" Then ' Если открывающая скобка - начало множителя |
|
|||||||||||||||||
Selection.Delete |
Unit:=wdCharacter, Count:=1 |
* Скобку удаляем |
|
|||||||||||||||
Selection.MoveRight |
Unit:=wdWord, Count:=1, |
Extend:=wdExtend |
|
|||||||||||||||
Selection.MoveRight Unit:=wdCharacter, Count:=1 ' Основание |
|
|||||||||||||||||
Selection.MoveRight |
Unit:=wdWord, 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 |
' Это должна |
быть |
|
закрывающая |
скобка |
|
|||||||||||
|
Selection.Delete Unit:=wdCharacter, Count:=1 1 удалить ее |
|||||||||||||||||
|
Else |
' Но ведь в конце же должна |
быть |
закрывающая скобка |
__ |
|||||||||||||
|
Response |
= MsgBox("***Ошибка |
в сомножителе: нет |
} ... |
||||||||||||||
|
If Response = vbYes Then |
|
|
|
|
+ Msg, |
Style, |
Title) |
|
|||||||||
|
Пользователь выбрал |
Yes (Да) |
|
|||||||||||||||
|
Else |
MyString = "Yes" ' Запомним, что выбрал |
пользователь |
|
||||||||||||||
|
1 Пользователь |
выбрал No |
(Нет) |
|
пользователь |
|
||||||||||||
|
End |
MyString = "No" |
1 |
Запомним, |
что |
выбрал |
|
|||||||||||
|
If |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
End |
If |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Else ' Иначе - а где же запятая? |
|
|
|
|
|
|
, ... |
_ |
|
|||||||||
|
Response |
= MsgBox("***Ошибка в сомножителе: нет |
|
|||||||||||||||
|
If Response = vbYes Then |
|
|
|
|
|
|
+ Msg, |
Style, |
Title) |
||||||||
|
|
Пользователь выбрал Yes |
(Да) |
|
||||||||||||||
|
MyString |
= "Yes" |
’ Запомним, что |
выбрал пользователь |
|
|||||||||||||
|
Else |
|
' Пользователь выбрал No (Нет) |
выбрал |
пользователь |
|
||||||||||||
|
MyString |
= "No" |
' Запомним, |
что |
|
|||||||||||||
End |
End |
If |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
If |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Else |
Иначе |
а где |
же |
открывающая скобка |
? |
|
|
|
|
|
_ |
|
|
|||||
Response |
= MsgBox("***Ошибка |
в сомножителе: нет { ... |
Title) |
|||||||||||||||
If Response |
- vbYes |
Then |
|
|
Пользователь |
|
+ Msg, |
Style, |
||||||||||
|
|
выбрал |
Yes (Да) |
|
|
Арифметика: разложение целых чисел на простые множители |
117 |
|
MyString = "Yes" |
Запомним, |
что |
выбрал |
пользователь |
|||
|
Else |
' Пользователь выбрал No (Нет) |
выбрал |
пользователь |
||||
|
MyString = "No" |
* Запомним, |
что |
|||||
|
End If |
|
|
|
|
|
|
|
End |
If |
= Response |
|
|
|
|
|
|
Multiplier |
|
|
|
|
|
|||
End |
Function |
|
|
|
|
|
|
|
Sub |
PowExp() |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
Обработка |
показателя |
|
|
|
|
|
||
Dim |
strTemp As String |
|
|
|
|
|
||
Selection.Delete Unit:=wdCharacter, Count:=1 |
Удаляем символ |
|||||||
Selection.MoveRight |
Unit:=wdWord, 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 |
Unit:=wdCharacter, |
Count:=1 |
|
||||
Selection.MoveRight |
|
|||||||
End |
Selection.Font.Reset |
’Восстановить |
стиль |
|
|
|||
If |
|
|
|
|
|
|
|
|
End |
Sub |
|
|
|
|
|
|
|
Этот макрос преобразует разложение
{{3,3),{5,1},{7,1},(13,52),{17,1},{19,551},{37,1},{73,1},{109,1},
{241,1},{433,1},{38737,1}}
к более привычному виду:
3 3х5х7х 1352х 17х 19551х37х73х Ю9х24 1X 433X38737
Теперь можем воспользоваться созданной программой и составить таблицу разло жения чисел Мерсенна на простые множители (табл. Б. 10).
Довольно интересно наблюдать за тем, как Mathematica составляет эту таблицу. Первая сотня чисел Мерсенна разлагается практически мгновенно. Незначительные задержки происходят только на второй сотне. Интересно отметить, что эти задержки в пределах второй сотни происходят и при составных л, т.е. в случаях, когда человек воспользовался бы уже вычисленными ранее разложениями. Это свидетельствует о том, что Mathematica в данном случае не пользуется формулой разности степеней. Впрочем, первая существенная задержка происходит только при значении п - 221 (простое). Однако почти сразу же за ней Mathematica сталкивается с рядом незначи тельных трудностей, которые она быстро преодолевает, но при п = 251 (простое) про исходит вторая существенная задержка. Однако поистине удивительно, что самая су щественная задержка происходит, казалось бы, в очень простом случае — при п = 254. Ведь при этом значении п число Мерсенна представляет собой разность квадратов, так что фактически число сразу разлагается на множители, которые только на едини цу отличаются от корня квадратного из исходного числа. Так что количество цифр в подлежащих разложению числах фактически на первом же шаге уменьшается вдвое! Кроме того, одно из этих чисел представляет собой число Мерсенна Л/127, которое утке было разложено на множители ранее (точнее, была установлена его простота). Однако если пропустить это число, то разложения М255и Л/256получаются достаточно быстра
118 |
Глава 4 |
Л вот чтобы на нынешних ПК средней мощности разложить число М. Б. Крайчика (Д/257)прямым применением функции Factorlnteger, придется подождать несколько
часов.
Давайте теперь обсудим, почему все же для системы Mathematica разложить число Крайчика проще, чем Л/254. Дело в том, что хотя по формуле разности квадратов М25А= Мп7х(2127+1), система Mathematica об этом не подозревает, и потому она долж на сначала найти множитель Л/127, а затем доказать его простоту. Кроме того, нужно еще разложить на множители число 2127+1. Это, правда, чуть легче, поскольку очевид но, что оно делится на 3. Впрочем, необходимость в разложении чисел вида 2"+1 в теории кодирования возникает столь часто, что стоит испробовать возможности сис темы и в этом случае.
факторизация чисел вида 2л+1
Среди чисел вида 2л+1 простые, можно сказать, почти не встречаются, ведь число такого вида может быть простым только тогда, когда п является степенью двойки: п = 2*. Такие числа называются числами Ферма:
Fn= 2r + 1.
Пьер Ферма утверждал, что все такие числа просты. Однако Л. Эйлер установил, что f5= 232+1 делится на 641. Давайте попытаемся составить таблицу разложения чисел вида 2л+1 на простые множители. В свое время (70-е годы прошлого столетия) Дональду Кнуту удалось исхитриться и с помощью тождества 22l4+l = (2107—254+ 1) (2107+254+1) и мощного (для того времени) компьютера факторизовать это число. Давайте попробуем и мы. Вот необходимая программа.
Do[ Print[n, Factorlnteger[2An+l]], {n, 214} ]
Даже на весьма слабеньком компьютере построение нужной нам таблицы занимает всего лишь несколько минут (табл. Б.И).
Да, результат очень даже впечатляет! Но давайте вспомним, что эта таблица нам понадобилась потому, что (с точки зрения компьютера!) у нас не хватило терпения дождаться разложения числа М254 прямым применением функции Factorlnteger. Теперь мы без труда можем написать нужное нам разложение.
М254 = 3x5671372782015641057722 9101238 6280352 43xAfi27.
Факторизация чисел вида 2л-7
Наряду с разложениями чисел Мерсенна и чисел вида 2л+ 1, представляет интерес также факторизация чисел вида 2л-7. Так как эти числа будут натуральными только при п > 2, то в программу нужно вставить начальное значение л, равное 3. Поэтому программа будет иметь следующий вид:
Do[ Print[n, Factorlnteger[2лп-7]], {n, 3, 50} ]
Даже на весьма слабеньком компьютере построение нужной нам таблицы занимает всего лишь несколько секунд (табл. Б. 12).
Как видим, при 3<л<50 среди чисел вида 2л—7 простое только одно, соответствую щее значению п = 39. Заметные задержки (несколько секунд) при факторизации чи сел такого вида возникают лишь при л>200.
Арифметика: разложение целых чисел на простые множители |
119 |
Факторизация чисел, десятичная запись которых состоит из п единиц
До сих пор мы изучали быстродействие функции Factorlnteger на аргументах, близких к 2я. В двоичной системе счисления запись таких чисел содержит много нулей или единиц подряд. Число Мерсенна Мп, например, записывается л единицами, а число 2я+1 — двумя единицами, между которыми стоит л—1 нуль (рассматриваем слу чай л > 0). Поэтому может показаться, что функция Factorlnteger столь эффектив на лишь для чисел, которые имеют специальный вид в двоичной системе счисления. Поэтому давайте изучим возможности этой функции по факторизации больших чисел видов, более случайных с точки зрения теории чисел. Попытаемся разложить, напри мер, числа, десятичная запись которых представляет собой повторение одной и той же цифры л раз. Конечно, если л = 1, то эта цифра повторяется только один раз, и вопрос о разложении решается в уме. С другой стороны, даже если п > 1, то, разделив такое число на ту цифру, которая повторяется л раз, получим число, десятичная за пись которого состоит из л единиц. Так что для факторизации чисел такого вида дос таточно иметь таблицу разложения чисел, десятичная запись которых состоит из п единиц. Обозначим это число через 1Л. Как задать такое число? Как легко видеть, число, десятичная запись которого состоит из л девяток, равно 10я—1. Разделив это число на 9, получим число, десятичная запись которого состоит из л единиц: (10я-1)/9. Таким образом, мы убедились, что
(10я-1)/9 = 1Л= 111............................ 111 (л единиц).
Заметим сразу, что такие числа могут быть простыми лишь в том случае, если ко личество единиц л в записи такого числа — простое. Действительно, если п = т к, то такое число делится как на число, состоящее из т единиц, так и на число, состоящее из к единиц. Короче говоря, т | л => \т | 1Л. (Убедиться в этом очень легко, мысленно выполнив деление “столбиком”.)
Теперь несложно написать нужную нам программу.
Do[Print[n," : Factorlnteger[(10Лп-1)/9]],{п,70}]
Результат приведен в виде таблицы (табл. Б. 13).
В пределах таблицы простых чисел совсем немного, они получаются лишь при л = 2, 19 и 23. Поэтому при всех четных л число 1 имеет И в качестве простого мно жителя. Несколько сложнее увидеть, что 3*|л=>3*| 1„- (Например, все числа вида \и
делятся на 3, это следует из школьного признака делимости на |
3. Аналогично обстою |
дело и с числами вида 19/п.) Это следует из того, что 3*| 13* |
Как видим, используя |
таблицу факторизации чисел вида 1Л, составленную с помощью простой программы, совсем несложно подметить простейшие закономерности в разложении данных чисел.
Факторизация чисел вида 10л+1
Теперь, следуя логике изучения чисел, близких к 2я, построим таблицу факториза ции чисел вида 10я+1. В десятичной системе счисления запись таких чиёел начинает ся и заканчивается единицей, а между этими единицами стоят нули:
10я-И = 1000............................ |
00001 (л-1 нулей). |
Вспоминая формулы суммы степеней, сразу замечаем, что такие числа могут быв простыми лишь в том случае, если л является степенью двойки, т.е. если л = 2‘. (При нечетных л, все такие числа делятся, например, на сумму оснований, т.е. на II)
120 |
Глава |
Вот программа, которая строит нужную нам таблицу.
Do[Print[n,FactorInteger[10Лп+1]],{n, 70} ]
Результат приведен в виде таблицы (табл. Б. 14).
Факторизация чисел Фибоначчи
Давайте теперь рассмотрим несколько иной пример. Попытаемся факторизовать числа такой последовательности, которая не может рассматриваться как некоторое тривиальное изменение последовательности ап с целым основанием а. В качестве та кой последовательности можем выбрать, например, последовательность Фибоначчи. Напомним, что последовательность Фибоначчи рекуррентно определяется так:
^ 1 “ ^ 2 = ^л + 2 = Fn+ 1 + Fn-
Если F„ — простое, то либо п = 4, либо п — простое. Теперь построим таблицу факторизации чисел Фибоначчи.
Для этого напишем программу, в которой предусмотрим вывод не только разложе ния числа Фибоначчи, но и самого числа.
Do [Print[n, " Fibonacci[n]], "
FactorInteger[Fibonacci[n]]],{n,270}]
Результат приведен в виде таблицы (табл. Б. 15).
Данная таблица недаром содержит числа Фибоначчи Fnдля п вплоть до 300. Дело в том, что до 1963 года (а это совсем недавно с точки зрения многотысячелетней исто
рии теории чисел) было известно, что числа Фибоначчи F„ являются |
простыми для |
и = 3, *4, 5, 7, 11, 13, 17, 23, 29, 43, 47. Упорные же поиски других |
простых чисел |
Фибоначчи в то время никаких результатов не дали. Так что с этой точки зрения на ша таблица содержит несколько совсем нетривиальных открытий!
Факторизация дробей
Прочитав заголовок, вы, возможно, скажете: “Раскладывать дроби на простые мно жители? Да как же это?! Такой операции в арифметике нет!” Действительно, такой операции вроде бы и нет, но вспомните, как часто приходится раскладывать на про стые множители числитель и знаменатель одной и той же дроби. И чтобы вы не му чились, по отдельности вызывая функцию Factorlnteger для числителя и знамена теля, можете вызвать ее для всей дроби. Это ведь так удобно! В каком же виде будет представлено разложение? Почти в том же, что и для целых чисел, но только показа тели простых множителей знаменателя будут отрицательными. Вот пример:
Factorlnteger[1952/1921] = {{2,5},{17,-1},{61,1},{113,-1}}.
Давайте же теперь испытаем функцию Factorlnteger в новой роли:
Do[Print[n, |
Factorlnteger[BernoulliB[n]]], {n,2, 102, 2}] |
Результат, как обычно, представим в виде таблицы. Однако оказывается, что раз работанный ранее макрос для преобразования разложения в обычную форму уже не годится. Ведь теперь основания (да и сами показатели) степеней могут быть отрица тельными. Поэтому в таких случаях основания нужно взять в круглые скобки. Это уч тено в новом макросе.
Sub Factorization()
I
Обработка списка множителей Макрос записан 26.10.2003 Яков Шмидский
Арифметика: разложение целых чисел на простые множители |
121 |
Dim strTemp As String |
|
|
|
|
|
|
|
|
||
Dim Msg, Style, Title, Help, Ctxt, Response, MyString |
|
|
||||||||
Msg = "Хотите продолжить |
?" |
1 |
Вопрос |
|
Кнопки |
|||||
Style = vbYesNo + vbCritical |
+ ybDefaultButton2 |
|||||||||
Title = "Разложение на множителй" |
* Заголовок |
окна |
|
|
||||||
OptPasteSmartCutPaste |
= Options.PasteSmartCutPaste |
|
|
|||||||
Options.PasteSmartCutPaste = False |
|
|
|
|
||||||
Response = vbYes |
|
Пока ошибки не обнаружены |
|
|
|
|||||
Selection.Find.ClearFormatting |
Очистка формата |
в поле |
|
поиска |
||||||
With Selection.Find |
Что |
ищем - открывающую скобку |
|
|
||||||
.Text = |
"{" |
|
|
|||||||
.Forward |
= True |
|
|
|
|
|
|
|
||
.Wrap = wdFindContinue |
|
|
|
|
|
|||||
.Format |
= |
False |
|
|
|
|
|
|
|
|
.MatchCase |
= |
False |
|
|
|
|
|
|
||
.MatchWholeWord = |
False |
|
|
|
|
|
||||
.MatchWildcards = |
False |
|
|
|
|
|
||||
.MatchSoundsLike |
= False |
|
|
|
|
|
||||
.MatchAllWordForms = False |
|
|
|
|
||||||
End With |
|
|
|
Находим открывающую фигурную скобку списка |
||||||
Selection.Find.Execute |
||||||||||
strTemp = Selection.Text |
|
нашли скобку, |
обрабатываем |
|
список |
|||||
If strTemp = "{" |
Then |
' Если |
|
|||||||
Selection.Delete Unit:=wdCharacter, Count:=1 ' Удаляем скобку |
||||||||||
Do ' В цикле обрабатываем все элементы списка |
его показателя |
|||||||||
Response |
= Multiplier |
' Обработка |
множителя и |
|||||||
Selection.MoveRight Unit:=wdCharacter, Count:=1, |
_ |
|||||||||
strTemp |
= |
Selection.Text |
|
|
Extend:=wdExtend |
|||||
Выбираем очередной символ |
||||||||||
If strTemp |
= |
"," |
Then |
* Это должна быть запятая |
|
Удаляем ее |
||||
Selection.Delete |
Unit:=wdCharacter, |
Count:=1 |
||||||||
Selection.Font.Reset |
' Сбрасываем форматирование |
|||||||||
Selection.InsertSymbol Font:="Symbol", _ |
Знак умножения |
|||||||||
CharacterNumber:=-3916, Unicode:=True |
||||||||||
End If ' Запятую заменили знаком умножения |
|
|
||||||||
Loop While strTemp = |
"," |
And |
(Response |
= vbYes) |
|
|
'Выполняем цикл, пока не обработаем все множители или не обнаружим ошибку
, |
If |
strTemp = |
"}" Then |
Список должен заканчиваться |
|
|||
|
|
|
|
' закрывающейся скобкой |
скобку |
|||
! |
|
Selection.Delete Unit:=wdCharacter, Count:=1 |
* Удаляем |
|||||
|
Else |
= MsgBox("***Ошибка: в конце списка |
нет ) ... |
_ |
||||
|
|
Response |
||||||
|
|
If Response |
= vbYes |
Then |
+ Msg, |
Style, Title) |
||
|
|
Пользователь выбрал Yes |
(Да) |
|||||
|
|
MyString |
= "Yes" |
' Запомним, что выбрал пользователь |
||||
|
|
Else |
' Пользователь выбрал |
No (Нет) |
пользователь |
|||
|
|
MyString |
= "No" |
' Запомним, что выбрал |
||||
|
End |
End If |
|
|
|
|
|
|
End |
If |
|
|
|
|
|
|
|
If |
|
|
|
|
|
|
|
Options.PasteSmartCutPaste = OptPasteSmartCutPaste
122 |
Гпава |