Данная статья посвящена, в основном, дробям (цепным дробям) и приближениям к иррациональным числам (в частности, приближениям к золотому сечению). Попутно затрагиваются вопросы, связанные с решением квадратных уравнений и построению "золотых" фигур.
Рассмотрим алгоритмическое решение задачи №38 из книги "Задачи для детей от 5 до 15 лет"
Вычислить сумму:
Ниже представлен алгоритм для вычисления частичных сумм этого ряда на языке Scheme Lisp в среде drRacket (Scheme позволяет производить вычисления в обыкновенных дробях):
#lang racket
(define series_sum ( lambda (n) (if (= n 0) 0
(+ (/ 1 (* n (+ n 1))) (series_sum(- n 1))) ) ) )
(series_sum 10)
(series_sum 100)
(series_sum 1000)
(series_sum 10000)
(series_sum 100000)
(series_sum 1000000)
Два последних примера drRacket вычислил с ошибкой
Эту программу можно запустить в online ide ideone.com и codepad.org.
Решение представлено как в обыкновенных, так и в периодических десятичных дробях. Кстати, чтобы перевести периодическую десятичную дробь в обыкновенную, необходимо данную дробь принять за
Далее необходимо данное равенство умножить на , где равняется периоду десятичной дроби и вычесть из данного равенства предыдущее
Этот же алгоритм на Python
Ссылка на ideone.com
def series_sum(n):
if n==0:
return 0
else:
return 1.0/(n*(n+1.0))+series_sum(n-1.0)
print(series_sum(10))
print(series_sum(100))
Если рассмотреть частичные суммы в обыкновенных дробях, то можно заметить, что сумма ряда равна
Напомню, что
Решение, использующее теорему Штольца
Эту задачу можно встретить в различных книгах, посвященных математической индукции.
1.При гипотеза верна, так как
2.Предположим, что гипотеза верна и для n=k, т.е. что
где - некоторое натуральное число. Установим справедливость и при
Общий случай
Во втором томе "Курса дифференциального и интегрального исчисления" 363.4 рассматривается общий случай
Рассмотрим ещё один пример из задачника
43. Числа кроликов "Фибоначчи", образуют последовательность
в которой для всякого n = 1, 2, ... Найти наибольший общий делитель чисели .
Ответ: Два соседних числа Фибоначчи взаимно просты, т.е.
НОД-это Наибольший Общий Делитель.
"Доказательство из книги "За страницами учебника математики" 10-11
Из равенства следует, что . Пятясь таким образом назад, придём к , а потому два соседних числа Фибоначчи взаимно просты.
Поясню, что по алгоритму Евклида, поскольку где - остаток от деления на , то в данном конкретном случае поскольку
Кстати, по теореме Гаусса: "если число является НОД двух чисел и , то справедливо равенство , где и являются целыми числами"
Если вместо чисел и подставить соседние числа Фибоначчи, то получим тождество Кассини
Нетрудно заметить, что числа и тоже удовлетворяют условию взаимной простоты.
Эту теорему можно применить для решения задачи об алхимике и свечах из статьи "История поиска длиной в 15 лет" по ссылке
###
Приближения к золотому сечению
В следующей задаче необходимо вычислить золотое сечение,
Это соотношение сторон открытки, остающейся себе подобной при отрезании квадрата, стороной которого является меньшая сторона открытки. Обычно обозначается прописной греческой буквой (фи), в честь древнегреческого скульптора и архитектора Фидия, реже — греческой буквой (тау).
53. Для последовательности чисел Фибоначчи задачи 43 найти предел отношения
при стремлении к бесконечности:
Рассмотрим отрезки, представляющие собой разности двух соседних членов ряда
Четные члены ряда представляют растущую последовательность
Нечетные члены ряда представляют убывающую последовательность
По лемме о вложенных промежутках "Курс дифференциального и интегрального исчисления"
Для нашего ряда в точке справедливо равенство
Разделив на , получим уравнение
Произведя замену получим квадратное уравнение
Решение этого уравнения рассматривается в конце статьи.
Если в программе geogebra соединить дугами окружности точки 2 и , и , и и т.д. - получим самоподобную фигуру
Для сравнения
Вообще, существует стандартный алгоритм вычисления чисел Фибоначчи на Python. Этот алгоритм представлен на сайте Python.org
def fib(n):
a, b = 0, 1
while a < n:
print(a)
a, b = b, a+b
fib(100)
Изменим данный алгоритм так, чтобы он выводил на печать приближения к золотому сечению. Для двух соседних чисел a и b будем сумму a+b делить на b
def fib(n):
a, b = 0.0 , 1.0
while a < n:
print((a+b)/b)
a, b = b, a+b
fib(100)
На двенадцатом шаге получим приближение, равное 1.61805 Проверить можно по ссылке
А само золотое сечение можно использовать для вычисления n-ого числа Фибоначчи.
Формула Бине выражает в явном виде значение Fn как функцию от n:
Сразу можно заметить, что второе слагаемое всегда меньше единицы при любом целом неотрицательном . Поэтому, зная, что формула Бине даёт целые числа, можно утверждать, что
где квадратные скобки [...] обозначают округление заключенного в них числа до ближайшего целого.
А из этого следует, что для соседних чисел Фибоначчи справедливо равенство
В первом томе монографии Дональда Кнута "Искусство программирования" есть задача, использующая это соотношение:
Вычислить, чему равно
На Хабре есть статья, где рассматриваются 5 способов вычисления чисел Фибоначчи, в том числе формула Бине.
Далее, если в уравнении в правой части заменить x на то получим
Продолжая производить замены, придём к представлению золотого сечения в виде цепной дроби
Ниже представлен алгоритм Python для вычисления приближений к золотому сечению, использующий эту форму (форму бесконечной цепной дроби)
arr=[1.0]
def foo(a):
b=1.0+1.0/(1.0+1.0/a[len(a)-1])
return b
arr.append(foo(arr)) #первый шаг
arr.append(foo(arr)) #второй шаг
arr.append(foo(arr)) #третий шаг
print (arr)
На десятом шаге получим приближение, равное 1.618033985
В книге «Задачи для детей от 5 до 15 лет» есть похожий пример 54. Вычислить бесконечную цепную дробь
Решение. Рассмотрим уравнение
Согласно теоремам 236 и 235 из книги "Теория чисел":
Составляем таблицу значений и при
1 |
2 |
|
---|---|---|
P |
1 |
3 |
Q |
1 |
2 |
так что
и поскольку то
Золотое сечение может быть представлено в виде бесконечно вложенных радикалов
В некоторых случаях бесконечно вложенные радикалы могут быть тождественны некоторому рациональному числу, например выражение
равно 2.
Для того, чтобы это увидеть, возведем обе части выражения в квадрат и отнимем число 2:
где Очевидно, что не может являться значением исходного радикала.
Вообще, тоже равняется 2
>>> def foo(n,a):
... temp=a
... while(n>0):
... a=temp*(a**0.5)
... n=n-1
... return a**0.5
...
>>> foo(50,2)
1.9999999999999993
Кстати, Рамануджан установил некоторые зависимости между бесконечно вложенными радикалами и рациональными числами
поскольку
Золотое сечение можно представить в виде бесконечно вложенных радикалов таким образом:
Попробуйте самостоятельно установить справедливость данного тождества.
Данное выражение является частным случаем варианты
Курс дифференциального и интегрального исчисления, 35 (2):
"Таким образом получается из по формуле
...По основной теореме, варианта имеет некий конечный предел
Для определения его перейдём к пределу в равенстве
Мы получим, таким образом, что удовлетворяет квадратному уравнению Уравнение это имеет корни разных знаков; но интересующий нас предел не может быть отрицательным, следовательно, равен именно положительному корню:
Значит "золотое сечение" является решением уравнения при
Далее в "Курсе дифференциального и интегрального исчисления" (353) рассматривается алгоритм вычисления обратного числа (такого числа 1/с, произведение которого на данное число с равно единице)
Пусть - любое положительное число, и положим . Написанное выше рекуррентное соотношение заменится таким:
Взяв начальное значение под условием: , получим, что , монотонно возрастая, будет стремиться к
По этой схеме на счётных машинах и вычисляется число, обратное
.Ниже представлен алгоритм вычисления числа, обратного числу на языке Python:
( Ideone.com и codepad.org)
def reciprocal(c,y0,n):
arr=[]
for i in range(n):
arr.append(y0)
y0=y0*(2-c*y0)
return arr
Функция reciprocal принимает на вход число , начальное значение , количество итераций и возвращает массив приближений к числу
При
При
При
print reciprocal(3,0.1,5)
#[0.1, 0.17, 0.2533, 0.31411733000000003, 0.332225568981013]
print reciprocal(5,0.1,5)
#[0.1, 0.15000000000000002, 0.18750000000000003, 0.19921875000000003,0.19999694824218753]
print reciprocal(8,0.1,5)
#[0.1, 0.12, 0.1248, 0.12499968, 0.1249999999991808]
Геометрическая интерпретация
Для приближенного вычисления обратного числа будем использовать метод касательных из книги "Digital Arithmetic".
Производной функции является
Касательными к гиперболе являются функции вида
Вывод уравнения касательной
Уравнение прямой:
Уравнение прямой, проходящей через точку с координатами
Вычтем из уравнения (I) уравнение (II):
Так как угловой коэффициент касательной к графику дифференцируемой функции в точке с абсциссой равен , то уравнение касательной принимает вид
Подставляя числа вместо получим уравнения касательных
Построим эти графики
Если сдвинуть гиперболу вниз на , то она пересечёт ось абсцисс в точке
Уравнение касательной преобразуется в
Далее, приравняв уравнение касательной к нулю и выразив , получим
Вместо подставим
Вместо подставим
Получим выражение
Раскрыв скобки, получим
Подставим в уравнение и посмотрим, какие значения будет "пробегать"
При получим (примерные значения)
Подставив эти значение в уравнение
получим касательные, приближающиеся к
Извлечение квадратного корня
Существует несколько методов для приближенного вычисления вычисления приближений квадратного корня из натурального числа.
Например алгоритм, использующий итерационный метод Герона выглядит так
def square_root(a,n): # a - подкоренное значение, n - количество циклов
x0=1 # первое приближение равно 1
arr=[]
for i in range(n):
arr.append(x0) # добавляем к массиву новые приближения
x0=0.5*(x0+a/x0) # вычисляем приближения по формуле Герона
return arr
print square_root(2,10)
Вычисление квадратного корня с помощью цепных дробей использовал Рафаэль Бомбелли
Чтобы найти значение , сначала определим его целое приближение: , где . Тогда . Отсюда несложно вывести, что
.
Повторно подставляя полученное выражение в формулу , мы получаем разложение в цепную дробь:
Значит можно записать алгоритм извлечения квадратного корня из натурального числа, используя разложение в цепную дробь
arr=[]
def square_root(n,a,n_count): # n-подкоренное значение, a - целая часть корня
x0=a # первое приближение равно a
global arr
for i in range(n_count): # результат будет больше искомой величины на a
arr.append(x0-a) # вычитаем a
x0=2*a+(n-a*a)/x0
square_root(2.0,1.0,10)
print(arr[9])
#Output: 1.4142139267767408
Для приближенного вычисления золотого сечения вычислим, чему равен , прибавим к этому значению единицу и разделим получившееся число пополам
def square_root(n,a,n_count): # n-подкоренное значение, a - целая часть корня
x0=a # первое приближение равно a
arr=[]
for i in range(n_count): # результат будет больше искомой величины на a
arr.append(x0-a) # вычитаем a
x0=2*a+(n-a*a)/x0
return arr
print((square_root(5.0,1.0,10)[9]+1.0)/2.0)
#Output: 1.61842105263
Способ выделения целой части позволяет представить иррациональное число в виде бесконечной цепной дроби с единицами в числителях частыми числителями, равными единице. Вот пример разложения в цепную дробь числа из книги "Алгебра"
Таким образом,
Выделим целую часть числа . Значит, можно представить в виде . Ясно, что , поэтому . Снова уничтожим иррациональность в числителе второго слагаемого:
В итоге получилось:
Проделаем еще один аналогичный шаг:
Нетрудно заметить, что процесс выделения целой части и образования цепной дроби в данном примере не имеет конца. В каждом новом знаменателе будет появляться и слагаемое . Поэтому ясно, что представляется в виде бесконечной цепной дроби:
Гипотеза
Если , то цепная дробь числа чисто периодическая. Эту гипотезу доказал Эварист Галуа.
Т.е. если к непериодической части дроби прибавить целую часть , то получится чисто периодическая дробь
Вычисление в облаке WolframAlpfa
Если в разложении корня по методу Бомбелли
к первому слагаемому прибавить , получим чисто периодическую дробь
Остаётся привести дробь к более привычному виду с единицами в числителе. Разделим числитель и знаменатель дроби на и получим выражение
Таким образом display \sqrt{2}+1 = 2+ \frac{1}{\frac{2}{1} + \frac{1}{2 + \frac{1}{\frac{2}{1}+...} } } =2,2,2,... display display \sqrt{3}+1 = 2+ \frac{1}{\frac{2}{2} + \frac{1}{2 + \frac{1}{\frac{2}{2}+...} } } =2,1,... display display \sqrt{5}+2 = 4+ \frac{1}{\frac{4}{1} + \frac{1}{4 + \frac{1}{\frac{4}{1}+...} } } =4,4,4,... display display \sqrt{6}+2 = 4+ \frac{1}{\frac{4}{2} + \frac{1}{4 + \frac{1}{\frac{4}{2}+...} } } =4,2,... display display \sqrt{13}+3 = 6+ \frac{1}{\frac{6}{4} + \frac{1}{6 + \frac{1}{\frac{6}{4}+...} } } =6,\frac{3}{2},... display Напишем программу, вычисляющую приближение цепной дроби inline 6,\frac{3}{2},... inline
#lang racket define continued_fraction ( lambda (n if (= n 0 1 + 6 (/ 1 (+ 3/2 (/ 1 (continued_fraction(- n 1))))) ))) continued_fraction 4 codepad.org На четвёртом шаге получаем inline 6\frac{3818}{6305} inline, что равно inline 6,6055511...inline в то время как inline \sqrt{13}+3 \approx 6.6055512... inline.
Уравнения Пелля
Приближения к квадратному корню можно искать с помощью уравнений Пелля.
"Пусть натуральное число не является квадратом. Легко видеть, что не выражается отношением натуральных чисел, т.е. не существует такой обыкновенной дроби , что
Другими словами, если натуральное число не является точным квадратом, то уравнение
не имеет решения в натуральных числах. Попытаемся в этом случае выразить отношением натуральных чисел приближённо.
Если , то
Самое близкое к нулю натуральное число — это единица. Поэтому дело сводится к решению в натуральных числах диофантова уравнения
которое носит название… уравнения Пелля."
Пояснение
Число, которое не может быть представлено в виде обыкновенной дроби ,где - целые числа, называется иррациональным.
В статье, посвящённой квадратному корню из двух приводится доказательство иррациональности этого числа:
Допустим противное: рационален, т.е. представим в виде несократимой дроби , где m-целое число, а n-натуральное число. Возведём предполагаемое равенство в квадрат:
Отсюда следует, что чётно, значит, чётно и . Пускай , где целое. Тогда
Следовательно, чётно, значит, чётно и . Мы получили, что и чётны, что противоречит несократимости дроби
Значит, исходное предположение было неверным, — иррациональное число.
Это означает (по Аристотелю), что
Диагональ квадрата несоизмерима с его стороной, так как если предполагать их соизмеримость, то нечётные числа равны чётным.
Доказательство иррациональности корня из простого числа следующее
Предположим, что существует несократимая дробь , такая что
Тогда,
Если входит в произведение сомножителей факторизации числа , то то это число входит в произведение сомножителей факторизации числа , т.е. число делится на.
Представим как , тогда
Значит и делится на
Отсюда следует, что несократимую дробь можно сократить на (пришли к противоречию)
***
Золотая парабола
Возвращаясь к уравнению
Как было сказано выше, решением данного уравнения является золотое сечение, т.е. соотношение сторон открытки, остающейся себе подобной при отрезании квадрата, стороной которого является меньшая сторона открытки.
В прямоугольнике стороны
Если принять сторону AB за , то сторона BE прямоугольника BEFC будет равна и вследствие подобия прямоугольников BEFC и ABCD справедливо соотношение
Таким же образом ведётся построение золотого треугольника (это равнобедренный треугольник, в котором боковые стороны находятся в золотой пропорции с основанием).
В золотом треугольнике углы при основании равны ;
угол, лежащий против основания равен
Проведём биссектрису угла при основании. Эта биссектриса является боковой стороной равнобедренного треугольника АВD, следовательно равняется единице. Также она является боковой стороной равнобедренного треугольника ACD, следовательно отрезок CD равняется единице. По теореме о биссектрисе, которая гласит, что "биссектриса при вершине треугольника делит противоположную сторону на части, пропорциональные прилежащим сторонам" получим пропорцию
Приняв AC=BC за и BD за получим идентичную предыдущей пропорцию
Воспользуемся теоремой Виета для решения этого уравнения
Коэффициенты параболы
Значит, сумма корней
Произведение корней
Будем приближаться к золотому сечению, увеличивая расстояние между точками пересечений ветвей параболы с осью абсцисс до тех пор, пока произведение корней уравнения не превысит единицу ( т.е. не станет меньшим -1), уменьшая разряд числа на порядок. Примем inline x_{1}=1.5inline и inline x_{2}=-0.5 inline и будем увеличивать расстояние между точками пересечений ветвей параболы с осью абсцисс на 0.1 При inline x_{1}=1.5inline и inline x_{2}=-0.5 inline произведение inline x_{1}x_{2}=-0.75 inline При inline x_{1}=1.7inline и inline x_{2}=-0.7 inline произведение inline x_{1}x_{2}=-1.19 inline Уменьшаем шаг до 0.01 При inline x_{1}=1.62inline и inline x_{2}=-0.62 inline произведение inline x_{1}x_{2}=-1.0044 inline Уменьшаем шаг до 0.001 При inline x_{1}=1.611inline и inline x_{2}=-0.611 inline произведение inline x_{1}x_{2}=-0.984321 inline При inline x_{1}=1.612inline и inline x_{2}=-0.612 inline произведение inline x_{1}x_{2}=-0.986544 inline При inline x_{1}=1.613inline и inline x_{2}=-0.613 inline произведение inline x_{1}x_{2}=-0.988769 inline и т.д. Напишем программу, реализующую данный метод def fooa,b,s,n: step=s counter=n x1=a+step x2=b+step if x1*x2<1: foox1,x2,step,counter else: #if x1*x2>1 if counter>0: printcounter x1=x1-step x2=x2-step phi=x1 printphi step=step/10 counter=counter-1 foox1,x2,step,counter foo1.5,0.5,0.1,10 На десятом шаге получаем приближение, равное 1.6180339887
P.S. Задача 27. Доказать, что остаток от деления числа inline 2^{p-1} inline на простое нечетное число inline p inline равен inline 1 inline примеры: $inline$ 2^{2} = 3a+1, 2^{4}=5b+1, 2^{6}=7c+1, 2^{10} -1 = 1023 = 10 \cdot 93 inline. из задачника В.И. Арнольда рассматривается в статье Удивительные приключения цепных дробей журнала "Квант".
Статья, в которой содержится информация о цепных дробях "Об одной задаче, которую больше не предлагают на собеседовании" ссылка
Книги
Задачи для детей от 5 до 15 лет В. И. Арнольд
Курс дифференциального и интегрального исчисления Г. М. Фихтенгольц
Теория чисел А. А. Бухштаб
За страницами учебника математики Н. Я. Виленкин, Л. П. Шибасов, З. Ф. Шибасова Алгебра Н. Я. Виленкин, Р. С. Гутер, С. И. Шварцбурд
Метод математической индукции И.С. Соминский
Digital Arithmetic Ercegovac Milos D., Lang Tomas/