Найти рациональное число

zykov
Сообщений: 1393
Зарегистрирован: 06 янв 2016, 17:41

Найти рациональное число

Сообщение zykov » 22 июл 2020, 10:13

Вот любопытная задача (я уже знаю решение, потом напишу, если никто не решит).
Дано число с плавающей точкой. Пусть для определенности это будет компьютерный "double float" - примерно 16 десятичных цифр. Не большое и не маленькое (пусть будет от 0.01 до 100).
Известно, что оно было получено делением одного целого на другое целое - $a/b$.
Нужен алгоритм, чтобы найти a и b - что-то более быстрое, чем просто перебор.
Понятно, что при больших a и b не найти (насколько больших?), т.к. точность представления числа не позволит различить разные варианты.

Пример:
Число $\pi$ иррациональное, т.е. не равно отношению каких-то целых. Но его можно приблизить рациональным.
Так $\frac {355}{113}$ оценивает $\pi$ сверху, причем с очень высокой точностью ($2.7 \cdot 10^{-7}$) для таких маленьких a и b.
Вот тоже вопрос - это просто случайность или есть для этого какая-то причина?

Аватар пользователя
Ian
Сообщений: 960
Зарегистрирован: 18 янв 2016, 19:42

Найти рациональное число

Сообщение Ian » 23 июл 2020, 07:56

Цепная дробь?
[math]
[math]
Есть такая красивая теорема, почему получаемое таким образом приближение лучше не только среди приближений со знаменателем не большим этого (в данном случае 113), но и среди приближений (с той же стороны,т.е. сверху или снизу) со знаменателем не больше знаменателя следующей подходящей дроби.Основывается на равенстве
[math], которое, оказывается, выполняется для всех соседних подходящих дробей [math]. У нулевого приближения [math] и оно снизу.Следующее -сверху, и вообще все нечетные сверху
значит, приближаемое число (в общем случае [math]) лежит между соседними подходящими дробями и точность приближения
[math]
Значит, Вам надо найти подходящие дроби со знаменателем не больше [math] и взять первую из них, которая обеспечивает требуемую точность [math](последняя точно обеспечивает. Но могут быть и раньше. все они годятся как ответы к Вашей задаче.)

zykov
Сообщений: 1393
Зарегистрирован: 06 янв 2016, 17:41

Найти рациональное число

Сообщение zykov » 23 июл 2020, 14:27

Верно!
Цепные дроби - давно известный метод поиска приближений для иррациональных чисел в виде рационального числа.
Алгоритм простой, разделяем число на целую часть (это будет очередное значение) и дробную часть. Дробную часть возводим в минус первую степень и к результату (который будет больше 1) применяем ту же процедуру, и т.д..
Если число было рациональным, то этот процесс когда-то оборвется - мы получим нулевую дробную часть на каком-то шаге.
Так что этот алгоритм позволяет решить нашу задачу - как восстановить целые a и b, если только известно $a/b$ в форме числа с плавающей точкой. В этом случае, на каком-то шаге остаток резко окажется очень маленьким - порядка машинной точности.
Но что если исходное число имело гораздо большую ошибку, чем машинная точность?
Мы конечно можем посмотреть на ошибку приближения исходного числа нашей дробью, но эта ошибка в любом случае будет уменьшатся.
Как было выше замечено, при приближениии дробью произвольного числа можно ожидать ошибку порядка $b^{-2}$. Значит можно ввести качество приближения в виде $(x - \frac a b)\cdot b^2 = err \cdot b^2$. Эта мера будет меньше 1 по абсолютной величине, но обычно ненамного меньше (может 0.5, может 0.1). Но если мера качества оказалась много меньше 1, то это индикатор того, что исходное число могло бы быть представлением этого рационального числа с ошибкой.

Я вспомнил про эту задачу при решении другой задачи с математической регаты. Точный ответ там $8/3$, но Монтекарло даёт неточные значения в виде чисел с плавающей точкой. Можно ли по ним найти это $8/3$?
Во первых, я написал Matlab код, который разлагает число в цепную дробь:

Код: Выбрать все

## Continued fraction
function r = cont_frac(x, n)
  v = [floor(x)];
  t = x;
  for k=2:n
    t = 1 / (t - v(k-1));
    v(k) = floor(t);
   
    a = 0; b = 1;
    for k1=k:-1:1
      c = a + v(k1) * b;
      a = b; b = c;
      g = gcd(a, b);
      a = a / g; b = b / g;
    endfor
    err = b/a-x;
    printf('%d/%d, err=%g, tol=%g\n', b, a, err, err*a*a);
  endfor
  r = v;
endfunction

Тут мы делаем несколько шагов и на каждом шаге печатаем саму дробь, ошибку приближения исходного числа этой дробью и качество этого приближения.
Например Монтекарло дал три числа после $10^5$ итераций: 2.6639, 2.6712, 2.6597
Применим к ним эту функцию:

Код: Выбрать все

cont_frac(2.6639, 8)
3/1, err=0.3361, tol=0.3361
5/2, err=-0.1639, tol=-0.6556
8/3, err=0.00276667, tol=0.0249
317/119, err=-3.44538e-05, tol=-0.4879
642/241, err=4.14938e-07, tol=0.0241
25997/9759, err=-1.0247e-08, tol=-0.9759
26639/10000, err=0, tol=0

Код: Выбрать все

cont_frac(2.6712, 8)
3/1, err=0.3288, tol=0.3288
8/3, err=-0.00453333, tol=-0.0408
195/73, err=3.28767e-05, tol=0.1752
983/368, err=-4.34783e-06, tol=-0.5888
1178/441, err=1.81406e-06, tol=0.3528
2161/809, err=-9.88875e-07, tol=-0.6472
3339/1250, err=0, tol=0

Код: Выбрать все

cont_frac(2.6597, 8)
3/1, err=0.3403, tol=0.3403
5/2, err=-0.1597, tol=-0.6388
8/3, err=0.00696667, tol=0.0627
125/47, err=-0.000125532, tol=-0.2773
383/144, err=2.22222e-05, tol=0.4608
508/191, err=-1.41361e-05, tol=-0.5157
891/335, err=1.49254e-06, tol=0.1675

Тут мы видим, что все три раза возникает дробь $8/3$, причем она имеет неплохую меру качества $0.02 \; - \; 0.06$.
Отсюда возникает оправданная гипотеза, что Монтекарло даёт приближения к точному значению $8/3$.
Последний раз редактировалось zykov 23 июл 2020, 15:59, всего редактировалось 6 раз.

zykov
Сообщений: 1393
Зарегистрирован: 06 янв 2016, 17:41

Найти рациональное число

Сообщение zykov » 23 июл 2020, 15:05

Ещё любопытно посмотреть на разложение числа $\pi$ в цепную дробь:

Код: Выбрать все

cont_frac(pi, 14)
22/7, err=0.00126449, tol=0.06196
333/106, err=-8.32196e-05, tol=-0.935056
355/113, err=2.66764e-07, tol=0.00340631
103993/33102, err=-5.77891e-10, tol=-0.633219
104348/33215, err=3.31628e-10, tol=0.365864
208341/66317, err=-1.22356e-10, tol=-0.538116
312689/99532, err=2.91434e-11, tol=0.288712
833719/265381, err=-8.71525e-12, tol=-0.61379
1146408/364913, err=1.61071e-12, tol=0.214485
4272943/1360120, err=-4.04121e-13, tol=-0.747594
5419351/1725033, err=2.22045e-14, tol=0.0660747
80143857/25510582, err=-4.44089e-16, tol=-0.289009
245850922/78256779, err=0, tol=0

Отсюда видно, что дробь $355/113$ имеет аномально высокое качество $0.0034$, что гораздо меньше 1.
Вот загадка - это просто случайность или для этого есть какая-то причина?
Тут же есть ещё пара дробей с качеством похуже, но тоже неплохим ($0.06\;-\;0.07$): $22/7$ и $5419351/1725033$.
Итересно, почему?
Все три дают оценку сверху. Может дело в правильных описанных многоугольниках...
Попробовал посмотреть правильный 710-угольник.
Действительно $2\tan \frac{\pi}{710}$ хорошо приближается дробью $1/113$, но всё же гораздо хуже чем $\frac{\pi}{355}$ приближается той же дробью (где-то на два порядка хуже).

zykov
Сообщений: 1393
Зарегистрирован: 06 янв 2016, 17:41

Найти рациональное число

Сообщение zykov » 23 июл 2020, 18:13

zykov писал(а):Source of the post Вот загадка - это просто случайность или для этого есть какая-то причина?

Немного поискал гугл, какого-то ответа нет.
Вот наиболее содержательный разбор: The Mystery of 355/113.
Обычно качество немного по-другому определяют - у меня "$err \cdot b^2$", у них "$-\log_b err$" (видимо мотивация в "Diophantine approximation: Approximation of algebraic numbers, Liouville's result").
По их метрике качество $355/113$ выходит $3.202$, а качество $22/7$ даже выше - $3.429$.

zykov
Сообщений: 1393
Зарегистрирован: 06 янв 2016, 17:41

Найти рациональное число

Сообщение zykov » 23 июл 2020, 18:57

Вот идея, если бы $$\frac{1}{\pi}$$ имело бы разложение в ряд начинающийся как $$\frac 3 5 - \frac {20}{71}+...$$, то это объясняло бы.
Тут есть надежда, глядя на уже имеющиеся ряды для $1/\pi$ - Rapidly convergent series.
Наверно есть целое семейство таких рядов.
У этих двух рядов только первое слагаемое даёт ошибку $10^{-9}$ и $10^{-15}$ соответственно.
У нас же два слагаемых (или одно, если их обратно объединить) даёт ошибку $2.7 \cdot 10^{-8}$, так что может есть ряд чуть похуже тех двух, но дающий в начале $113/355$.
Последний раз редактировалось zykov 23 июл 2020, 23:56, всего редактировалось 1 раз.

Аватар пользователя
Ian
Сообщений: 960
Зарегистрирован: 18 янв 2016, 19:42

Найти рациональное число

Сообщение Ian » 23 июл 2020, 21:04

zykov писал(а):Как было выше замечено, при приближениии дробью произвольного числа можно ожидать ошибку порядка $b^{-2}$. Значит можно ввести качество приближения в виде $(x - \frac a b)\cdot b^2 = err \cdot b^2$. Эта мера будет меньше 1 по абсолютной величине...

Самое плохо приближаемое в этом смысле
[math] и там не меньше 1 а как раз [math]
Для рациональных х как уже сказано обратится в 0
Для алгебраических (корней какого-нибудь полинома с целыми коэффициентами) стремится к конечному пределу, отличному от 0
Для остальных (трансцедентных) стремится к 0, причем степенным образом, как [math](не все?). Это даже используется при доказательстве трансцедентности. В этом смысле трансцедентные промежуточные между алгебраическими и рациональными, а не наоборот.
Сравните http://oeis.org/A001203
Последний раз редактировалось Ian 24 июл 2020, 06:08, всего редактировалось 1 раз.

zykov
Сообщений: 1393
Зарегистрирован: 06 янв 2016, 17:41

Найти рациональное число

Сообщение zykov » 24 июл 2020, 00:08

Ian писал(а):Source of the post Самое плохо приближаемое в этом смысле
$\phi=\frac{\sqrt 5+1}{2}=1+\frac 1 \phi$ и там не меньше 1 а как раз $\phi$

Да, золотое сечение приближается хуже всего, но там тоже меньше 1.

Код: Выбрать все

cont_frac((sqrt(5)+1)/2, 20)
2/1, err=0.381966, tol=0.381966
3/2, err=-0.118034, tol=-0.472136
5/3, err=0.0486327, tol=0.437694
8/5, err=-0.018034, tol=-0.45085
13/8, err=0.00696601, tol=0.445825
21/13, err=-0.00264937, tol=-0.447744
34/21, err=0.00101363, tol=0.447011
55/34, err=-0.00038693, tol=-0.447291
89/55, err=0.000147829, tol=0.447184
144/89, err=-5.64607e-05, tol=-0.447225
233/144, err=2.15668e-05, tol=0.447209
377/233, err=-8.23768e-06, tol=-0.447215
610/377, err=3.14653e-06, tol=0.447213
987/610, err=-1.20186e-06, tol=-0.447214
1597/987, err=4.59072e-07, tol=0.447214
2584/1597, err=-1.7535e-07, tol=-0.447214
4181/2584, err=6.69777e-08, tol=0.447214
6765/4181, err=-2.55832e-08, tol=-0.447214
10946/6765, err=9.77191e-09, tol=0.447214

Мера качества стремится к $\frac {1}{\sqrt 5} \approx 0.44721$.

zykov
Сообщений: 1393
Зарегистрирован: 06 янв 2016, 17:41

Найти рациональное число

Сообщение zykov » 24 июл 2020, 10:06

Ian писал(а):Source of the post В этом смысле трансцедентные промежуточные между алгебраическими и рациональными, а не наоборот.

Это не совсем верно.
Рациональное число приближается идеально только самим собой (дроби приводятся к несократимому виду).
Если же попробовать приблизить рациональное число другими рациональными, то ошибка будет ещё хуже чем для алгебраических. Для алгебраических это $b^{-2}$, а для рациональных $b^{-1}$. Так что в этом смысле алгебраические лежат между рациональными и трансцендентными.

Пусть мы хотим приблизить $$\frac{a_0}{b_0}$$ числом $$\frac a b$$, так что $$a_0 b \neq b_0 a$$ и $$b \gg b_0$$.
Тогда ошибка будет $$err = \frac a b - \frac {a_0}{b_0} = \frac {b_0 a - a_0 b}{b_0 b}$$. Так как $$a_0 b \neq b_0 a$$, то $$b_0 a - a_0 b$$ не менее 1 по абсолютной величине.
Значит $$|err| \geq \frac {1}{b_0 b}$$.

zykov
Сообщений: 1393
Зарегистрирован: 06 янв 2016, 17:41

Найти рациональное число

Сообщение zykov » 25 июл 2020, 11:48

Вот ещё можно посмотреть, как плотно идут рациональные числа с ограниченным знаменателем.
Возьмем некоторое $B$ и возмём все несократимые дроби $a/b$, такие что $0 \leq a \leq b \leq B$.
Наши числа будут в интервале от 0 до 1, но в дургих интервалах, например от 1 до 2 всё тоже самое - просто к $a$ нужно прибавить $b$, что не изменит интервалы между числами.
Отсортируем эти числа в порядке возрастания и посмотрим на интервалы между соседними.
Вот график для $B=300$, интервал умножен на $B^2$:
rational.png
linear
rational.png (60.74 KiB) 25837 просмотра

Видно, что максимальные пики размером 300 рядом с 0 и 1. Действительно в интервалах от $0$ до $1/B$ и от $1-1/B$ до $1$ нет других рациональных с ограниченным знаменателем. Потом есть большой пик около 1/2, далее пики около 1/3, 2/3, 1/4, 3/4 и т.д., что соответствует плохому приближению рациональных рациональными.
Но подавляющий процент интервалов (где-то около 90%) имеют маленькую величину - менее $5/B^2$.
Самый маленький интервал лежит от $\frac 1 B$ до $\frac {1} {B-1}$ и имеет величину $\frac {1}{B(B-1)}$ (между $\frac {B-2} {B-1}$ и $\frac {B-1} {B}$ такой же), т.е. имеет качество $\frac {B}{B-1}$, что чуть больше 1.
Вот тот же график в логарифмическом масштабе для интервалов:
rational_log.png
log
rational_log.png (111.02 KiB) 25837 просмотра


Вобщем если выбирать $B$ произвольно для приближения какого-нибудь числа, то скорее всего качество будет около 1, типично до 2-3. Может подскакивать и до $B/2$, если не повезло. Но алгоритм цепных дробей выбирает "хорошие" $B$, так что качество гарантировано менее 1, а типично - 0.1-0.7.

Аватар пользователя
Ian
Сообщений: 960
Зарегистрирован: 18 янв 2016, 19:42

Найти рациональное число

Сообщение Ian » 26 июл 2020, 07:39

А может тогда можно найти и матожидание качества приближения, при равномерном распределении приближаемого числа?

zykov
Сообщений: 1393
Зарегистрирован: 06 янв 2016, 17:41

Найти рациональное число

Сообщение zykov » 26 июл 2020, 11:15

Всего отрезков 27398 при $B=300$ (наверно можно комбинаторно найти количество несократимых дробей, скорее всего через последовательность простых чисел), так что среднее от длины отрезков $3.285/B^2$. Медиана по этому набору отрезков $2.611/B^2$. Хвост из высоких пиков подтягивает среднее вверх.
При $B=3000$ среднее будет $3.289/B^2$, медиана будет $2.615/B^2$.

Средняя ошибка приближения - это $1/4$ от средней длины отрезка.

zykov
Сообщений: 1393
Зарегистрирован: 06 янв 2016, 17:41

Найти рациональное число

Сообщение zykov » 26 июл 2020, 11:22

zykov писал(а):Source of the post (наверно можно комбинаторно найти количество несократимых дробей, скорее всего через последовательность простых чисел)

Взаимно простые числа:
Вероятность того, что любые $k$ случайным образом выбранных положительных целых чисел будут взаимно просты, равна $\frac{1}{\zeta(k)}$, в том смысле, что при $N\to \infty$ вероятность того, что $k$ положительных целых чисел, меньших, чем $N$ (и выбранных случайным образом), будут взаимно простыми, стремится к $\frac{1}{\zeta(k)}$. Здесь $\zeta(k)$ — это дзета-функция Римана.


Так что видимо "среднее $3.289/B^2$" стремится к $$2\zeta(2)/B^2 = \frac{\pi^2}{3} \cdot \frac{1}{B^2}$$.
Т.е. среднее качество будет $$\frac{\zeta(2)}{2} = \frac{\pi^2}{12} \approx 0.822$$.

zykov
Сообщений: 1393
Зарегистрирован: 06 янв 2016, 17:41

Найти рациональное число

Сообщение zykov » 26 июл 2020, 11:40

Получется, что "почти все числа алгебраические".
Рациональных мало - их вообще счётное количество.
А трансцендентных тоже получается "меньше" чем алгебраических в вероятностном смысле, т.к. трансцендентные "прижаты" к рациональным.

Аватар пользователя
Ian
Сообщений: 960
Зарегистрирован: 18 янв 2016, 19:42

Найти рациональное число

Сообщение Ian » 26 июл 2020, 21:48

zykov писал(а):Получется, что "почти все числа алгебраические".
Рациональных мало - их вообще счётное количество.
А трансцендентных тоже получается "меньше" чем алгебраических в вероятностном смысле, т.к. трансцендентные "прижаты" к рациональным.
Алгебраических чисел тоже счетное множество и поэтому мера 0. Полную меру имеют трансцедентные.

zykov
Сообщений: 1393
Зарегистрирован: 06 янв 2016, 17:41

Найти рациональное число

Сообщение zykov » 27 июл 2020, 01:44

Да, действительно.
Количество многочленов с целочисленными коэффициентами ограниченной степени и с ограниченными коэффициентами конечно, у каждого такого многочлена конечное количество корней. Так что все корни таких многочленов можно пронумеровать постепенно увеличивая ограничение степени и ограничение коэффициентов.

Аватар пользователя
Ian
Сообщений: 960
Зарегистрирован: 18 янв 2016, 19:42

Найти рациональное число

Сообщение Ian » 27 июл 2020, 07:06

Отсюда следует, что точность стремится к 0 почти всюду при [math], а именно во всех трансцедентных точках, и в них ограничена сверху. По теореме Лебега о предельном переходе под знаком интеграла. интеграл (матожидание) тоже стремится к 0. А у Вас?
И мне особенно интересно, как это матожидание стремится к 0. Как [math]? [math]?

zykov
Сообщений: 1393
Зарегистрирован: 06 янв 2016, 17:41

Найти рациональное число

Сообщение zykov » 27 июл 2020, 13:09

Матожидание качества стремится к $$\frac{\zeta(2)}{2} = \frac{\pi^2}{12} \approx 0.822$$ при $$B \to \infty$$. Это факт.
Это если для каждого $B$ считаем матожидание (например по $[0, 1]$) и потом берем предел этого матожидания.
Если сделать по-другому - для каждого $x \in [0, 1]$ найти предел качества и потом взять матожидание, то видимо ноль получится (т.к. этот предел ненулевой только для алгебраических точек).

zykov
Сообщений: 1393
Зарегистрирован: 06 янв 2016, 17:41

Найти рациональное число

Сообщение zykov » 27 июл 2020, 13:56

Понял, тут недопонимание.
Если для каждого $B$ мы ищем приближение с минимальной ошибкой, то качество (ошибка умноженная на $b^2$) для трансцендентных не стремится к нулю. Пример - цепная дробь для $\pi$. Иногда возникают приближения с высоким качеством, но все другие имеют качество $0.1-0.7$. Так что и матожидание стремится к константе больше нуля.
Теорема утверждает другое - если для каждого $B$ искать приближение с максимальным $\mu$, так что $|err| < b^{-\mu}$ (смотри Irrationality measure), то для этих приближений качество будет стремится к нулю (но сами приближения не будут иметь минимальной ошибки).

PS: Только для некоторых чисел вроде Liouville numbers качество приближений с минимальной ошибкой стремится к нулю.

Аватар пользователя
Ian
Сообщений: 960
Зарегистрирован: 18 янв 2016, 19:42

Найти рациональное число

Сообщение Ian » 27 июл 2020, 20:33

Ну а строгий ответ каково матожидание качества приближений со знаменателями [math]- у Вас есть ? У меня нет


Вернуться в «Математика»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 4 гостей