Pull to refresh

Программирование в математических функциях

В школе меня, в отличии от всех остальных, поразил ответ к заданию найти корень в sin(x)=a (x=(-1)^n*arcsin(a)+pi*n, если кто подзабыл), он не выводится с других формул, а создан логическими выводами и умозаключениями специально для отдельного, данного случая. Мне еще тогда стало интересно, можно ли другие действия, требующие логического мышления заменить функцией. Я вспомнил это только месяц назад, когда не хотел розписивать if-ами простое на первый взгляд задание: есть натуральные числа s и g, если s<g возвращаем s, если s>=g возвращаем g. На мое удивление я сравнительно быстро нашел функцию, которая возвращает правильный ответ.


По сути, нужно решить систему функциональных уравнений:
f(s)=s, при s<g;
f(s)=g, при s>=g;
g воспринимаем как относительно статичный параметр.

После недолгих размышлений все сводится к
f(s)=s*d(s)+g*k(s);
где
d(s)=1, при s<g;
d(s)=0, при s>=g;
а k(s) — обратная функция:
k(s)=0, при s<g;
k(s)=1, при s>=g.

Очевидно, что
k(s)=(d(s)+1)%2.

А после того, как я дошел до этого, уже долго думая, я нашел, к чему можно приравнять d(s)
d(s)=( q^ w(s) )%q;
где q — натуральное число, которое не равно 1 (для простоты вычислений допустим, что q=2),
w(s)=0, при s<g;
w(s)!=0, при s>=g.

Почти сразу ясно, что
w(s)=(s-s%g)/g.

Итак, собрав всё вместе, мы получим
f(s)=s*((2^((s-s%g)/g))%2)+g*(((2^((s-s%g)/g))%2+1)%2)
где s и g — натуральные числа.

То есть, можно заменить что-то вроде
если (s<g) возвращать s
иначе возвращать g

на
s*((2^((s-s%g)/g))%2)+g*(((2^((s-s%k)/k))%2+1)%2)

P.S.: изменённая d(s) служит проверкой равенства:
d(v,b)=( q^ (v-b) )%q;
v>=b; q- натуральное число, которое не равно 1;

["%" — mod; "!=" — не равно; ">=" — больше или равно]
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.