Re[2]: f(f(x)) = -x
От: Аноним  
Дата: 22.01.08 16:03
Оценка:
Здравствуйте, Панда, Вы писали:

П>Кстати, можно сформулировать аналогичную задачу по математике, а не по программированию.

П>Найти функцию f, для которой f(f(x)) — -x
П>x — любое вещественное число без ограничений.
П>Такую функцию я тоже придумал, но пока не смог записать ее аналитически.

А для комплексных?
Re[3]: f(f(x)) = -x
От: Ball00 Россия  
Дата: 23.01.08 09:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А для комплексных?


f(x)=i*x
f(f(x))=-x

Легко и программно реализуется(класс КЧ и всё такое)...
Re: f(f(x)) = -x
От: Аноним  
Дата: 24.01.08 16:36
Оценка:
Здравствуйте, deniok, Вы писали:

D>

D>Задача: написать функцию f(x), так, что f(f(x)) = -x. Разрешено использовать только
D>целые числа. x — целочисленный аргумент (например, 32-битный).

D>от avva

int f(int x)
{
static bool bEvenCall = false;
if( bEvenCall )
x = ~x;
else
x++;
bEvenCall = !bEvenCall;
return x;
}
Re[2]: f(f(x)) = -x
От: vadimcher  
Дата: 24.01.08 18:57
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, deniok, Вы писали:


D>>

D>>Задача: написать функцию f(x), так, что f(f(x)) = -x. Разрешено использовать только
D>>целые числа. x — целочисленный аргумент (например, 32-битный).

D>>от avva

А>int f(int x)

А>{
А> static bool bEvenCall = false;
А> if( bEvenCall )
А> x = ~x;
А> else
А> x++;
А> bEvenCall = !bEvenCall;
А> return x;
А>}

Я эту идею уже утрировал
Автор: vadimcher
Дата: 18.01.08
в виде выдвигающегося/задвигающегося CD-ROM-а. В обоих случаях используется статическая переменная (в случае с CD-ROM -- hard static bool). Идея в том, что если между двумя последовательными вызовами что-то произойдет, ну, например, вы вызовите эту же функцию для другого аргумента из другого потока (или вручную задвините CD-ROM ), то все полетит.

А вот зайца кому, зайца-выбегайца?!
Re: f(f(x)) = -x
От: yachmen  
Дата: 01.02.08 19:12
Оценка:
Здравствуйте, deniok, Вы писали:

D>

D>Задача: написать функцию f(x), так, что f(f(x)) = -x. Разрешено использовать только
D>целые числа. x — целочисленный аргумент (например, 32-битный).

D>от avva

Лехко:

   typedef TArgType int;

   TArgType f( TArgType x )
    {
        if( x )
        {
            if( x & 1 )
            {
                if( x > 0 ) x++;
                else        x--;
            }
            else
            {
                x = -x;
                if( x > 0 ) x--;
                else        x++;
            }
        }

        return x;
    }


Всего наилучшего
Re[2]: f(f(x)) = -x
От: vadimcher  
Дата: 01.02.08 19:38
Оценка:
Здравствуйте, yachmen, Вы писали:

Y>Здравствуйте, deniok, Вы писали:


D>>

D>>Задача: написать функцию f(x), так, что f(f(x)) = -x. Разрешено использовать только
D>>целые числа. x — целочисленный аргумент (например, 32-битный).

D>>от avva

Y>Лехко:


Y>
Y>   typedef TArgType int;

Y>   TArgType f( TArgType x )
Y>    {
Y>        if( x )
Y>        {
Y>            if( x & 1 )
Y>            {
Y>                if( x > 0 ) x++;
Y>                else        x--;
Y>            }
Y>            else
Y>            {
Y>                x = -x;
Y>                if( x > 0 ) x--;
Y>                else        x++;
Y>            }
Y>        }

Y>        return x;
Y>    }
Y>


Y>Всего наилучшего


f(f(0x80000001)) = 0x80000001

А вот зайца кому, зайца-выбегайца?!
Re[3]: f(f(x)) = -x
От: Ячменников Александр  
Дата: 02.02.08 21:37
Оценка:
Здравствуйте, vadimcher, Вы писали:

V>f(f(0x80000001)) = 0x80000001


Прикольно — ведь я и проверял-то только -1, 0, 1, 0x7fffffff, 0x80000000 и 0x80000001 — но глаз замылился и не увидел это в логе
Т.о. вывод такой — можно сделать эту функцию для всех чисел кроме двух, необязательно 0x80000000 и 0x80000001.

Всего наилучшего
Re[4]: f(f(x)) = -x
От: vadimcher  
Дата: 03.02.08 01:05
Оценка:
Здравствуйте, Ячменников Александр, Вы писали:

ЯА>Здравствуйте, vadimcher, Вы писали:


V>>f(f(0x80000001)) = 0x80000001


ЯА>Прикольно — ведь я и проверял-то только -1, 0, 1, 0x7fffffff, 0x80000000 и 0x80000001 — но глаз замылился и не увидел это в логе

ЯА>Т.о. вывод такой — можно сделать эту функцию для всех чисел кроме двух, необязательно 0x80000000 и 0x80000001.

ЯА>Всего наилучшего


Я бы даже сказал, можно для всех чисел, кроме одного.

А вот зайца кому, зайца-выбегайца?!
Re[5]: f(f(x)) = -x
От: deniok Россия  
Дата: 03.02.08 07:26
Оценка:
Здравствуйте, vadimcher, Вы писали:

V>Здравствуйте, Ячменников Александр, Вы писали:


ЯА>>Здравствуйте, vadimcher, Вы писали:


V>>>f(f(0x80000001)) = 0x80000001


ЯА>>Прикольно — ведь я и проверял-то только -1, 0, 1, 0x7fffffff, 0x80000000 и 0x80000001 — но глаз замылился и не увидел это в логе

ЯА>>Т.о. вывод такой — можно сделать эту функцию для всех чисел кроме двух, необязательно 0x80000000 и 0x80000001.

ЯА>>Всего наилучшего


V>Я бы даже сказал, можно для всех чисел, кроме одного.


Что, кстати, иллюстрирует необходимость покрытия кода тотальными тестами (или использования формальной верификации программы)
Re[4]: f(f(x)) = -x
От: Erop Россия  
Дата: 03.02.08 19:12
Оценка:
Здравствуйте, Ячменников Александр, Вы писали:

ЯА>Т.о. вывод такой — можно сделать эту функцию для всех чисел кроме двух, необязательно 0x80000000 и 0x80000001.


Ну это скорее следствие того, что для какого-то числа х нельзя вычислить -х...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: f(f(x)) = -x
От: vadimcher  
Дата: 04.02.08 01:25
Оценка:
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, Ячменников Александр, Вы писали:


ЯА>>Т.о. вывод такой — можно сделать эту функцию для всех чисел кроме двух, необязательно 0x80000000 и 0x80000001.


E>Ну это скорее следствие того, что для какого-то числа х нельзя вычислить -х...


Ну, в общем, да... Хотя, -x формально можно вычислить для любого числа: -0=0, -0x80000000=0x80000000. Просто для одного из них это будет математически неверное -x.

Но проблема здесь не в этом. Если a->b, то b->-a, и -a->-b->a. Т.е. если a!=-a, то требуются четверки чисел, а все такие числа, для которых a!=-a на четверки как раз и не делятся. Т.е. если бы таких чисел было число, кратное 4, то задача решалась бы.

А вот зайца кому, зайца-выбегайца?!
Re[6]: f(f(x)) = -x
От: vadimcher  
Дата: 04.02.08 01:30
Оценка:
Здравствуйте, deniok, Вы писали:

D>Здравствуйте, vadimcher, Вы писали:


V>>Здравствуйте, Ячменников Александр, Вы писали:


ЯА>>>Здравствуйте, vadimcher, Вы писали:


V>>>>f(f(0x80000001)) = 0x80000001


ЯА>>>Прикольно — ведь я и проверял-то только -1, 0, 1, 0x7fffffff, 0x80000000 и 0x80000001 — но глаз замылился и не увидел это в логе

ЯА>>>Т.о. вывод такой — можно сделать эту функцию для всех чисел кроме двух, необязательно 0x80000000 и 0x80000001.

ЯА>>>Всего наилучшего


V>>Я бы даже сказал, можно для всех чисел, кроме одного.


D>Что, кстати, иллюстрирует необходимость покрытия кода тотальными тестами (или использования формальной верификации программы)


Да уж... Я сразу вспоминаю недавний глюк Excel 2007, который "работал" только для 12 из 9.2*10^18 64-битных чисел с плавающей точкой.

А вот зайца кому, зайца-выбегайца?!
Re[6]: f(f(x)) = -x
От: Трурль  
Дата: 04.02.08 06:53
Оценка:
Здравствуйте, vadimcher, Вы писали:

V>Ну, в общем, да... Хотя, -x формально можно вычислить для любого числа: -0=0, -0x80000000=0x80000000. Просто для одного из них это будет математически неверное -x.


Зависит от. Если используется прямой код, то -0x80000000=0x00000000, т.е -(-0)=0.
В обратном коде -0x80000000=0x7FFFFFFFF или -(-2147385345)=2147385345.
Re[4]: f(f(x)) = -x
От: Кодт Россия  
Дата: 06.02.08 10:14
Оценка:
Здравствуйте, Ячменников Александр, Вы писали:

ЯА>Прикольно — ведь я и проверял-то только -1, 0, 1, 0x7fffffff, 0x80000000 и 0x80000001 — но глаз замылился и не увидел это в логе

ЯА>Т.о. вывод такой — можно сделать эту функцию для всех чисел кроме двух, необязательно 0x80000000 и 0x80000001.

Ну, тут уже показывали, что для 32-битных целых (да и вообще для любых целых в двоичной сетке) это невозможно.
Дело в том, что все числа кроме 0 и INT_MIN (в дополнительном коде INT_MIN < -INT_MAX) группируются по 4:
{ x, y=f(x), -x=f(y), -y=f(-x) }, дальше будет x=f(-y)
Остаются 0 и INT_MIN, так что либо f(0)=0, f(INT_MIN)=INT_MIN, либо f(0)=INT_MIN, f(INT_MIN)=0.

Итого, мощность множества целых чисел равна 4n+2. А на самом деле — 2^p.

А в прямом коде, где -0 и 0 — это разные числа, и они не выпадают из общего правила f(f(x))=-x, f(f(0))=-0, — решение есть.
Произвольным образом разбиваем множество Z+ неотрицательных чисел на два равномощных подмножества A+, B+ и строим f как колечки: A+ -> B+ -> A- -> B-.
В качестве способа разбиения проще всего предложить чётность.

То же касается неограниченных целых чисел, и для вещественных. Там есть единственное особое число 0, и для него f(0)=0. А все остальные так же группируются.
У вещественных можно разбивать по признаку frac(x) < / >= 0.5, например.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.