воскресенье, 21 августа 2011 г.

f(f(n)) == -n

Задача: всего-то написать такую функцию ( f(f(n)) == -n )
Есть мысли?

Я немного поразмышлял и вот, что мой больной мозг изрек:


// Обратную функцию к f(x) я буду обозначать как f'(x)
Пусть f( f(x) ) = -x
<=> f'(-x) = f(x)
<=> f'( x ) = f(-x) // *1
<=> f'( f(x) ) = f( -f(x) ) = x // по опр обратной ф-ции и *1
<=> f'( x ) = -f(x) => учитывая *1 f(x) = -f(x) = f'(x)
=> f'( f(x) ) = -x => x = -x Оппа! Это верно только при x = 0


То есть в общем виде задача не решается.
Но это был взгляд с точки зрения мат.анализа. А что ответят программисты?
Мой друг k06@ предложил следующий вариант:

#define f(n) 0-n

Здорово. Но это же не совсем функция :) еще он предложил вариант с использованием шаблонов... кому интересно взглянуть на психодельный код шаблонов см сюда k06@
Так что, если у кого есть мысли - пишите в комментариях.

ЗЫ: если мои "математические" выкладки содержат ошибки - просьба ткнуть в них носом!
ЗЗЫ: для случая  f(f(x)) = x      f(x) = 1/x
 

8 комментариев:

  1. С точки зрения мат. анализа задача имеет решение f(x)=i*x :) В действительных числах решений нет (я, правда, пришёл к этому выводу при помощи иных рассуждений).

    ОтветитьУдалить
  2. Я тут ещё немного подумал и вот:

    def f(n):
    if hasattr(n, '__call__'):
    return -n()
    else:
    return (lambda : n)

    Хотя вариант с дефайном круче :)

    ОтветитьУдалить
  3. Круто!
    Я придумал такую: перевернутый |x|

    То есть
    x, при x из (-~, 0)
    f(x) = { 0, при x = 0
    -x, при x из (0, +~)

    ОтветитьУдалить
  4. Гребаный гугл! Все выравнивание профукал!

    ОтветитьУдалить
  5. Перевернутый |x| не сработает для отрицательных чисел. В посте показано ведь, что нельзя построить дифференцируемую функцию, удовлетворяющую этому условию. -|x| дифференцируема на интервале (-~;0), а, значит, не подходит.

    ОтветитьУдалить
  6. Да, ты прав! Это меня переглючило! Рассмотрел только положительные x

    ОтветитьУдалить
  7. Кстати, какие были у тебя рассуждения в первом комментарии?

    ОтветитьУдалить
  8. Мне показалось очевидным, что f(x) может быть только линейной (я не пробовал это доказать строго, но не думаю, что будут проблемы). После этого нужно просто решить уравнение a(ax+b)+b = -x, откуда получится a = +-i, b = 0.

    ОтветитьУдалить