@Xvir43

Есть ли формула обратимого преобразования четырёх чисел в одно?

Есть ли формула с помощью которой можно 4 числа как-то соединить и потом этот результат разъединить на те же 4 числа?
  • Вопрос задан
  • 446 просмотров
Решения вопроса 3
Griboks
@Griboks
1. Вы можете рассматривать каждое число как разряд. Это позволит сложить и разложить сколь угодно много чисел (см. формулы выделения разрядов).
Для примера, пусть у нас есть 4 числа, каждое из которых может быть 0-9. Тогда, возможно двустороннее преобразование вида: 1 + 2 + 3 + 4 = 1234.

2. Объединить текстовую запись чисел, а потом разбить её на 4 равные части.

3. Представить каждую пару чисел как x.y, а затем представить общее число как a+i*b (комплексное). Например: 1 + 2 + 3 + 4 = 1.2+3.4i. В таком случае возможно даже "бесплатно" получить хеш по формуле Эйлера: 1.2+3.4i => 3.6*e^1.23i.
Ответ написан
@ittakir
1. Берем 4 числа в двоичном представлении любого размера, сколь угодно бит:
2 (10), 7 (111), 17 (1001), 0 (0)

2. Записываем их в двоичный поток. 1 записываем как 10, 0 записываем 0, разделитель чисел 11.
100 11 101010 11 100010 11 0

3. Распаковываем двоичный поток. Если 0, то это 0. Если 1, то смотрим следующий бит.
10, 111, 1001, 0

Так можно запаковать что угодно, например, строки, вещественные числа, любой размерности.
Ответ написан
saboteur_kiev
@saboteur_kiev
build engineer
От перемены мест слагаемых, результат не меняется.
От перемены мест множителей, результат не меняется.

Нет такой формулы, чтобы случайные числа можно было "сложить" и "разложить".
В асинхронном шифровании есть нечто похожее, но там это работает с простыми числами, а не с произвольными.
Работайте со строками, а не с числами.
Ответ написан
Пригласить эксперта
Ответы на вопрос 8
Adamos
@Adamos
Внезапно, объявление struct в С или класса с членами в любом ООП-языке как раз в качестве такой "формулы" и работает. Компьютер хранит несколько "чисел" одним блоком памяти и может обратимо преобразовать этот самый блок в эти самые числа. Без велосипедов.
Ответ написан
@pestilent
Смотря какие числа и для чего. Для целых неотрицательных уже формулу привели. При желании можно даже придумать формулу со взаимно-однозначным соответствием: (2a+1)2^((2b+1)2^((2c+1)2^d-1)-1)-1. Сомневаюсь, правда, что она годится для чего-либо практического.
Для действительных чисел, по-видимому, явной формулы не придумаешь, но вообще построить соответствие не проблема. Опять же, идею с объединением цифр по разрядам уже привели. Опять же, при желании можно придумать схему со взаимно-однозначным соответствием. Например, скомбинировав цепные дроби с формулой из предыдущего абзаца. Детали оставляю в качестве несложного упражнения ;)
Ответ написан
dimonchik2013
@dimonchik2013
жизнь прекрасна в Амстердаме, а в Воронеже gаvно
да, + или . и / % или ' '
Ответ написан
Все просто: есть три числа (время) 14:22:55
hh = 14
mm = 22
ss = 55
Запишем в виде одного числа:
num = hh*10000+mm*100+ss = 142255
итог: 3 числа превратились в одно.

Если применительно к программированию - то там применяется операция бинарного сдвига вместо умножения.
Ответ написан
sgjurano
@sgjurano
Разработчик
Ваши исходные числа можно сразу рассматривать как одно длинное число, если их рядом положить :)

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

На практике тем не менее проще работать со строками.
Ответ написан
wisgest
@wisgest
Слесарь холодной обработки металла
Rn и R равномощны (имеют мощность континуума), т. e. возможно построить взаимно однозначное соответствие между действительными числами и их n-ками (n=4 исключением не является). Но формулой из простых арифметических действий, по-видимому, не обойтись, а, вероятно, нужна поразрядная обработка записи чисел в какой-либо поместной (нерус. позиционной) системе счисления, например, сначала выписываем 1-ю цифру из каждого числа, потом 2-ю…
Ответ написан
xPomaHx
@xPomaHx
1vs9
Может как то поиграться с разделителями просто, например тупо конкатинируешь числа с разделителем 12345, а если в исходных числах встречается такая последовательность то экранируешь её предварительно тем же набором например, потом при парсинге обратный процесс.
Возможно чтобы самому не изобретать велосипед по экранированию лучше найти 2 инструмента, с начало в котором уже готово экранирование со строками, и второй преобразование чисел в буквы.
Ответ написан
@vetta_vetka
Еще один вариант - 2^a * 3^b * 5^c * 7^d (^ - возведение в степень)
Благодаря однозначности разложения на простые множители можно однозначно восстановить четыре исходных числа из результата.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
15 нояб. 2019, в 16:24
5000 руб./за проект
15 нояб. 2019, в 16:13
5000 руб./за проект
15 нояб. 2019, в 15:49
10000 руб./за проект