
А теперь представьте, что вы сам этот повар, а станок ровно вырезающий круги сломался, а на рынке только станки обрезающие прямоугольники — рынок порешал за унификацию. Хорошо, что 3D-принтер, использующийся для пирожных, может и круг напечатать, но чтоб ничего не изменилось надо массу доставленных коржей разделить по самой точной пропорции. Разумеется, можно было бы задать программу разделения квадратного коржа: отделить . Но вот засада: ножи от поставщика имеют ограничение — нож может прицельно делить только на целое количество одинаковых кусков, и отрезать только один.
Для простоты обозначим . Для числа
есть удобное приближение
. Соответствующее приближение для
будет
. Таким ножом без оптимизации надо будет сделать
отрезов
, а это не так уж быстро. Но это — если резать со стороны отделения тортовой части. А если отрезать со стороны пирожных, то для дроби
нужно будет
отрезов. Уже лучше. Теперь надо разобраться как то же самое проделать ещё быстрее.
Эту дробь можно представить как сумму дробей с единицей в числителе.
Всё равно, первый отрез правильный. Пропорция деления оставшегося после него куска в требует
отреза. После первого из них оставшаяся пропорция будет
, затем
, а уже
сокращается до
. Значит, отрезается
. Останется отрезать
. Всего шесть отрезов.
. Вот мы и справились задачей.
Вы же понимаете, что задача не из жизни, из крутого кибер-фэнтези? А что если точность проверки в такой ситуации очень важна и будет повышаться? Вы уже не завидуете повару? Может, существует алгоритм, который работает для любой точности? Сейчас посмотрим.
Нож, который отделяет доли — всё же лучше, чем нож, который просто делит пополам. При отделяющем половину ноже программа действий следующая: разрезать текущую часть пополам, и если отрезано больше, чем надо, то второй кусок идёт на пирожные, а режется первый. Если меньше, то первый кусок идёт на торты, а режется второй.

Затем опять половину:
Здесь можно заметить кое-что странное. Числа увеличиваются. Казалось бы, бо́льшие числа говорят о большей точности. Но здесь не тот случай, когда чем больше тем лучше. Это похоже на пробуксовку.
Если первый отрез делать со стороны пирожных, то отделять нужно не половину, а, как уже выяснили, одну пятую.
Вспомнив о режущем пополам ноже можно предположить, что если периодически менять сторону, с которой отрезать куски, то дело пойдёт веселее. Только, для простого ножа вполне ясно, когда менять сторону, а для нашего — не совсем.
Когда мы делаем отрез, мы не только выбираем число для доли. Одновременно надо выбрать, какую из частей будем резать дальше и куда пойдёт та часть, которую откладываем — на торт или на пирожное. Это четыре различных варианта действий.
Если мы можем отрезать на выбор слева или справа от идеальной пропорции, то у нас есть простой критерий выбора: чем ближе будет отрез, тем точнее выбор. Но если учесть, что за два последовательных отреза теоретически можно приблизиться ближе через тот, первый шаг которого был дальше — тогда возможны и другие критерии.
Рассмотрим по порядку все четыре варианта отреза.
Пока что мы рассмотрели повторяющееся применение только одного вида отреза, в котором кусок для следующей обрезки берётся с противоположной стороны, чем то направление, в котором смещается отрез при увеличении порядка. Говоря проще, на следующий разрез бралась бо́льшая часть. Место отреза относительно места точного отреза оставалось с одной и той же стороны. Два варианта получилось потому что по-разному выбирали сторону отсчёта для первого отреза.
Своевременный вопрос: как выбирать следующий кусок для разрезания? Если разрез происходит пополам, то разницы между кусками нет, выбирать между ними не нужно. Но если делитель больше двух, выбор происходит между бо́льшим куском и меньшим. Выбор для разреза меньшего куска, конечно, лучше приблизит отрез, но при превышении делителем некоторого значения отрез зайдёт дальше точного отреза и после этого придётся сменить направление — точнее, сам отрез будет уже другого типа. При выборе большего куска, соответственно, направление можно и не менять. Но можно и поменять. Как-то уже не так ясно.
Так что посчитаем. Пусть — величина нужного отреза, отсчитывая с левого края. Складывать куски будем слева на торт, справа на пирожные. Увеличение дробности смещает отрез влево. Первый вариант отреза это когда левый кусок откладывается налево, для следующего отреза берётся правый кусок.

Третий и четвёртый виды отреза — такие же как первый и второй, только отделённый кусок откладывается в другую сторону. Поэтому величина остатка для отделения не меняется.
Четвёртый вид:
После этого можно соорудить программку, которая покажет результаты соревнования с перебором всех видов и степеней отреза.
***
Особенность нашей задачи в том, что в ней речь идёт не о произвольной дроби, а о дроби, имеющей прямое отношение к кругу. Так что, гамма-повар решил бы эту задачу по-другому.
Представьте единичный круг, на котором в вертикальном направлении вниз от центра поставлена точка. Если эта точка будет двигаться по кругу, то координата вдоль этого направления будет косинусом этого сдвига. Теперь можно добавить ещё одну точку на том же месте, но двигаться она будет только горизонтально. Можно связать точки так, что центр окружности, первая точка и вторая точка — все три лежали бы на одной линии.

Это преобразование из одного ряда в другой
Образное объяснение такое: если у вас есть ряд аккумуляторов, каждый из которых за один временной промежуток отдаёт половину своего заряда соседнему аккумулятору справа, получая при этом половину заряда соседа слева, то начав заряжать что-нибудь с начала ряда и двигаясь последовательно, вы всё равно используете весь их заряд.
Сумму можно переписать как
Это значит, что для деления коржа есть простой алгоритм:
- Половину остатка отправить на торты
- Третью часть остатка отправить на пирожные
- Половину остатка отправить на торты
- Пятую часть остатка отправить на пирожные
- Это цикл из двух действий, только знаменатель дроби отделения для пирожных каждый раз увеличивается на два.

Задачка решена. Точность обеспечена.
Комментариев нет:
Отправить комментарий