Факторизация дробей
Прочитав заголовок, вы, возможно, скажете: "Раскладывать дроби на простые множители? Да как же это?! Такой операции в арифметике нет!". Действительно, такой операции вроде бы и нет, но вспомните, как часто приходится раскладывать на простые множители числитель и знаменатель одной и той же дроби. И чтобы вы не мучились, по отдельности вызывая функцию FactorInteger для числителя и знаменателя, можете вызвать ее для всей дроби. Это ведь так удобно! В каком же виде будет представлено разложение? Почти в том же, что и для целых чисел, но только показатели простых множителей знаменателя будут отрицательными. Вот пример:
Factorlnteger[
1952
/
1921
]
=
{{
2.5
},{
17
,
-
1
},{
61.1
},{
113
,
-
1
}}
Давайте же теперь испытаем функцию FactorInteger в новой роли:
Do[Print[n,
":"
, Factorlnteger[BernoulliB[n]]], {n,
2.102.2
}]
Результат, как обычно, представим в виде таблицы. Однако оказывается, что разработанный ранее макрос для преобразования разложения в обычную форму уже не годится. Ведь теперь основания (да и сами показатели) степеней могут быть отрицательными. Поэтому в таких случаях основания нужно взять в круглые скобки. Это учтено в новом макросе.
Sub
Factorization()
'Обработка списка множителей
Dim
strTemp
As
String
Dim
Msg, Style, Title, Help, Ctxt, Response, MyString
Msg =
"Хотите продолжить?"
' Вопрос
Style = vbYesNo + vbCritical + vbDefaultButton2
'Кнопки
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
.MatchAllWordForm? =
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, Extend: = wdExtend
strTemp = Selection.Text
' Выбираем очередной символ
If
strTemp =
","
Then
' Это должна быть запятая
Selection.Delete Unit: = wdCharacter, Count: = 1
' Удаляем ее Selection.Font.Reset
' Сбрасываем форматирование
Selection.InsertSymbol Font: =
"Symbol"
, _
CharacterNumber: = - 3916,
Unicode
: =
True
' Знак умножения
End
If
' Запятую заменили знаком умножения