Pull to refresh

Comments 16

1. У вас нет четкого определения вашей конкатенации.
Например, для чисел вполне очевидно, что 1 || 23 != (1*10+23).
Вот и получается, что речь идет не о конкатенации, а о «приписывании цифры справа». Довольно сомнительной интересности операция.
2. А как конкатенация ведет себя с другими операциями? (очень плохо, в плане всяких там дистрибутивностей).
3. Вся полезность вашего подхода по переводу между системами счисления нивелируется необходимостью операций в этой системе счисления. Грубо говоря, вот вы хотите перевести число 90 из десятичной в систему счисления с основанием 7. По вашему алгоритму нужно посчитать (9*10)+0, что в сс7 12*13. И как это считать? Столбиком, с таблицей умножения в сс7?
Вся полезность вашего подхода по переводу между системами счисления нивелируется необходимостью операций в этой системе счисления. Грубо говоря, вот вы хотите перевести число 90 из десятичной в систему счисления с основанием 7. По вашему алгоритму нужно посчитать (9*10)+0, что в сс7 12*13. И как это считать? Столбиком, с таблицей умножения в сс7?
Да. При этом умножение/сложение намного проще деления. Но нам и действий нужно выполнить гораздо больше, чем в классическом переводе через деление столбиком. В-общем, необходимы O(n) — оценки, чтобы понять, имеет ли какую-то полезность предложенный алгоритм (возможно, что и нет).
Я бы не стал считать О. Просто прикиньте сколько вам нужно памяти для перевода из 2000-ичной системы счисления в 257-ичную. И это только из одной «произвольной» в другую «произвольную».
Просто прикиньте сколько вам нужно памяти для перевода из 2000-ичной системы счисления в 257-ичную
А в чём проблема? Ради максимальной скорости алгоритмы математических пакетов для чисел произвольной длины работают с 232 или с 264-ричными системами. 1 цифра — 1 DWORD/QWORD. Если цифра помещается в int, как в случае с 2000-ичной системой, с ней работать не сложнее, чем с 10-тичной.
Не для представления чисел, а для таблиц, на которые опирается автор метода.
1. Нужна таблица в которой будут представления всех 2000 цифр в 257 системе.
2. Нужна таблица умножения для 257 системы счисления.
257 системе счисления — будет 256 чисел.
В целом нужно просто понять какие системы нам нужны и уже из это исходить.
В целом там не получается каких-то безумных размерностей в данных
Вы легко можете представить число 1234567890 в десятичиной системе или 123456789ABCDEF0 в 16-ричной. Вот возьмем такое число в 2000-ричной: цифры
1, 2, 3,…, 1999, 0. Для ваших вычислений нужно каждую цифру перевести в 257-ичную, а значит в первой таблице будет 2000 чисел в 257-ичной.
Дальше я бы хотел узнать как вы будете умножать два числа в 257 сс, без таблицы умножения 257 на 257.
Вот и получается, что как-то очень много памяти.
Например, для чисел вполне очевидно, что 1 || 23 != (1*10+23).

Да. Просто так делать нельзя. Сама идея, что число любое число состоит из конкатенированных цифр. Т.е. 23 (например в десятичной системе) это 2‖3. Т.е. в описанном вами случае будет 1‖2‖3. В противном случае действительно ничего не сходится. Т.к. операция применяется не правильно.
Вы же сами пишете, что конкатенация ассоциативна, значит 1||2||3 = 1||(2||3) = 1||23.

Да нет, ещё не поправил. Вот ещё один хвост от старого определения конкатенации:

1)...  1 ‖ ( 2 ‖ 3 ) = 33

4) Длина (количество букв) конкатенации слов равна сумме длин операндов: |α ‖ β| = |α| + |β|.

У вас для каждого основания счисления получается разная конкатенация. Этакое параметризованное семейство бинарных операций

Потому что в общем виде, записывая
x || y
нужно понимать, имеется ввиду
x ||10 y
или
x ||16 y
Вы читали главу из Кнута про перевод между системами счисления? Там тоже только умножения и сложения. Написано короче и проще.

a ‖ b = (a * 10) + b - верно только в случае если это b >= 0 и b < 10.

В общем случае десятичной системы a ‖ b = a * 10 ^ [lg(b)] + b,

где [ ] - целая часть числа.

Аналогично для других систем счисления, будет множитель и основание логарифма меняться.

Sign up to leave a comment.

Articles