Прочитав заголовок, вы, возможно, скажете: "Раскладывать дроби на простые множители? Да как же это?! Такой операции в арифметике нет!". Действительно, такой операции вроде бы и нет, но вспомните, как часто приходится раскладывать на простые множители числитель и знаменатель одной и той же дроби. И чтобы вы не мучились, по отдельности вызывая функцию
FactorInteger для числителя и знаменателя, можете вызвать ее для всей дроби. Это ведь так удобно! В каком же виде будет представлено разложение? Почти в том же, что и для целых чисел, но только показатели простых множителей знаменателя будут отрицательными. Вот пример:
Factorlnteger[1952/1921]={{2,5},{17,-1},{61,1},{113,-1}}.
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
' Запятую заменили знаком умножения
Loop While strTemp = ","
And (Response = vbYes)
' Выполняем цикл, пока не обработаем все множители
' или не обнаружим ошибку
If strTemp = "}" Then
' Список должен заканчиваться
' закрывающейся скобкой
(Selection.Delete Unit:=wdCharacter, Count:=1
' Удаляем скобку
Else
Response = MsgBox("***0шибка: в конце списка нет } ... " _
+ Msg, Style, Title)
If Response = vbYes Then
' Пользователь выбрал Yes (Да)
MyString = "Yes"
' Запомним, что выбрал пользователь
Else ' Пользователь выбрал No (Нет)
MyString = "No" .
' Запомним, что выбрал пользователь
End If End If End If
Options.PasteSmartCutPaste" = OptPasteSmartCutPaste
End Sub
Function Multiplier() i
' Обработка множителя (и его степени)
1 Макрос записан 26.10.2003 Яков Шмидский t
Dim strTemp As String
Dim Msg, Style, Title, Help, Ctxt, Response, MyString
Msg = "Хотите продолжить ?"
' Вопрос к пользователю
Style = vbYesNo + vbCritical + vbDefaultButton2
' Кнопки
Title = "Очередной множитель: степень простого"
' Заголовок окна
Response = vbYes ' Пока ошибки не обнаружены
strTemp = Selection.Text
' Выбираем очередной символ
Selection.MoveRight Unit:=wdCharacter,
Count:=l, Extend:=wdExtend
If strTemp = "{" Then
' Если отрывающая скобка - начало множителя
Selection.Delete Unit:=wdCharacter, Count:=1
' Скобку удаляем
Selection.Extend Character:=","
' Расширили выделение до ,
Selection.MoveLeft Unit:=wdCharacter, Count:=1,
Extend:=wdExtend
' Отменили выделение , BaseRepresent
Selection.MoveRight Unit:=wdCharacter, Count:=1
' Основание Selection.MoveRight Unit:=wdCharacter,
Count:=l, Extend:=wdExtend strTemp = Selection.Text
' Основание отделяется , от показателя
If strTemp = "," Then
' Разделитель нашли PowExp
' Обрабатываем показатель
Selection.MoveRight Unit:=wdCharacter, Count:=l, _
Extend:=wdExtend
strTemp = Selection.Text
' Этот символ завершает множитель
If strTemp = "}" Then
' Это должна быть закрывающая скобка
Selection.Delete Unit:=wdCharacter, Count:=1
' -Удалить ее Else
' Но ведь в коде же должна быть закрывающая скобка
Response = MsgBox("***0шибка в сомножителе: нет } ... " _
+ Msg, Style, Title) If Response = vbYes Then
' Пользователь выбрал Yes (Да)
MyString = "Yes"
' Запомним, что выбрал пользователь
Else' Пользователь выбрал No (Нет)
MyString = "No"
' Запомним, что выбрал пользователь
End If End If Else ' Иначе - а где же запятая?
Response = MsgBox("***0шибка в сомножителе: нет , ... " _
+ Msg, Style, Title) If Response = vbYes Then
' Пользователь выбрал Yes (Да)
MyString = "Yes"
' Запомним, что выбрал пользователь
Else ' Пользователь выбрал No (Нет)
MyString = "No"
' Запомним, что выбрал пользователь
End If End If End If
Multiplier = Response End Function
Sub PowExp()
t
' Обработка показателя t
Dim strTemp As String
Selection ..Delete Unit :=wdCharacter, Count :=1
' Удаляем символ
Selection.Extend Character:="}"
' Расширили выделение до }
Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
' Отменили выделение }
strTemp = Selection .'Text
' Это и есть показатель
If strTemp = "1" Then
' Если показатель равен 1
Selection.Delete Unit:=wdCharacter, Count:=l
' Удаляем его Else
' В противном случае форматируем его как надстрочный
With Selection.Font
.Superscript = True 'Надстрочный
End With Selection.MoveRight Unit:=wdCharacter, Count:=1
Selection.Font.Reset 'Восстановить стиль
End If End Sub
Sub BaseRepresent() Dim strTemp As String
strTemp = Selection.Text ' Основание
If Not MultiplierQ(strTemp) Then
' Selection.MoveLeft Unit:=wdCharacter, Count:=l '
Selection.InsertBefore "("
' Перед основанием вставим символ {
Selection.InsertAfter ")"
' А после него вставим символ )
End If
End Sub
Function MultiplierQ(strTemp) ret = True
If Left(strTemp, 1) = "-"
Then ret = False MultiplierQ = ret
End Function
{{-1,n},{2,-1},{-3,-m},{5,-1},{7,-1},{11,-1}, {13,-1},{31,-1},
{61,-1},{2003,1},{5549927,8},{109317926249509865753025015237911,1}}
(-1)nх2-1х(-3)-mх5-1х7-1х11-1х13-1х31-1х
61-1x2003x55499278Х109317926249509865753025015237911
Do:[Print[n,":",Factorlnteger[Numerator[BernoulliB[n]]]],{n,2,102,2}].