powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Длинная арифметика. Вопросы по реализации/оптимизации
25 сообщений из 207, страница 5 из 9
Длинная арифметика. Вопросы по реализации/оптимизации
    #38794432
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу операций сложения. Смотрим.

Первые два кейса - достаточно просты.
1) Сложение без переноса. 2) Сложение
и появление ненормализованности. Нормализация
которая приводит рекурсивно еще к одной
нормализации.

Над вариантом (3) я пока еще думаю.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38794434
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38794448
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неудачный вариант примера. Там происходит денормализация и сдвиг вправо 1 единички
за диапазон разрядной сетки. Пока еще не знаю что с этим делать. Можно предположить
что сетка справа - виртуальна.

Вобщем пока возьмем не 10+2 а 11+3.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38795706
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RWolfSashaMercuryRWolf, а сколько же потребуется в среднем операций ? :)

на глаз M + k × (N - M), где k немного больше единицы (для одного случая из десяти сработает перенос в (M+1)-й разряд числа n, для одного из ста — в (M+2)-й и т.д.

мне кажется, ваша аппроксимация верна, на досуге выведу общую формулу возможно.
Dimitry Sibiryakov , я правильно понял, вы снимаете свои предложения по оптимизации ?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38795718
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
у меня такой вопрос, хотелось бы увидеть обоснование данной СС.

Не силён в таких вещах, но для двоичной СС это обоснование (в первом приближении) можно провести следующим образом:
Докажем следующее утверждение: Любое неотрицательно целое число можно разложить по базису в виде , где принимает либо 0, либо 1.

Доказательство:
Фиксируем n. Докажем что . Разложение по базису неотрицательно и имеет минимум в том случае, когда все коэффициенты . Неравенство справа докажем методом математической индукции.
1. -выполнено
2. Предположим что выполнены равенства следующего вида до n включительно

из индукционного предположения докажем что
используя индукционное предположение получим
то

Мы доказали неравенство с обоих сторон.

Разложение по базису даёт нам вариантов. Причём все они ограничены слева и справа. Докажем что число можно разложить по базису единственным образом(отмечу, что сейчас я строю не совсем корректные с точки зрения математики фразы, базис, например, предполагает что по нему можно разложить любой элемент единственным образом, потому возможно стоило формулировать утверждение следующим образом -"Докажем что ... образует базис", опять таки, я не гнался за строгостью в данном доказательстве и обосновании, целью было лишь показать то, что я хочу увидеть от предложенной СС). Доказательство тривиально, предположим что x1=x2 можно разложить с помощью различных комбинаций. Сравнивая два разложения легко можно показать что они равны.
Я думаю, что данное обоснование можно провести для всех СС, основанных на геометрической прогрессии.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38795734
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДля наглядности я нарисовал таблицу для преобразований в ССФ первых 12 целых чисел.
Обратите внимание на одно свойство. Нигде нет подряд идущих двух едниниц.
Пара соседних разрядов всегда образуем сумму с переносом в следующий.

Это таблица нормированных чисел в ССФ. Далее НЧ-ССФ.

Пил компот, и подумал, а нигде и не может быть подряд 2 идущих единиц, если будут две единицы подряд, то по факту это следующий разряд, ибо это значит что наше число будет содержать , то это равносильно
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38795788
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymayton,
у меня такой вопрос, хотелось бы увидеть обоснование данной СС.

Не силён в таких вещах, но для двоичной СС это обоснование (в первом приближении) можно провести следующим образом:
Докажем следующее утверждение: Любое неотрицательно целое число можно разложить по базису в виде , где принимает либо 0, либо 1.

А нет никакого обоснования. Какое обоснование было у Римлян? Да не было.
Просто рисовали символ V как ладонь с большим пальцем отведённым в сторону.
5 пальцев дескыть.

Твои арифметические выкладки мне не очень понятны. Зачем ты приводишь аналогию
с двоичной системой? Фибоначчи избыточна. Это факт И любое число можно записать массой
способов. Чем больше число тем больше вариантов как его записать. Я всего-лишь
выдал своё собственное предположение о том что есть нормализованная форма (1 единственная)
и некоторое количество ненормализованных.

Зачем это нужно? Ну... далее по тексту расскажу.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38796415
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercurymayton,
у меня такой вопрос, хотелось бы увидеть обоснование данной СС.

Не силён в таких вещах, но для двоичной СС это обоснование (в первом приближении) можно провести следующим образом:
Докажем следующее утверждение: Любое неотрицательно целое число можно разложить по базису в виде , где принимает либо 0, либо 1.

А нет никакого обоснования. Какое обоснование было у Римлян? Да не было.
Просто рисовали символ V как ладонь с большим пальцем отведённым в сторону.
5 пальцев дескыть.

Твои арифметические выкладки мне не очень понятны. Зачем ты приводишь аналогию
с двоичной системой? Фибоначчи избыточна. Это факт И любое число можно записать массой
способов. Чем больше число тем больше вариантов как его записать. Я всего-лишь
выдал своё собственное предположение о том что есть нормализованная форма (1 единственная)
и некоторое количество ненормализованных.

Зачем это нужно? Ну... далее по тексту расскажу.

Марк,
я всего лишь провел поверхностное обоснование того, что двоичная система счисления имеет место быть, т.е. что используя разложение можно получить любое неотрицательное целое число, причём единственным образом.
Значение этого разложения лежит в закрытом диапазоне целых чисел от 0 до , и число вариантов разложения(в зависимости от коэффициентов ) равно . Далее я показал, что каждое разложение даёт нам уникальное число в 10чной системе счисления. Исходя из всего этого, наше утверждение доказано.

Вот и хочется видеть, что если основание СС использует разложение Фибоначчи, то мы можем с помощью него получить любое число в 10чной СС, причём единственным образом(если два соседних разряда не установлены в 1). Или доказательство без обоснования единственности.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38796463
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оки доки артишоки. Значить продолжаю свой блог.
Надо формализовать что можно делать с ССФ а что нельзя.

Что можно делать с числов в ССФ?

1) Left transform. Трансформация влево. На примере 2+3=5

Код: plaintext
1.
110 => 1000



2) Right transform. Аналогично. 3 = 2+1

Код: plaintext
1.
100 => 011


3) Protected transform. Запрещенные транформации. Не можем третий весовой коэффициент сдвинуть вправо.
Позиции (1) и (2) уже заняты. Арифметический смысл. В ряду Фибоначчи не может быть одинаковых весовых коэффициентов.
Код: plaintext
1.
111 => 01X



4) Negative and Frac. Отрицательные и дробные значения. . Пока не определены. Младший ВК=1 вправо не сдвигается.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38796495
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryя всего лишь провел поверхностное обоснование того, что двоичная система счисления имеет место быть, т.е. что используя разложение можно получить любое неотрицательное целое число, причём единственным образом.
Значение этого разложения лежит в закрытом диапазоне целых чисел от 0 до , и число вариантов разложения(в зависимости от коэффициентов ) равно . Далее я показал, что каждое разложение даёт нам уникальное число в 10чной системе счисления. Исходя из всего этого, наше утверждение доказано.

Вот и хочется видеть, что если основание СС использует разложение Фибоначчи, то мы можем с помощью него получить любое число в 10чной СС, причём единственным образом(если два соседних разряда не установлены в 1). Или доказательство без обоснования единственности.
Ну... круто конешно. Только ты зря сильно напрягаешся с мат-аппаратом. Я на ходу "постулирую"
алгебру. Пока - я иду шаги которые аксиоматичны. Это как точка и прямая. Ну.. нечего пока доказывать.

И я не зря привёл Римскую систему как пример. Она - непозиционна. Это означает что в ней нет понятия веса в зависимости
от позиции. И операции в столбик в ней не работают. Ну по крайней мере как в десятичной.

И не похожа на двоичную.

ССФ как я полагаю является позиционной, многозначной системой. Последний тег означает
что есть много способов записать одно число. Это вроде как избыточность. ИЧСХ она тоже не похожа
на двоичную. Внешняя аналогия - обманчива. Мне просто удобно записывать ССФ как двоичный код.

Пример многозначных определний числа 21 = Fib(1000000) (нормализовано) =
= Fib(110000) = Fib(101100) = Fib(101011)

P.S. Это моё чортово ИМХО.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38796505
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНеудачный вариант примера. Там происходит денормализация и сдвиг вправо 1 единички
за диапазон разрядной сетки. Пока еще не знаю что с этим делать. Можно предположить
что сетка справа - виртуальна.

Вобщем пока возьмем не 10+2 а 11+3.

Я бы не использовал термин денормализация . Числа бывают нормализованные и ненормализованные.
Причём это всё вроде бы, если мне не изменяет моя память, о мантиссе числа с плавающей точкой.
А целые -- они бывают в доп-коде и со знаком. Допкод встречается чаще, там никаких нормализаций нет.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38796529
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно сказать свёртка .
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38797449
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonОки доки артишоки. Значить продолжаю свой блог.
Надо формализовать что можно делать с ССФ а что нельзя.

Что можно делать с числов в ССФ?

1) Left transform. Трансформация влево. На примере 2+3=5

Код: plaintext
1.
110 => 1000



2) Right transform. Аналогично. 3 = 2+1

Код: plaintext
1.
100 => 011


3) Protected transform. Запрещенные транформации. Не можем третий весовой коэффициент сдвинуть вправо.
Позиции (1) и (2) уже заняты. Арифметический смысл. В ряду Фибоначчи не может быть одинаковых весовых коэффициентов.
Код: plaintext
1.
111 => 01X



4) Negative and Frac. Отрицательные и дробные значения. . Пока не определены. Младший ВК=1 вправо не сдвигается.

артишоки :DDD

а почему в первом примере у вас 2 единицы расположены рядом ?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38797456
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из ненормализованной формы Fib(110) перевел в нормализованную Fib(1000).

2+3=5
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38797458
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
артишоки :DDD
Это цитата из фильма .
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38797465
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я долго смеялся :D такой фильм не видел

а второй пример наоборот. Я думал что если мы работаем с ССФ, то уже предполагаем что две 1 рядом не будут расположены.(разница между ненормализованной и нормализованной понятна, думал что ССФ нормализованная).

Доброго времени суток :)
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38797476
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Илья предлагает не использовать эти термины. Можно их заменить на
свёрнутая и развёрнутая формы.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38797493
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не вытерпел, достал "Популярные лекции по математике": Н.Н. Воробьёв, "Числа Фибоначи", 5-е издание, 1984 г.
Стр.37Фактически описанный процесс является последовательным выделением из числа a слагаемых, равных наибольшим возможным числам ФибоначчиПодчёркнуто мною.
Далее доказывается, что:Стр.38всякая последовательность из n -1 нулей и единиц, начинающаяся с единицы и не содержащая двух единиц подряд, есть фибоначчиева запись Ф(a) некоторого числа a
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38797604
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вась. Ну вот отлично. Ты вычитал умную статью. Я же не против того что в номальном
числе в ФСС нет подряд идущих единиц.

Но мне для РЕАЛИЗАЦИИ операции сложения в столбик необходимо временно
денормализовать число.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38798021
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВась. Ну вот отлично. Ты вычитал умную статью. Я же не против того что в номальном
числе в ФСС нет подряд идущих единиц.

Но мне для РЕАЛИЗАЦИИ операции сложения в столбик необходимо временно
денормализовать число.

если временно, то почему нет :)
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38817949
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Сегодня утром сделал следующий, вполне обоснованный вывод, по части именования переменных в которых хранится информация о длине строки.
У нас есть стандартная функция
Код: plaintext
1.
size_t strlen(const char* s)

, она возвращает число символов без терминального нуля. Таким образом, мы можем именовать переменную в которой содержится это значение либо len, либо size, либо s, но size название неудачное, в силу того, что уже есть имя типа данных с похожим название,
Код: plaintext
1.
size_t size =strlen(s); 

Имя s также не подходит, в силу того, что s больше ассоциируется со строкой
Код: plaintext
1.
size_t s =strlen(str);


Остаётся вариант len(l не подходит, в силу того, что похожа на 1):
Код: plaintext
1.
size_t len=strlen(s);  



Допустим нам нужно передать в функцию длину строки вместе с завершающим нулем, вариант len не подходит, ибо как мы поймём по прототипу функции что мы передаём, длину с завершающим нулем или нет. Остаётся вариант с мощностью p.
Код: plaintext
1.
size_t p=strlen(s)+1;  


Удобно, коротко, нативные ассоциации в связи с тем, что строка есть массив/множество символов.


Сделал умножение, алгоритм мне не нравится, ибо мне кажется что он далеко не оптимален. Тут код С++, потому что мне сложно отказаться от тернарного оператора. Он мне слишком нравится, чтобы его не использовать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
//УМНОЖЕНИЕ
//s-строка,num-число
//функция оптимизированна под умножение строки на строку за счёт сдвига shift
int la_multiplication_string_on_num_inplace(char* res, size_t p, const char* s, size_t ps, unsigned int num, int sh)
{
	if ((ps == MIN_POW && s[0] == '0') || (num == 0))
	{
		*res++ = '0';
		*res = '\0';
		return 0;
	}
	memset(res, '0', p);
	int d = 0;
	for (int i = ps - 2; i >= 0; --i)
	{
		int t = (s[i] - SHIFT)*num + d;
		int t1 = t % 10;
		res[i + 1] = t1 + SHIFT;
		d = (t - t1)/10;
	}
	res[p - 1] = '\0';
	!d ? (char)memmove(res, res + 1, p - 1) : res[0] = d + SHIFT;
	return 0;
}

//умножение строки на число. обёртка s*num*10^sh
char* la_multiplication_string_on_num(const char* s, unsigned int num, int sh)
{
	size_t ps = strlen(s)+1;
	if (ps > MAX_POW)
	{
		printf("Incorrect size of the string(s).\n");
		return NULL;
	}
	size_t p = ps + 1+sh;//реализую умножение на 10^sh
	char* res = allocate_memory(p);
	la_multiplication_string_on_num_inplace(res, p, s, ps, num, sh);
	return res;
}

int la_multiplication_inplace(char* res, size_t p, const char* s1, size_t p1, const char* s2, size_t p2)
{
	memset(res, '0', p);
	*(res + p - 1) = '\0';
	for (int i = p2 - 2; i >= 0; --i)
	{
		char* t = la_multiplication_string_on_num(s1, s2[i] - SHIFT, p2 - 2 - i);
		char* t2=la_sum(res, t);
		memcpy(res + p - 1 - strlen(t2), t2, strlen(t2));
		free(t2);
		free(t);
	}
	return 0;
}

char* la_multiplication(const char* s1, const char* s2)
{
	size_t p1 = strlen(s1) + 1;
	size_t p2 = strlen(s2) + 1;
	size_t p = p1 + p2 - 1;
	if (p > MAX_POW)
	{
		printf("Incorrect size of the string(s).\n");
		return NULL;
	}
	char* res = allocate_memory(p);
	la_multiplication_inplace(res, p, s1, p1, s2, p2);
	res[0]=='0' ? (char)memmove(res, res + 1, p - 1) : 0;
	return res;
}
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38817978
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот сейчас делаю сочетания, может быть кто-нибудь подскажет как обосновать что этот алгоритм будет работать за один проход ? Либо обратное ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
//Сочетания
char* la_combination(unsigned n, unsigned m)
{
	int* up = (int*)malloc(sizeof(int)*m);//числитель
	int* down = (int*)malloc(sizeof(int)*m);//
	for (int i = 1; i <= m; ++i)
	{
		*(up + i - 1) = n - m + i;
		*(down + i - 1) = i;
	}
#ifdef DEBUG
	for (int i = 0; i < m; ++i)
		printf("%i ", up[i]);
	printf("\n");
	for (int i = 0; i < m; ++i)
		printf("%i ", down[i]);
	printf("\n");
#endif

	//сокращаем знаменатель в один проход. Необходимо обоснование того, что это можно сделать за один проход
	for (int i = 0; i < m; ++i)
	{
		if (down[i] != 1)
		{
			for (int j = 0; j < m; ++j)
			{
				if (!(up[j] % down[i]))
				{
					up[i] /= down[i];
					down[i] = 1;//если этот алгоритм верный, то эта строчка не нужна
				}
			}
		}
	}
#ifdef DEBUG
	for (int i = 0; i < m; ++i)
		printf("%i ", up[i]);
	printf("\n");
	for (int i = 0; i < m; ++i)
		printf("%i ", down[i]);
	printf("\n");
#endif
	return NULL;
}
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38817979
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощение, ошибка
Код: plaintext
1.
up[j] /= down[i];
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38817981
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Меня опять терзают смутные сомнения", что тяжело вам будет в коллективе программистов с вашим подходом к именованию переменных.
Числитель и знаменатель это, всё-таки, nominator и denominator.
Что до доказательства ... Факториал тривиально развёртывается в цикл.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38817985
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,
только исходя из того что этот код для программистов, а не для математиков, я назвал числитель и знаменатель так, как назвал. И несмотря на это, мне это именование нравится(причем вполне обоснованно нравится), ибо эти слова похожи, и их смысл сразу понятен, даже для тех, кто не знает английский язык.
К сожалению, ваше доказательство не подходит.

PS
(не обижайтесь пожалуйста, но у вас ошибка в слове числитель, правильно numerator)
...
Рейтинг: 0 / 0
25 сообщений из 207, страница 5 из 9
Форумы / C++ [игнор отключен] [закрыт для гостей] / Длинная арифметика. Вопросы по реализации/оптимизации
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]