В школе меня, в отличии от всех остальных, поразил ответ к заданию найти корень в 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*((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; "!=" — не равно; ">=" — больше или равно]
По сути, нужно решить систему функциональных уравнений:
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; "!=" — не равно; ">=" — больше или равно]