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

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

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

А р гу м ен т к о м п л е к с н о г о ч и с л а : ф у н к ц и я 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 = (2107254+ 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

Гпава