математическая формула

berkut

Новичок
математическая формула

есть-ли математ. формула, которая при определённых действиях над двумя целыми числами, больше нуля, даёт целое число, которое уникально для этих двух чисел, не зависимо от их порядка перечисления?
Т.е. есть X, Y больше нуля. F(X, Y) = F(Y,X) = Z - и это Z должно быть уникальном числом, для пары конкретных значений x,y
 

berkut

Новичок
Mr_Max ? По критерию пары вхождений x,y. Т.е. допустим F(1,3) = 1 - для пары чисел 1 и 3(либо 3 и 1) результат 1 должен быть уникадьным - т.е. никакая комбинация других чисел, допустим 2 и 2 или 1 и 4 не должна выдавать такого-же результата
 

HraKK

Мудак
Команда форума
нереально

-~{}~ 04.10.07 21:39:

прекращай страдать херней а скажи задачу, для чего тебе это понадобилось!
 

kruglov

Новичок
Разные мощности множеств, биекция невозможна.

-~{}~ 04.10.07 22:57:

Хотя стоп, можно, конечно, думал числа действительные, а они натуральные.

Пусть для определенности X>Y, состоят из цифр ...x3x2x1, ...y3y2y1
Тогда берем цифры через одну и составляем из них новое число. Т.е. ...x3y3x2y2x1y1.
 

fixxxer

К.О.
Партнер клуба
а зачем такие запарки - задача то наверняка прикладная а не теоретическая - так что если числа по N бит, составляем одно N*2 бита, начиная с меньшего или большего:)
 

Krishna

Продался Java
string_value_to_int(MD5($x."_".$y)) :)
Получится не строгое, но близкое к искомому )

А вообще - типичный случай ламерского вопроса, который болезненными фантазиями дошел от постановки задачи до изврашенной полуреализации, но вот беда - не хватает пары строчек кода ;))
 

Krishna

Продался Java
berkut
Если ты не понял - MD5 не ответ на твою задачу(которая в принципе не имеет решения). Это лишь способ решить её на определённом диапазоне значений (например на 10.000 значений). По идее. (чисто интуитивно, я даже не буду пытаться доказать - задача нерешаема.) Так вот, МД5 решает эту задачу с некоторой точностью, которая мало зависит от перестановки операндов. Если ты этого не понял, то увы.
З.Ы. Я сегодня пил много пива по случаю 50ти-летия запуска 1ого искусственного спутника Земли и наличия друга, работающего в КБ Лавочкина, но уверен, что всё, что я написал - правда )
Если что- завтра буду оправдываться и уточнять :D :D

-~{}~ 05.10.07 01:46:

Да, теперь понял о чём речь )))
Ответ очень простой - при вычислении MD5 в моей формуле делай необходимым условием, что x >= y.
И всё :)
Это полностью удовлетворит твоим предварительным требованиям ))
 

tashkentchi

Новичок
Krishna, ты написал неправду. На 1-м курсе мехмата для доказательства счетности произведений счетных множеств как раз строится почти такая функция, которая нужна berkut-у.

Иллюстрацию помню:
Код:
    1  2  3  4  5 ...
  _________________
1 | 1  2  9 10 25 ...
2 | 4  3  8 11 24 ...
3 | 5  6  7 12 23 ...
4 |16 15 14 13 22 ...
5 |17 18 19 20 21 ...
.....................
Только она зависит от порядка аргументов

-~{}~ 05.10.07 12:08:

А вот такая уже не зависит:
Код:
    1  2  3  4  5 ...
  _________________
1 | 1             ...
2 | 2  3          ...
3 | 4  5  6       ...
4 | 7  8  9 10    ...
5 |11 12 13 14 15 ...
.....................
-~{}~ 05.10.07 12:16:

Последнюю функцию можно определить рекурсивно:

1. F(1, 1) = 1

2. F(n, m) = F(m, n) при m>n

3. F(n, m) = F(n-1, n-1) + m при n>= m

-~{}~ 05.10.07 12:23:

а можно и без рекурсии:

F(n, m) = (\sum_{k=1}^{k=n-1} k) + m при n>= m

-~{}~ 05.10.07 12:36:

А вот код:

PHP:
function F($n, $m)
{
    if ($m > $n) {
        $k = $n;
        $n = $m;
        $m = $k;
    }
    $result = $m;
    for ($k = 1; $k < $n; ++$k) {
        $result += $k;
    }
    return $result;
}
-~{}~ 05.10.07 13:39:

А вот обратная (с точностью до порядка аргументов):

PHP:
function invF($num)
{
    $n = 1;
    $m = $num;
    while ($n < $m) {
        $m -= $n++;
    }
    return array($n, $m);
}
 

SiMM

Новичок
PHP:
    for ($k = 1; $k < $n; ++$k) { 
        $result += $k;
Ну сумму-то ряда можно было и без циклов посчитать :)
PHP:
$result += ($n-1)*$n/2;
Ну и с обратной та же фигня, я полагаю :)
 

tashkentchi

Новичок
SiMM, и правда так лучше.

kruglov, зато здесь нет строковых операций :) А с поправкой SiMM-а, думаю, она вполне практична.
 

SiMM

Новичок
> Ну и с обратной та же фигня, я полагаю
PHP:
function invF($num) { 
    $n = (int)((1 + sqrt(1+8*$num))/2);
    return array($n,$num-($n-1)*$n/2);
}
Если я не ошибаюсь :)

-~{}~ 05.10.07 14:43:

И всё таки - а зачем оно понадобилось? :)
 

kruglov

Новичок
tashkentchi
Ну, у меня операции не обязательно строковые, они могут быть битовые.
 

tashkentchi

Новичок
Ну и отлично. Думаю, что на свой вопрос berkut получил исчерпывающие ответы.

Если еще публика узнает зачем оно надо, то тему можно будет закрыть.
 

phprus

Moderator
Команда форума
SiMM
$n = (int)((1 + sqrt(1+8*$num))/2);
А тут случайно не может потеряться точность из-за приведения числа с плавающей точкой к целому и из-за вычисления корня?
 

dark-demon

d(^-^)b
если есть желающие пофлеймить на тему счётности вещественного множества, приглашаю к этой заметке :)

по сабжу: в случае сравнительно небольших числел ( < 32 или 16 бит, в зависимости от версии пхп ) достаточно формулы: (x<<32)|y
в случаве больших чисел - то же самое, но с использование BCMath
 

Krishna

Продался Java
tashkentchi
Каюсь, виноват. На первом курсе ВМиК схожая таблица строится для доказательства счётности множества рациональных чисел :)
Проклятый спутник! :))
 

berkut

Новичок
вот они, ламероподобные существа, мнящие о своём величии
 
Сверху