хранение большого целого числа

Целое число : 3322000011111010203100311011211322020110122010113111301101000200

Строка целого числа в битах потребовала бы log2 целого числа, которое равно 211.xxxx с округлением до 212 бит.

Какая-то программа на scriptlance говорит, что извлечение квадратного корня из этого значения приведет к небольшому, но он требует больших денег, которых нет. sqrt равен 57636793900346419278364744407607.475108338

Теперь log2 (sqrt Integer) = 105,5 бит.

Но я беспокоюсь, что если мы не сохраним sqrt идеально, мы не сможем восстановить исходное значение,

Вопрос. Можем ли мы сохранить этот квадратный корень в 105,5 бит (округлить, например, 13 байт + 2 бита и т. д.), а затем прочитать и возвести в квадрат значение, чтобы вернуть исходное значение?

Пожалуйста, помогите мне.


person Jason z    schedule 16.05.2012    source источник
comment
На самом деле любой язык, мой программист использует C, и мы предпочитаем C, поскольку он кросс-девайсный.   -  person Jason z    schedule 16.05.2012
comment
Квадратный корень из этого числа не является целым числом. Следовательно, если вы не сохраните его как не целое число, вы не сможете восстановить исходное значение.   -  person Nicol Bolas    schedule 16.05.2012


Ответы (3)


Вопрос: Можем ли мы сохранить этот квадратный корень в 105,5 бит (округлить его, например, 13 байтов + 2 бита и т. д.), а затем прочитать и возвести в квадрат значение, чтобы вернуть исходное значение?

Нет. Вам нужно взять log_2 целого числа (не с плавающей запятой), чтобы увидеть, сколько бит ему нужно. Пример: Log_2(256) = 8 бит. Этот номер можно сохранить как 0x10000000. Однако Log_2(256.123456789) ~= 8 бит. Однако во втором номере, очевидно, больше информации.

Чтобы обойти это, вы можете умножить свое значение на степень 2 или 10 и сохранить его как целое число (по сути, это фиксированная точка: http://en.wikipedia.org/wiki/Fixed-point_arithmetic). Итак, в вашем примере умножьте 57636793900346419278364744407607,475108338 на 10 ^ 9, чтобы получить целое число: 57636793900346419278364744407607475108338, которое вы бы сохранили. Log_2 этого числа составляет 135,4, поэтому вам нужно как минимум 136 бит информации, чтобы точно сохранить это число.

person Mark    schedule 30.05.2012

Но я беспокоюсь, что если мы не сохраним sqrt идеально, мы не сможем восстановить исходное значение,

Вопрос: Можем ли мы сохранить этот квадратный корень в 105,5 бит (округлить, например, 13 байтов + 2 бита и т. д.), а затем прочитать и возвести в квадрат значение, чтобы вернуть исходное значение?

No.

По сути, вы спрашиваете, можете ли вы взять 212 бит информации, сжать их до 106 бит, извлекая квадратный корень, а затем восстановить исходные данные без потерь. Этого нельзя делать.

Если бы это было возможно, вы могли бы применить тот же метод к 106 битам, чтобы сжать их до 52 бит, затем до 26 и т. возможность восстановить исходные данные.

person NPE    schedule 16.05.2012
comment
Извините, ваш общий ответ неудовлетворителен, я спрашиваю о единственном номере, который я разместил выше, а не о всех возможных номерах. log₂ 57636793900346419278364744407607.475108338 составляет 105,5 бит. Пожалуйста, подскажите, как сохранить и извлечь его из того же количества бит. - person Jason z; 16.05.2012

Вы не можете этого сделать, так как квадратный корень числа не всегда является целым числом. И вы не можете точно хранить числа с плавающей запятой. Итак, проблема: 1. если вы храните квадратный корень, вам придется хранить число с плавающей запятой. что само по себе занимает больше места и также является неточным. 2. Как указывает AIX, если это возможно, вы можете повторить ту же процедуру, а затем восстановить произвольные длинные числа только в , возможно, только в 2 байта. Один байт для хранения значения, а другой для хранения того, сколько раз возводить в квадрат.

person saurabh jindal    schedule 16.05.2012
comment
log₂ 57636793900346419278364744407607.475108338 - это 105,5 бит. Подскажите, как его сохранить и получить обратно :) Это то, что я хочу, используя GMP или что-то еще. - person Jason z; 16.05.2012
comment
Итак, я должен считать, что log₂ 57636793900346419278364744407607.475108338 равен 105,5 битам НЕПРАВИЛЬНО? - person Jason z; 16.05.2012
comment
@jason, кажется, я не правильно понимаю вопрос. Я понял, что вы спрашиваете, как мы можем сохранить произвольное длинное целое число (скажем, если оно может быть сохранено только в 200 битах) в 64 бита. Если это ваш вопрос, то это невозможно. - person saurabh jindal; 16.05.2012
comment
На самом деле, когда я делаю это в калькуляторе: log₂ 57636793900346419278364744407607.475108338 Ответ 105,5 Это означает (что я вижу), это число либо с плавающей запятой, либо с целым числом требует 105,5 бит для хранения. Это правильно или неправильно? Если это правильно, дайте мне пример любого языка программирования, чтобы сохранить его в 105,5 бит или округленных байтах, а затем прочитать, и при чтении он дает мне значение 57636793900346419278364744407607.475108338. Надеюсь теперь понятно. Это просто о хранении и извлечении. Спасибо. - person Jason z; 16.05.2012
comment
3322000011111010203100311011211322020110122010113111301101000200 — целое число без плавающей запятой, сэр. И Log_2 этого номера — 211.013522056. - person Jason z; 31.05.2012