Задать вопрос

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

Есть ли формула с помощью которой можно 4 числа как-то соединить и потом этот результат разъединить на те же 4 числа?
  • Вопрос задан
  • 684 просмотра
Подписаться 3 Простой 1 комментарий
Решения вопроса 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
software engineer
От перемены мест слагаемых, результат не меняется.
От перемены мест множителей, результат не меняется.

Нет такой формулы, чтобы случайные числа можно было "сложить" и "разложить".
В асинхронном шифровании есть нечто похожее, но там это работает с простыми числами, а не с произвольными.
Работайте со строками, а не с числами.
Ответ написан
Пригласить эксперта
Ответы на вопрос 8
Adamos
@Adamos
Внезапно, объявление struct в С или класса с членами в любом ООП-языке как раз в качестве такой "формулы" и работает. Компьютер хранит несколько "чисел" одним блоком памяти и может обратимо преобразовать этот самый блок в эти самые числа. Без велосипедов.
Ответ написан
@pestilent
Смотря какие числа и для чего. Для целых неотрицательных уже формулу привели. При желании можно даже придумать формулу со взаимно-однозначным соответствием: (2a+1)2^((2b+1)2^((2c+1)2^d-1)-1)-1. Сомневаюсь, правда, что она годится для чего-либо практического.
Для действительных чисел, по-видимому, явной формулы не придумаешь, но вообще построить соответствие не проблема. Опять же, идею с объединением цифр по разрядам уже привели. Опять же, при желании можно придумать схему со взаимно-однозначным соответствием. Например, скомбинировав цепные дроби с формулой из предыдущего абзаца. Детали оставляю в качестве несложного упражнения ;)
Ответ написан
Комментировать
dimonchik2013
@dimonchik2013
non progredi est regredi
да, + или . и / % или ' '
Ответ написан
NeiroNx
@NeiroNx
Программист
Все просто: есть три числа (время) 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 (^ - возведение в степень)
Благодаря однозначности разложения на простые множители можно однозначно восстановить четыре исходных числа из результата.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы