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


Написал такую программу(реализовал длинную арифметику для натуральных чисел):
Код: 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.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE_CHAR 1

#define NDEBUG
#define NDEBUG_DEEP

//Сумма двух строк
char* sum_string_string(const char* s1, unsigned int p1, const char* s2, unsigned int p2)
{
	if (s1 == NULL || s2 == NULL)
	{
		return NULL;
	}
	int p_max, p_min, delta;
	const char* s_min;
	const char* s_max;

	(p1 > p2) ? (p_max = p1, p_min = p2, s_min = s2,s_max=s1) : (p_max = p2, p_min = p1, s_min = s1,s_max=s2);
	delta = p_max - p_min;
	char* s_temp = (char*)malloc(p_max*SIZE_CHAR);
	for (int i = 0; i < delta; ++i)
	{
		*(s_temp + i) = '0';
	}
	for (int i = delta; i < p_max; ++i)
	{
		*(s_temp + i) = *(s_min + i - delta);
	}

	int pow_res = p_max;
	char* res = (char*)malloc(pow_res*SIZE_CHAR);
	unsigned char d = 0;
	for (int i = pow_res - 2; i >= 0; --i)
	{
		int t = *(s_max + i) + *(s_temp + i) - 2 * '0';
		t = t + d;
		d = t / 10;
		*(res + i) = t - 10 * d + '0';
	}
	if (d > 0)
	{
		pow_res += 1;
		res = (char*)realloc(res,pow_res*SIZE_CHAR);
		//побайтовый сдвиг
		for (int i = pow_res - 2; i >= 0; --i)
		{
			*(res + i + 1) = *(res + i);
		}
		*(res + 0) = d + '0';
	}

	*(res + pow_res - 1) = '\0';

	free(s_temp);
	return res;
	}

//Произведение строки из числе на число меньше 10, на вход должна подавать Си-строка, колиечество символов строки, число.
char* mpl_string_to_const(const char* s, unsigned int pow_s, unsigned char c)
{
	if (s == NULL || c >= 10)
	{
		return NULL;
	}
	if (c == 0)
	{
		char* res = (char*)malloc(2);
		*(res + 0) = '0';
		*(res + 1) = '\0';
		return res;
	}

	char* res=NULL;
	res= (char*)realloc(res,pow_s*SIZE_CHAR);
	unsigned char d = 0;
	
	for (int i = pow_s-2; i >=0; --i)
	{
		char t = (*(s + i)-'0')*c;
		t += d;
		d = t/10;
		*(res + i) = (t - 10 * d)+'0';
	}
	if (d > 0)
	{
		pow_s+=1;
		res = (char*)realloc(res, pow_s*SIZE_CHAR);
		//побайтовый сдвиг
		for (int i = pow_s-2; i>=0; --i)
		{
			*(res + i +1) = *(res + i);
		}
		*(res + 0) = d+'0';
	}
	*(res + pow_s-1) = '\0';
	return res;
}

//Произведение двух строк
char* mpl_str_to_str(const char* s1, unsigned p1, const char* s2, unsigned p2)
{
	if (s1 == NULL || s2 == NULL)
	{
		return NULL;
	}
	char* res = (char*)malloc(2 * SIZE_CHAR);
	*res = '0';
	*(res + 1) = '\0';
	unsigned p_res = 2;
	
	for (int i = 0; i < p2 - 1; ++i)
	{
		char* t = mpl_string_to_const(s1, p1, *(s2 + i)-'0');
		unsigned p_p = strlen(t);
		unsigned p_c = strlen(t) + p2 - i-1;
		t = (char*)realloc(t, p_c);
		for (int i = p_p; i < p_c-1; ++i)
		{
			*(t + i) = '0';
		}
		*(t + p_c - 1) = '\0';
		res = sum_string_string(res, p_res, t, p_c);
		p_res = strlen(res) + 1;

	}
	return res;
}

char* get_big_factorial(unsigned a)
{
	char* res = (char*)malloc(2 * SIZE_CHAR);
	*res = '1';
	*(res + 1) = '\0';

	if (a == 0 || a == 1)
	{
		return res;
	}

	for (int i = 1; i <= a; ++i)
	{
		char* t=(char*)malloc(10);
		sprintf(t, "%d", i);
		res = mpl_str_to_str(res, strlen(res) + 1, t, strlen(t) + 1);
	}
	return res;


}

int main(int argc, char** argv)
{
	FILE* in = fopen("input.txt", "r");
	if (!in)
	{
		printf("File 'input.txt' not found.\n");
		return 0;
	}

	int a;
	fscanf(in, "%i", &a);
	char* b = (char*)malloc(50000);

	FILE* out = fopen("output.txt", "w");
	
	b = get_big_factorial(a);
	fprintf(out, "%s", b);
	
	fclose(in);
	fclose(out);
	return 0;
}



С первого раза система её приняла (правда до этого я тестировал функции самостоятельно). Потом посмотрел как это делается в сети. Алгоритмы примерно одинаковые, только с памятью немного по другому работают.

Также, возможно, нет необходимости передавать длину строк в функции, если её можно вычислить с помощью функции size_t strlen(const char* ).
Посмотрел раздел лучшие решения, и увидел на первом месте программу на C++ размером 165 символов. Я был удивлён, моя занимает в 10 раз больше, и даже с учётом оптимизаций, она будет в 5 раз больше. Первым делом я поискал библиотеки для работы с длинными числами(стандартные), но то ли плохо искал, то ли их и правда нет.

Подскажите пожалуйста, в каком направлении нужно двигаться, чтобы понять как эту программу можно написать за 165 символов.(не прошу вас писать и тратить на это своё время)
И ещё, можно не передавать количество символов в функции, или правильно передавать ?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38715588
Strangecat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury, стандарт де-факто для работы с большими числами - GMP. https://gmplib.org/
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38715838
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury , Сашок. Есть сообщество JavaScript кодеров. Они пилят шахматы в 5 килобайт.
Это очень интересный мозго*б-трах. Повышает гибкость и олимпиадное мышление. К сожалению
для промышленных задач он весьма и весьма бесполезен.

Ну какое ты преимущество получишь если будет 165 символов ? Засилье defines и полную нечитабельность.

Если реально ищешь краткости и концентрации мысли то иди в Haskell. Там такие задачки кодят в три строки
что у меня стучит челюсть об клавишу пробел.

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

Тут ещё дело в подходах. Некоторые хранят числа как с фиксированной точкой. но не char-encoded, и не BCD (кстати, в некоторых машинах есть прямая поддержка BCD на уровне машинных комманд), а в виде числа, хранящегося в системе счисления по основанию 256 (по, надеюсь, понятной причине).
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38716054
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, спасибо, и вас с пятницей C:

не ищу краткости, мне нравятся стройность, красота, оптимальность кода.

MasterZiv, тогда в одном символе я могу хранить 256 значений. Значит в 8 символах, например, будет 256^8 значений. Или причина другая ?


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

не ищу краткости, мне нравятся стройность, красота, оптимальность кода.

Вот сейчас ты сказал несколько противоречивых на мой взгляд тезисов. Или требующих дополнения.

Обрати внимание также на формулу Стирлинга.
https://ru.wikipedia.org/wiki/Факториал
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38716160
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercurymayton, спасибо, и вас с пятницей C:

не ищу краткости, мне нравятся стройность, красота, оптимальность кода.

Вот сейчас ты сказал несколько противоречивых на мой взгляд тезисов. Или требующих дополнения.

Обрати внимание также на формулу Стирлинга.



Мне нравится оптимальное сочетание этих вещей, ну и вообще - всё в меру. Слишком слабо знаю язык Си, и теорию языков программирования, чтобы серьёзно об этом рассуждать. Но думаю в дальнейшем я смогу сделать обоснованные выводы на эту тему. Мне кажется к этим выводам я приду совершенно случайно, может быть перед сном, или в автобусе. Это как понимание актуальности классов, я знал что они есть, и даже использовал их в C#, но не понимал почему без них нельзя. Но когда писал методы для работы с матрицами на С, у меня возникло желание объединить методы и характеристики объектов. Теперь я понимаю, что без них скорее всего можно обойтись, но для грамотной декомпозиции, классы могут быть актуальны.

Спасибо, о формуле Стирлинга я подумал в первую очередь, но в любом случае, придётся использовать длинную арифметику.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38723109
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сегодня вновь пришлось с ней обратиться, и я решил "погуглить", как мне советовал Anatoly Moskovsky.
Наткнулся на работу одного товарища, вот этого

[quote ссылка ]
Hi. I'm a former grad student of the Department of Computer Sciences at The University of Texas at Austin. I received my Ph.D. in Computer Sciences on May 18, 2002. I'm now an assistant professor in the Department of Computer Science at Rutgers University.
[/quote]

Университет тоже вроде приличный .

Вот сама работа

Настроение от прочтения данной работы у меня испортилось, потому что мне практически ничего не понравилось.

Начало всё с обычных вещей:

авторSome compilers, such as GCC, offer a "long long" type, giving 64 bits capable of representing about 9 quintillion (9 times 1018)


1. Какие компиляторы ? При чём тут это ? Есть стандарт, там написано чёрным по белому о том что существует тип данных long long int. Он должен был написать про стандарт, и про то что некоторые компиляторы могут поддерживать такой тип данных.
2. Он должен был написать про то что существуют extendet integer types, fe __int128


Далее,
авторIn our new representation, we have an array of "digits" (integers) in some base b. Typically, b = 10, our normal decimal number system; that makes things easy to print. The 0'th array element is the 1's place, the #1 element is the ten's place, the #2 element is the hundred's place, and so forth (really, the b0's place, the b1 place, the b2 place, etc.)

3. Где хоть слово про последний элемент ??? Я очень хотел встретить терминальный нуль //далее в комментариях я встретил

и самое главное
4. Где обоснование что числа в длинной арифметике нужно хранить реверсом (хотя вот тут я его не виню, может быть это очевидно для людей со степенью PhD(тут без иронии говорю))

5. Он вводит в работе BASE. Но ничего не говорит о том, каков лимит символов для одного long integer

6. Мне так и не понятно как грамотно работать с памятью, выделять сразу максимум(если его надо вводить-скорее всего надо), например 1000 символов, и потом уменьшать размере выделенной памяти, либо выделять память в два этапа, минимальный размер, +1 если будет переполнение. Или выделять 500 символов сразу, а потом довыделять.

7. Ни одна из его функций ничего не возвращает, мне это не нравится.

Верны ли мои комментарии ? Дайте пожалуйста ответы на вопросы которые есть в них. Или дайте ссылку где все эти вопросы решены(Чувствую что есть в Кнуте, но у меня первый том, и я пока этого там не встретил).
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38723169
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury6. Мне так и не понятно как грамотно работать с памятью, выделять сразу максимум(если его надо вводить-скорее всего надо), например 1000 символов, и потом уменьшать размере выделенной памяти, либо выделять память в два этапа, минимальный размер, +1 если будет переполнение. Или выделять 500 символов сразу, а потом довыделять.

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

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

mayton, мне интересна классическая постановка и классическое решение. Я уже эту задачу решил но мне нужно знать как это делать оптимально, и правильно.
1) Тогда используй "классический" подход. Выделяй ровно столько сколько надо через malloc. Перевыделяй через realloc.

2) Что нужно удалять?. И зачем?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38723568
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, насчёт удалять я не прав, это не нужно. То есть делать функции для строк любой мощности ?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38723573
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНет, насчёт удалять я не прав, это не нужно. То есть делать функции для строк любой мощности ?

Я вот щас хватаюсь за голову и вспоминаю что такое мощность . Я знаю мощность из физики. Как работа на время.
Я знаю мощность множеств из курса дискретной математики. Есть экономические мощности e.t.c.

Но что такое мощность строк ?

Может прояснишь?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38723579
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имею ввиду мощность множества из дискретной математики, ведь строка это массив символов(или аналог - множество). Потому количество символов в строке называю мощностью :)
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38723586
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мультимножество наверное хотел сказать. Ну вобщем не прикалывайся. Запутал только.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38723603
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ахах, не буду прикалываться :D меня гонят.До свидание всем.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38723619
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМультимножество наверное хотел сказать.
Может просто "длина"? Раз о строках речь.

PS SashaMercury будь проще и люди к тебе потянутся (с), а то как в анекдоте:
- Не подскажете как найти площадь Ленина?
- Элементарно, умножьте высоту Ленина на ширину :)
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38724556
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Весёлый анекдот C:

Дело в том, что слово мощность, подразумевает множество элементов, потому когда я говорю "мощность строки", то я подчёркиваю что имею дело с массивом символов, а не с неким элементов строки. Слово длина больше ассоциируется с ростом, длиной чего-нибудь в сантиметрах. Кстати, мощность равная нулю, это указатель, на который не выделенна память. Бесконечная мощность, я думаю тоже существует, в каких-нибудь алгоритмах, чувствую, появляется абстрактная бесконечная строка.

Впрочем я гуглил, и не нашёл что-бы кто-нибудь из приличных учёных так говорил. Хотя, возможно мало искал, и в дальнейшем встречу у Хоара, или кого-нибудь ещё. В любом случае, пока я не получил чёткого "Почему правильней говорить длина строки, чем более естественная и очевидная фраза мощность строки".

Еще, возможно у каждого программиста есть свой стиль, именования переменных, комментариев (тут конечно smald отличился :D), и т.п. Пока я именую так, хотя и учитываю мнение некоторых представителей Сообщества.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38724584
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВпрочем я гуглил, и не нашёл что-бы кто-нибудь из приличных учёных так говорил.
Плохо гуглил, хэлпа достаточно
http://www.cplusplus.com/reference/cstring/strlen/ strlen

size_t strlen ( const char * str );

Get string length
Returns the length of the C string str.
length однозначно переводится как "длина". Поэтому и привыкли все что у строк длина.

PS Еще вес в метрах бывает
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38724589
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Снова я плохо объяснил ( Не нашёл чтобы кто-то говорил pow и мощность. Длину я много раз встречал ) Практически везде.

Но вес в метрах не слышал. Сейчас узнаю
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38724638
Strangecat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сашок, ты в курсе что означает буква в GMP? Её не глупые люди пишут, можешь глянуть раз так интересно.


автор. В любом случае, пока я не получил чёткого "Почему правильней говорить длина строки, чем более естественная и очевидная фраза мощность строки".
Бросай курить. Мощность строк это ни разу не естественно. И не очевидно.

авторPS Еще вес в метрах бывает
PS. Ещё сила бывает в своих собственных килограммах .
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38724698
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А дисперсия массы измеряется в килограммах квадратных. А чём мы вообще тут говорим?

Саш. Культура обещения начинается с терминологии. Используй правильные термины и будешь понят.
А если ты поэт и писатель и вообще тебе нравится придумывать новые слова - то ты ошибся форумом.

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

Привел несколько доводов в пользу слова мощность.
StrangecatБросай курить. Мощность строк это ни разу не естественно. И не очевидно.

Думаю что для любого изучающего в школе математику естественна связь, хоть может быть, не очевидно что именно так нужно называть.

maytonСаш. Культура обещения начинается с терминологии. Используй правильные термины и будешь понят.
А если ты поэт и писатель и вообще тебе нравится придумывать новые слова - то ты ошибся форумом.

Народ не поймет и будешь бит сообщестом. Зачем это тебе?

Просто хочу понять почему так. Пока делаю вывод: "Слово мощность подходит, но лучше использовать слово длина, в силу исторических причин". Понял. Больше на эту тему не дискутирую. Раз всем так не нравится. Возможно, дело в том что я слишком мало знаю в IT, потому так рассуждаю.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38725126
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше - размер/size :)
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38725266
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

под размером обычно понимается число занимаемых байт.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38726028
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RWolfпод размером обычно понимается число занимаемых байт.
Нет такого обычая.
Размер это просто размер. В любых единицах.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38726029
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЯ могу сказать "половина сантиметра", но не могу сказать "половина символа".Вот математик может быть и не может сказать "половина символа", а тот кто изучает computer science может...
Существует единица измерения "ниббл" (nibble) которая как раз и является половиной символа.
В нынешнее время она почти не используется, но...

SashaMercuryПривел несколько доводов в пользу слова мощность.Неубедительные доводы.


SashaMercuryПросто хочу понять почему так.Термины придумываются так, чтобы наиболее точно отражать внутреннюю сущность описываемого объекта. Потом, с течением времени, могут появляться искажения терминов или смена сущности объекта, тогда термин перестает быть прямым описанием сущности и становится просто традиционным названием. И тогда остается только зазубривать его...
А еще бывают жаргонные словечки которые оказались настолько удобны что доросли до статуса терминов, при этом все уже забыли источник этого жаргонизма...

И в любом случае, прочитай совет mayton'а еще раз и прими его.


SashaMercuryПока делаю вывод: "Слово мощность подходит, но лучше использовать слово длина, в силу исторических причин". Понял. Больше на эту тему не дискутирую. Раз всем так не нравится. Возможно, дело в том что я слишком мало знаю в IT, потому так рассуждаю.Слово мощность совсем не подходит.
Я тебе уже говорил и повторю еще раз: математика и информатика это две разные науки.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38776909
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте, Сообщество C:

SS4. Где обоснование что числа в длинной арифметике нужно хранить реверсом (хотя вот тут я его не виню, может быть это очевидно для людей со степенью PhD(тут без иронии говорю))

сегодня столкнулся с аналогичной проблемой(аналогичной названию топика). Подскажите пожалуйста, как всё же делать правильно ? Использовать ли реверс ?
По поводу памяти, и максимальной длины строки я решил следующее: нужно вводить максимальную планку, так возможно будет безопаснее. Вы согласны ? Или я преувеличиваю.

Хочу увидеть классическое, грамотное решение данное задачи. Понимаю, что вы можете снова предложить погуглить(Анатолий ), но результаты этого процесса я обсуждал выше, то что я нашёл мне не понравилось, причём не понравилось обоснованно(как мне кажется).
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38777026
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЗдравствуйте, Сообщество C:

SS4. Где обоснование что числа в длинной арифметике нужно хранить реверсом (хотя вот тут я его не виню, может быть это очевидно для людей со степенью PhD(тут без иронии говорю))

сегодня столкнулся с аналогичной проблемой(аналогичной названию топика). Подскажите пожалуйста, как всё же делать правильно ? Использовать ли реверс ?
По поводу памяти, и максимальной длины строки я решил следующее: нужно вводить максимальную планку, так возможно будет безопаснее. Вы согласны ? Или я преувеличиваю.

Хочу увидеть классическое, грамотное решение данное задачи. Понимаю, что вы можете снова предложить погуглить(Анатолий ), но результаты этого процесса я обсуждал выше, то что я нашёл мне не понравилось, причём не понравилось обоснованно(как мне кажется).

gmp изучал ?

на счет реверса -- я не очень сильно в теме, но я впервые слышщу о необходимости хранить числа начиная с младших разрядов.

P.S. Мало кто понимает, но мы все (большинство европейцев) пишем слова СЛЕВА НАПРАВО, а числа -- СПРАВА НАЛЕВО, и только арабы (ну, и евреи разумеется) пишут и то, и то одинаково. Для правильного написания текста, состоящего из цифр и букв разных алфавитов придуман специальный алгоритм, именуемый BIDI, и зафиксированный в спецификации UNICODE.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38779277
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Нет, gmp не изучал. Сейчас посмотрю.
Переделал алгоритм, не то чтобы переделал, просто написал заново, смотрю на свой предыдущий код, и вижу много различий. Код стал другой. Странно. Буду разбираться.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38779279
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы имеете ввиду систему норм и правил в отношении производства или библиотеку Си для вычислений с плавающей точкой ?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38790101
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Сегодня читал Спинеллиса, Анализ программного кода. Встретил описание интересных функций, memset,memcpy,memmove. Посмотрите какой код я предлагаю в качестве оптимального(на данный момент, буду рад предложениям по оптимизации) для сложения двух длинных неотрицательных чисел до использования этих функций.

Код: 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.
#define MAX_POW 1001+1
//сумма двух целых неотрицательных чисел s1,s2>=0
char* la_sum(const char* s0, const char* s1)
{
	int len[2] = { strlen(s0), strlen(s1) };
	int max_i = (len[0] > len[1]) ? 0 : 1; //индекс максимальной строки
	int min_i = 1 - max_i;//индекс минимальной строки
	const char* max_s = (max_i == 0) ? s0 : s1;
	const char* min_s = (min_i == 0) ? s0 : s1;

	if (len[max_i] > MAX_POW - 1)
	{
		printf("Incorrect size of the string(s).\n");
		return NULL;
	}
	
	int len_res = len[max_i] + 1 + 1;//просим на 1 Байт больше чтобы исключить вероятность повторного аллоцирования
	char* res = (char*)malloc(len_res*sizeof(char));
	for (int i = 0; i < len_res; ++i)
	{
		*(res + i) = '0';
	}


	for (int i = 0; i < len[min_i]; ++i)//пишем в конец результирующей строки минимальное число
	{
		*(res + len[max_i] - len[min_i] + i + 1) = *(min_s + i);
	}

	//основная часть алгоритма
	int d = 0;
	for (int i = len_res - 2; i > 0; i--)
	{
		int t0 = *(res + i) + *(max_s + i-1) + d - 2 * '0';
		int t1 = t0 % 10;
		*(res + i) = t1 + '0';
		d = (t0>=10) ? 1 : 0;
	}
	*(res + len_res - 1) = '\0';
	if (d == 0)//сдвиг
	{
		for (int i = 0; i < len_res-1; ++i)
		{
			*(res + i) = *(res + i + 1);
		}
	}
	else
	{
		*(res + 0) = d + '0';
	}
	return res;
}



Чем меня раньше смущала такой участок кода ?
Код: plaintext
1.
2.
3.
4.
	for (int i = 0; i < len_res; ++i)
	{
		*(res + i) = '0';
	}


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

Код: 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.
char* la_sum2(const char* s0, const char* s1)
{
	int len[2] = { strlen(s0), strlen(s1) };
	int max_i = (len[0] > len[1]) ? 0 : 1; //индекс максимальной строки
	int min_i = 1 - max_i;//индекс минимальной строки
	const char* max_s = (max_i == 0) ? s0 : s1;
	const char* min_s = (min_i == 0) ? s0 : s1;

	if (len[max_i] > MAX_POW - 1)
	{
		printf("Incorrect size of the string(s).\n");
		return NULL;
	}

	int len_res = len[max_i] + 1 + 1;//просим на 1 Байт больше чтобы исключить вероятность повторного аллоцирования
	char* res = (char*)malloc(len_res*sizeof(char));
	memset(res, '0', len_res);//установка стартового значения
	memcpy(res + len[max_i] - len[min_i] + 1, min_s, len[min_i]);//пишем в конец результирующей строки минимальное число

	//основная часть алгоритма
	int d = 0;
	for (int i = len_res - 2; i > 0; i--)
	{
		int t0 = *(res + i) + *(max_s + i - 1) + d - 2 * '0';
		int t1 = t0 % 10;
		*(res + i) = t1 + '0';
		d = (t0 >= 10) ? 1 : 0;
	}
	*(res + len_res - 1) = '\0';
	if (d == 0)
	{
		memmove(res, res + 1, len_res - 1);//сдвиг
	}
	else
	{
		*(res + 0) = d + '0';
	}
	return res;
}



Код стал более читабелен, и нравится мне больше. Хотя вероятно я проигрываю в скорости и памяти на этом участке кода

Код: plaintext
1.
2.
3.
4.
		for (int i = 0; i < len_res-1; ++i)
		{
			*(res + i) = *(res + i + 1);
		}



ибо

Код: plaintext
1.
memmove(res, res + 1, len_res - 1);//сдвиг



известно как работает.

ISO/IEC 9899:201xThe memmove function copies n characters from the object pointed to by s2 into the
object pointed to by s1. Copying takes place as if the n characters from the object
pointed to by s2 are first copied into a temporary array of n characters that does not
overlap the objects pointed to by s1 and s2, and then the n characters from the
temporary array are copied into the object pointed to by s1.

Конечно -же я не удержался, и использовал чудесный тернарный оператор. MasterZiv, не ругайтесь пожалуйста, но разве этот код не кажется вам более компактным и более понятным ? Я согласен с вами, Си-программисты так делают редко, это возможно плохой тон. Но это так красиво, что мне порой трудно удержаться.

Код: 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.
char* la_sum3(const char* s0, const char* s1)
{
	int len[2] = { strlen(s0), strlen(s1) };
	int max_i = (len[0] > len[1]) ? 0 : 1; //индекс максимальной строки
	int min_i = 1 - max_i;//индекс минимальной строки
	const char* max_s = (max_i == 0) ? s0 : s1;
	const char* min_s = (min_i == 0) ? s0 : s1;

	if (len[max_i] > MAX_POW - 1)
	{
		printf("Incorrect size of the string(s).\n");
		return NULL;
	}

	int len_res = len[max_i] + 1 + 1;//просим на 1 Байт больше чтобы исключить вероятность повторного аллоцирования
	char* res = (char*)malloc(len_res*sizeof(char));
	memset(res, '0', len_res);//установка стартового значения
	memcpy(res + len[max_i] - len[min_i] + 1, min_s, len[min_i]);//пишем в конец результирующей строки минимальное число

	//основная часть алгоритма
	int d = 0;
	for (int i = len_res - 2; i > 0; i--)
	{
		int t0 = *(res + i) + *(max_s + i - 1) + d - 2 * '0';
		int t1 = t0 % 10;
		*(res + i) = t1 + '0';
		d = (t0 >= 10) ? 1 : 0;
	}
	*(res + len_res - 1) = '\0';
	(!d) ? (char)memmove(res, res + 1, len_res - 1) : *(res + 0) = d + '0';
	
	return res;
}




Используете ли вы функции которые я сегодня встретил ? Не проигрываю ли я в скорости при их использовании(кроме memmove) ?
Правильно ли я понял, memmove лучше не использовать ?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38790679
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Алгоритм использующий malloc не может быть оптимальным :)
Начните с того что отделите выделение памяти от собственно вычислений.
Всегда можно сделать функцию поверх них, которая их совместит.

memmove в вашем алгоритме не нужна, т.к. нет пересекающихся областей памяти, memcpy - быстрее в теории.

Ну и если речь зашла про оптимальность, то хранить и обрабатывать числа в виде десятичных цифр - это далеко не оптимально. Храните в виде 32- или 64-битных двоичных цифр размером в машинное слово.
В этом случае ускорятся вычисления, но затормозится отображение (что практически никогда не является критичным)
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38790738
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНу и если речь зашла про оптимальность, то хранить и обрабатывать числа в виде десятичных цифр - это далеко не оптимально. Храните в виде 32- или 64-битных двоичных цифр размером в машинное слово.
В этом случае ускорятся вычисления, но затормозится отображение (что практически никогда не является критичным)
Если стоит задача делать финансовые расчёты и часто-часто делать конверсию BIN=>DEC=>BIN для публикации то
я-бы предложил BCD.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38790751
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Отчеты - это всегда агрегированные данные, в худшем случае тысячи записей.
А исходные данные могут занимать миллиарды записей.
Поэтому оптимизировать надо именно вычисления.

ЗЫ. Не говоря уже о том что для финрасчетов никакая длинная арифметика не нужна :)
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38790764
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати Oracle хранит мантиссу числа Number в виде цифры 100-ричной системы в двоичном виде в каждом байте.
Никакого преимущества при отображении по сравнению с хранением по словам этот формат не дает. И так и так надо в цикле получать остатки для перевода в десятичную систему.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38790774
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, согласен насчёт агрегаций и прочей другой аналитики.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38790801
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyКстати Oracle хранит мантиссу числа Number в виде цифры 100-ричной системы в двоичном виде в каждом байте.
Никакого преимущества при отображении по сравнению с хранением по словам этот формат не дает. И так и так надо в цикле получать остатки для перевода в десятичную систему.
Зачем? одна 100-ричная цифра это ровно две десятичных.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38790816
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RWolfЗачем? одна 100-ричная цифра это ровно две десятичных.
Вот вам одна 100-ричная цифра в двоичном виде: 01011000
Отобразите ее в десятичной системе без деления :)
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38790819
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя я допускаю, что я что-то неверно помню, и оракл хранит все-таки в BCD - по 10-ичной цифре в каждых 4 разрядах.
В этом случае конечно не требуется никаких особых действий для отображения.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38790838
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВот вам одна 100-ричная цифра в двоичном виде: 01011000
Отобразите ее в десятичной системе без деления :)
Код: sql
1.
printf("%2.2d", 0b01011000);


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38790850
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov0b01011000
Жалко что С/С++ такого не умеют
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38790875
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЖалко что С/С++ такого не умеют
Умеют. Это документация про такую фичу не знает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38790885
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovУмеют. Это документация про такую фичу не знает.
Че, прямо все умеют?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38790901
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЧе, прямо все умеют?
Мелкомягкое поделие - не умеет. Но от него никто и не может ожидать соответствия
стандартам или спецификациям K&R.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38790906
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyRWolfЗачем? одна 100-ричная цифра это ровно две десятичных.
Вот вам одна 100-ричная цифра в двоичном виде: 01011000
Отобразите ее в десятичной системе без деления :)
В чём проблема?
01011000 / 10 = 8
01011000 % 10 = 8
результат: 88
Заметьте, мне не пришлось искать остаток от деления всего числа на 10, я ограничился одной цифрой. А мог вообще обойтись таблицей на 100 входов.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38790957
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RWolfА мог вообще обойтись таблицей на 100 входов.
Да, это оно.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38790967
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyОтобразите ее в десятичной системе без деления :)
Деление на вычитание в цикле можно заменить, только еще медленнее будет.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38790989
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот летом для себя исследовал сложение в системе
Фибоначчи. Интересно так вышло. Отпишу если не забуду.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38791298
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Anatoly MoskovskySashaMercury,

Алгоритм использующий malloc не может быть оптимальным :)
Начните с того что отделите выделение памяти от собственно вычислений.
Всегда можно сделать функцию поверх них, которая их совместит.


Лучше было бы передать в функцию адрес по которому будет записан результат ? Т.о. функция должна нести функционал только касаемо алгоритма, и не должна решать вопросы касаемо аллоцирования ? Прототип такой функции будет выглядеть следующим образом.

Код: plaintext
1.
char* la_sum(char* sum, const char* s0, const char* s1)



Вывод выделенный красным нужно использовать и в дальнейшем при проектировании функций и разработке алгоритмов в целом ? То есть существует негласное правило о том, что нужно отделять алгоритм, от работы с памятью ? Я раньше всегда задумывался об этом, но почему-то выбирал тот вариант, по которому вы сделали замечание. Хотя мне ваше замечание нравится, оно вполне обоснованно, и я буду рад его использовать, если вы подтвердите то, что я написал выше.


Anatoly Moskovskymemmove в вашем алгоритме не нужна, т.к. нет пересекающихся областей памяти, memcpy - быстрее в теории.

разве в данном случае нет пересекающихся областей ?
Код: plaintext
1.
2.
3.
4.
		for (int i = 0; i < len_res-1; ++i)
		{
			*(res + i) = *(res + i + 1);
		}



Почему memcpy быстрее в теории ? Это не макрозамена, как например getchar()?

Anatoly MoskovskyНу и если речь зашла про оптимальность, то хранить и обрабатывать числа в виде десятичных цифр - это далеко не оптимально. Храните в виде 32- или 64-битных двоичных цифр размером в машинное слово.
В этом случае ускорятся вычисления, но затормозится отображение (что практически никогда не является критичным)
то есть сейчас я использую 1 байт на 1 знак, а если буду хранить числа в массиве int, и получить результирующее число как результат контактенции этих чисел, то я буду тратить хм..4 Байта,2^32<10^10, значит 9 знаков на 4 Байта, т.о. выигрываю где-то в два раза,1 знак-4/9 байта.
Я вас правильно понял ?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38791299
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ вот летом для себя исследовал сложение в системе
Фибоначчи. Интересно так вышло. Отпишу если не забуду.

отпишите, будем ждать :)
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38791304
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим я разделяю алгоритм и работу с памятью. Тогда я не буду знать сколько нужно памяти выделять на сумму. Значит мне нужно, для реализации всего, реализовать две функции и одну статическую внешнюю переменную, в которую функция будет передавать длину результата, и только потом будет запускаться вторая функция, и выделять память для результат.
И мне мало того что она статическая внешняя. Хочется сделать чтобы она была видна только двум этим функциям, и никакие другие функции не могли бы её изменить. Но я не встретил такого класса памяти к K&R и в стандарте
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38791410
Фотография 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.
#include <stdio.h>
#include <stdlib.h>

static int n;

//выделение памяти на матрицу nxn
int** allocate_memory(int n)
{
	int** res = NULL;
	res = (int**)malloc(sizeof(int*)*n);
	for (int i = 0; i < n; ++i)
	{
		*(res + i) = NULL;
		*(res + i) = (int*)malloc(sizeof(int)*n);
	}
	return res;
}

//получение данных из файла согласно задачи 126 acmp.ru
int** get_data(FILE* in)
{
	fscanf(in, "%i", &n);
	int** m = allocate_memory(n);

	for (int i = 0; i < n; ++i)
	{
		for (int j = 0; j < n; ++j)
		{
			fscanf(in, "%i", &m[i][j]);
		}
	}
	return m;
}

int main(int argc,char** argv)
{
	FILE* in = fopen("input.txt", "r");
	if (!in)
		printf("File 'input.txt' not found.\n");
	int** m = get_data(in);
	view_sq_matrix(m,n);
	return 0;
}



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

http://en.wikipedia.org/wiki/Sparse_matrix

Подумай над этим.

P.S. Ну как закинул?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38791549
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Код: plaintext
1.
2.
3.
4.
		for (int i = 0; i < len_res-1; ++i)
		{
			*(res + i) = *(res + i + 1);
		}



Тут я-бы по другому переписал
Код: plaintext
1.
2.
3.
      temp=*res;
      res--;
      *res=temp;


Ну и цикл естественно в обратную сторону развернуть.

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

SashaMercury//сдвиг
return res;
Вернув res+1 ты сэкономишь время на сдвиге.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38791728
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если создать класс - "цепочка операций" (OperationChain)
то можно некоторые действия сокращать.

К примеру в следующем примере арифметика
сокращается законами алгебры.

Код: plaintext
1.
x + y + z - y - x = z



Ну или если Саша допилит умножение то учитывать
умножение не ноль в конце цепочки.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38791761
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДопустим я разделяю алгоритм и работу с памятью. Тогда я не буду знать сколько нужно памяти выделять на сумму. Значит мне нужно, для реализации всего, реализовать две функции и одну статическую внешнюю переменную, в которую функция будет передавать длину результата, и только потом будет запускаться вторая функция, и выделять память для результат.
И мне мало того что она статическая внешняя. Хочется сделать чтобы она была видна только двум этим функциям, и никакие другие функции не могли бы её изменить. Но я не встретил такого класса памяти к K&R и в стандарте
Этот "класс памяти" называется аргумент функции :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
char* la_sum(const char* s0, const char* s1)
{
   // compute lengths
   
   // allocate memory
 
   // calculate in-place
   la_sum_inplace(sum, len, s0, len0, s1, len1);
   return sum;
}

void la_sum_inplace(char* sum, size_t len, const char* s0, size_t len0, const char* s1, size_t len1)
{
}
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38791787
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оптимизации различные рассмотреть. Что будет после la_sum("12345678", "0");
Можно ли вернуть ccылку на первый аргумент?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38791880
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
только пришёл.

mayton, мы все знакомы с разряженными матрицами:) У программистов вероятно возникает вопрос как бы их хранить.
Anatoly Moskovsky, я вас понял, потому привёл пример выше. Мои выводы касаемо разделения алгоритма и работы с памятью верны ?

Спасибо всем за предложения по оптимизации. Завтра исправлю код. Мне пора : (
Доброго времени суток, Сообщество :)
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38791948
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это выкинуть. Если матрица - квадратная то не нужно аллоцировать отдельно строки.
SashaMercury//выделение памяти на матрицу nxn
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
int** allocate_memory(int n)
{
	int** res = NULL;
	res = (int**)malloc(sizeof(int*)*n);
	for (int i = 0; i < n; ++i)
	{
		*(res + i) = NULL;
		*(res + i) = (int*)malloc(sizeof(int)*n);
	}
	return res;
}


Вот так правильно

Код: plaintext
1.
2.
3.
int* allocate_memory(int n){
        return (int*)malloc(sizeof(int)*n*n);
}
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38792184
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

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

поискал в настройках VS 2013 Express, и не нашёл как это сделать. Потом 'погуглил', и ответа на вопрос также не нашёл. Видимо плохо искал. Вообще это я стесняюсь такие вопросы задавать, потому не спросил тут, как это сделать тут.

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

Переименуйте файл из .cpp в .c :)
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38792434
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо..
перестал работать тернарный оператор : (
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38792435
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
говорит что левый операнд должен быть L-value. В Си, тернарный оператор используется только для присваивания.., правильно догадался?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38792444
Фотография 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.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
#define MAX_POW 1001+1

//выделение len Байт
char* allocate_memory(size_t len)
{
	return (char*)malloc(len*sizeof(char));
}

//s1-большее число, s2-минимальное число
int la_sum_inplace(char* sum, size_t len, const char* s1, size_t len1, const char* s2, size_t len2)
{
	memset(sum, '0', len);//установка стартового значения
	memcpy(sum + len1 - len2 + 1, s2, len2);//пишем в конец результирующей строки минимальное число
	//основная часть алгоритма
	int d = 0;
	for (int i = len - 2; i > 0; i--)
	{
		int t0 = *(sum + i) + *(s1 + i - 1) + d - 2 * '0';
		int t1 = t0 % 10;
		*(sum + i) = t1 + '0';
		d = (t0 >= 10) ? 1 : 0;
	}
	*(sum + len - 1) = '\0';
	if (!d)
	{
		memmove(sum, sum + 1, len - 1);
	}
	else
	{
		*(sum + 0) = d + '0';
	}
	return 1;
}

//сумма двух целых неотрицательных чисел s1,s2>=0
char* la_sum(const char* s0, const char* s1)
{
	// compute lengths
	size_t len[2] = { strlen(s0), strlen(s1) };
	int max_i = (len[0] > len[1]) ? 0 : 1; //индекс максимальной строки
	int min_i = 1 - max_i;//индекс минимальной строки
	const char* max_s = (max_i == 0) ? s0 : s1;
	const char* min_s = (min_i == 0) ? s0 : s1;

	if (len[max_i] > MAX_POW - 1)
	{
		printf("Incorrect size of the string(s).\n");
		return NULL;
	}
	int len_res = len[max_i] + 1 + 1;//просим на 1 Байт больше чтобы исключить вероятность повторного аллоцирования
	// allocate memory
	char* res = allocate_memory(len_res);
	// calculate in-place
	la_sum_inplace(res, len_res, max_s, len[max_i], min_s, len[min_i]);	
	return res;
}



что вы имеете ввиду под словом "in-place" ?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38792446
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryперестал работать тернарный оператор : (
Потому что вы его используете невпопад.
Он предназначен для вычисления условных выражений, а не для записи оператора if в одну строку.
SashaMercuryчто вы имеете ввиду под словом "in-place" ?
Что результат записывается в переданный аргумент ("по месту"), а не выделяется память.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38792447
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятно.
Кстати, никто так и не ответил. Используете ли вы сейчас эти функции в своей работе ? memcpy, memset, memmove, или они не устраивают вас как и fscanf ?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38792451
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

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

Но в данном конкретном кейсе самое главное преимущество - дуракоустойчивость.
Он прост как АК-47 и его невозможно поломать или испортить.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38792951
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо. Я всё запомнил.
Спасибо всем :)
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38792988
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, олимпиада проходила по математике, может кому-нибудь будет интересно, привожу пару простых задач:
1. На доске написаны 10 чисел: единица и 9 нулей. Разрешается выбрать любые два числа, и заменить каждое из них средним арифметическим. Какое наименьшее число может получиться на месте единицы после серии(сколь угодного количества) таких операций ?
2. Докажите что функция нечётная.

Прошу прощение за офтоп, но сегодня ведь пятница, и может быть кто-нибудь захочет размяться немножко перед 4 днями высыпания и отдыха C:. Тем более задачи не сложные.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38792996
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЯ всё запомнил.
А меня проигнорировал. Зря.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38793024
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий, ваши выводы выписаны у меня на листt формата А4.
У меня есть блокнот, в него я выписываю все важные выводы. Например сегодня появилась запись:
разделяй алгоритмы и работу с памятью, Anatoly Moskovsky .
Если пролистать несколько страниц назад, то можно встретить рассуждения про контрольную печать, это были предложения Ильи, потому подписано MasterZiv. Также есть предложение от mayton(извините, я не знаю имя: () и Дмитрия (Dima_T). Всё записываю, и иногда читаю.

Все предложения(не проверенные) я выписываю в список на листах формата А4, и проверяю их все. Ваше предложение, прежде чем использовать, я должен проанализировать.Сегодня у меня болели глаза, и потому в основном я читал книги и решал математические задачи, особенно не программировал если честно..
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38793057
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryКстати, олимпиада проходила по математике
смешные у тебя задачки какие - то
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38793087
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury от mayton(извините, я не знаю имя: ()


Марк.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38793147
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВаше предложение, прежде чем использовать, я должен
проанализировать.Сегодня у меня болели глаза, и потому в основном я читал книги и решал
математические задачи, особенно не программировал если честно..
Ну так реши математическую задачку: есть число длиной N знаков и число длиной M знаков.
N >> M. Сколько элементарных математических операций надо провести чтобы добавить первое
число к второму (дополненному нулями до длины N) и наоборот?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38793189
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSashaMercuryВаше предложение, прежде чем использовать, я должен
проанализировать.Сегодня у меня болели глаза, и потому в основном я читал книги и решал
математические задачи, особенно не программировал если честно..
Ну так реши математическую задачку: есть число длиной N знаков и число длиной M знаков.
N >> M. Сколько элементарных математических операций надо провести чтобы добавить первое
число к второму (дополненному нулями до длины N) и наоборот?


Вы знаете, я всё таки подумал сейчас. И понял почему я сделал именно так, записал в результат минимальное число. Пока я не вижу что вы правы(хотя возможно ошибаюсь). Предложите вашу реализацию, пожалуйста.

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

Раз смешные, то жду решение :) первая так вообще для программистов задача
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38793209
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВсе предложения(не проверенные) я выписываю в список на листах формата А4, и проверяю их все. Ваше предложение, прежде чем использовать, я должен проанализировать.Сегодня у меня болели глаза, и потому в основном я читал книги и решал математические задачи, особенно не программировал если честно..
Чел. Когда болят глаза нужно во перых отдохнуть. Во вторых сменить обстановку.
Хорошее расслабление - игра в Пинг-Понг. Когда ты следишь за шариком то
хрусталик глаза постоянно меняет фокус и тем самым тренируется и восставливает
зрение. Еще хороший кейс - носить такие чёрные очки с дырочками сеткой. Но
здесь лучше консультация с офтальмологом.

Вобщем не надо геройствовать.
Слепой программер никому не нужен если чо
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38793234
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПока я не вижу что вы правы(хотя возможно ошибаюсь).
Ну так реши-таки задачу. Дай простой и точный ответ сколько операций потребуется для
каждого случая.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38793236
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А умножать когда будем-то? Топчемся...
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38793498
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSashaMercuryВаше предложение, прежде чем использовать, я должен
проанализировать.Сегодня у меня болели глаза, и потому в основном я читал книги и решал
математические задачи, особенно не программировал если честно..
Ну так реши математическую задачку: есть число длиной N знаков и число длиной M знаков.
N >> M. Сколько элементарных математических операций надо провести чтобы добавить первое
число к второму (дополненному нулями до длины N) и наоборот?


N+1, в обоих случаях, это очевидно.
PS
Вообще, операция суммы коммутативна.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38793499
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА умножать когда будем-то? Топчемся...

А я уже умножал, только не оптимально. Сейчас разберёмся с оптимальной суммой(у Dimitry Sibiryakov есть идея, и он считает что она верна, возможно он прав ), и будем оптимально умножать
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38793501
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercuryВсе предложения(не проверенные) я выписываю в список на листах формата А4, и проверяю их все. Ваше предложение, прежде чем использовать, я должен проанализировать.Сегодня у меня болели глаза, и потому в основном я читал книги и решал математические задачи, особенно не программировал если честно..
Чел. Когда болят глаза нужно во перых отдохнуть. Во вторых сменить обстановку.
Хорошее расслабление - игра в Пинг-Понг. Когда ты следишь за шариком то
хрусталик глаза постоянно меняет фокус и тем самым тренируется и восставливает
зрение. Еще хороший кейс - носить такие чёрные очки с дырочками сеткой. Но
здесь лучше консультация с офтальмологом.

Вобщем не надо геройствовать.
Слепой программер никому не нужен если чо

спасибо, это точно пригодится. Поставлю на телефон

PS
1 задача ответ 1/512

2 задача
Пусть f(x) нечётная, тогда


т.о.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38793599
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryN+1, в обоих случаях, это очевидно.
Бздынь, ответ неправильный. Что ты будешь прибавлять, когда у тебя кончатся цифры в числе M?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38793631
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

нули, очевидно.
сложите числа 123999999999999 и 1.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38793703
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оки доки челы. Вобщем Фибоначчи. Этот чортов старик кроликов разводил.
Не знаю чем там закончилось. Развёл он этих кролей ОВЕР 9000 или зарубил
на мясо. Неважно. Но он пришёл к какой-то формуле через численность
кроликов. Типа N(i) = N(i-1) + N(i-2).

Получился Ряд Фибоначчи.

Код: plaintext
1.
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765



Вот так вот. Позиционная система счисления в виде коэфф Фибоначчи обладает
интересными свойствами. Чуть позже опишу. Нужна бумага и ручка. Текстом ненаглядно.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38793740
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, ждём-ждём :)


PS
Dimitry SibiryakovSashaMercuryN+1, в обоих случаях, это очевидно.
Бздынь, ответ неправильный. Что ты будешь прибавлять, когда у тебя кончатся цифры в числе M?


999+1
|m|=3 |n|=1

s_0=(1+9)%10=0,d=1
s_1=0
s_2=0
s3=d=1

4 операции.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38793764
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВообще, операция суммы коммутативна.
Это в плане результата она коммутативна. А у самого процесса есть весьма отличающиеся
варианты.

SashaMercury999+1
И почему извращенцы всегда берут частный, экстремальный и при этом весьма маловероятный
случай?..


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38793803
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

тогда и формулировать вопрос надо соответственно: сколько в среднем операций потребуется, чтобы…
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38793832
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RWolfтогда и формулировать вопрос надо соответственно: сколько /в среднем/ операций
потребуется, чтобы
Зачем же облегчать задачу?.. Кнут в своём многотомнике всегда отдельно просчитывает
наилучший и наихудший случаи.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38794107
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSashaMercuryВообще, операция суммы коммутативна.
Это в плане результата она коммутативна. А у самого процесса есть весьма отличающиеся
варианты.

SashaMercury999+1
И почему извращенцы всегда берут частный, экстремальный и при этом весьма маловероятный
случай?..




;)

RWolf, а сколько же потребуется в среднем операций ? :)
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38794191
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryRWolf, а сколько же потребуется в среднем операций ? :)

на глаз M + k × (N - M), где k немного больше единицы (для одного случая из десяти сработает перенос в (M+1)-й разряд числа n, для одного из ста — в (M+2)-й и т.д.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38794402
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу кроликов. Значится так. Всё что я щас буду писать это чортово ИМХО.
Можете не соглашаться. Это нормально.

По умолчаниями и договорённостям. Классический ряд Фибоначчи начинается с двух единиц 1 1.
Я посчитал это избытком и устранил один шаг. В моём варианте ряд начинается как 1 2 3 5 ... e.t.c.

Это нисколько не нарушает Фибоначчевых постулатов. Просто мне так удобнее.

Далее. Система счисления (СС). В классическом варианте для большинства СС
(десятичная арабско-индусская) есть только один вариант как закодировать
любое число.

Для СС Фибоначчи (ССФ) это не верно. Есть несколько вариантов как закодировать
число. Мы будем рассматривать т.н. нормализованную форму числа в ССФ при
которой сумма состоит из минимального набора весов (коэффициентов) или
весовых коэффициентов (ВК).
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38794405
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38794407
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для наглядности я нарисовал таблицу для преобразований в ССФ первых 12 целых чисел.
Обратите внимание на одно свойство. Нигде нет подряд идущих двух едниниц.
Пара соседних разрядов всегда образуем сумму с переносом в следующий.

Это таблица нормированных чисел в ССФ. Далее НЧ-ССФ.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #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
Длинная арифметика. Вопросы по реализации/оптимизации
    #38817986
Фотография 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.
//Сочетания
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;
	}

	//сокращаем знаменатель в один проход. Необходимо обоснование того, что это можно сделать за один проход
	for (int i = 0; i < m; ++i)
	{
		if (down[i] != 1)
		{
			for (int j = 0; j < m; ++j)
			{
				if (!(up[j] % down[i]))
				{
					up[j] /= down[i];
					down[i] = 1;//если этот алгоритм верный, то эта строчка не нужна
				}
			}
		}
	}
	char* res="1";
	for (int i = 0; i < m; ++i)
	{
		char* t = (char*)malloc(10);//обоснование числа
		sprintf(t, "%d", up[i]);
		res = la_multiplication(res, t);
	}
	return res;
}
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38817990
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
up и down - состояние (сетевых) интерфейсов, а не положение чисел в дробях. Ну или направления движения
Кроме того, хотя могу и ошибаться, но требуются очень веские причины, чтобы выделять целые в куче. Внутри функции - мне даже в голову ничего не приходит.
С числителем - да, опечатался.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38817996
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перепишем дробь в таком виде:
Код: sql
1.
2.
3.
(1 * 2 * ... * n)
/
( (1 * 2 * ... (n -m)) * (1 * 2 * ... m) )

Можно не перемножать числа в диапазоне от min(m, n-m) до max(m, n-m), включительно.
Но, учитывая высокую скорость рост факториала, надо взять (асимптотическую) аналитическую формулу и считать (натуральный) логарифм числа сочетаний. И потенцировать по мере надобности.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38817997
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov Кроме того, хотя могу и ошибаться, но требуются очень веские причины, чтобы выделять целые в куче. Внутри функции - мне даже в голову ничего не приходит

не очень понял, объясните пожалуйста.

PS Доводы по поводу up и down принимаю и буду иметь в виду. Спасибо :)
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818002
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	char* res="1";
	char* t = (char*)malloc(10);
	for (int i = 0; i < m; ++i)
	{
		sprintf(t, "%d", up[i]);
		res = la_multiplication(res, t);
	}
	free(t);



тут немного изменил. но проблема не в этом, а в том как я работаю с res. в la_multiplication происходи malloc, и потом память не освобождается.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818022
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovв диапазоне от min(m, n-m) до max(m, n-m), включительноНижняя исключительно, верхняя - включительно, т.е. от (min(n, n-m) + 1) до max(n, n-m).
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818038
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryне очень понял, объясните пожалуйстаЕсть регистры, статическая память, стек и куча.
Первых двух касаться не будем.
Запись:
Код: sql
1.
int* var = (int*) malloc(somesize);

даёт нам переменную для указателя на стеке и отдельно, со своими накладными расходами, область памяти для хранения целого в куче.
Возникает вопрос - зачем? Чтобы израсходовать лишнюю память на хранение, процессорные такты на выделение и косвенную адресацию, а потом ещё решать проблему утечек?
Почему нельзя делать просто:
Код: sql
1.
int var;

?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818047
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovBasil A. Sidorovв диапазоне от min(m, n-m) до max(m, n-m), включительноНижняя исключительно, верхняя - включительно, т.е. от (min(n, n-m) + 1) до max(n, n-m).
понял вас )
В моей программе это исправляется одной строчкой
Код: plaintext
1.
2.
3.
4.
char* la_combination(unsigned n, unsigned m)
{
	m = (n - m > m) ? m : n-m;
...




SSBasil A. Sidorov Кроме того, хотя могу и ошибаться, но требуются очень веские причины, чтобы выделять целые в куче. Внутри функции - мне даже в голову ничего не приходит

не очень понял, объясните пожалуйста.

PS Доводы по поводу up и down принимаю и буду иметь в виду. Спасибо :)
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818052
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovSashaMercuryне очень понял, объясните пожалуйстаЕсть регистры, статическая память, стек и куча.
Первых двух касаться не будем.
Запись:
Код: sql
1.
int* var = (int*) malloc(somesize);

даёт нам переменную для указателя на стеке и отдельно, со своими накладными расходами, область памяти для хранения целого в куче.
Возникает вопрос - зачем? Чтобы израсходовать лишнюю память на хранение, процессорные такты на выделение и косвенную адресацию, а потом ещё решать проблему утечек?
Почему нельзя делать просто:
Код: sql
1.
int var;

?

а как я массивы буду хранить ?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818059
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryа как я массивы буду хранить ?Как-то так:
Код: sql
1.
int arr[] = {0, 0, 0, 0, 0, 0};



P.S. Я бы посмотрел на уже имеющиеся пакеты длинной арифметики прежде, чем начать изобретать собственный велосипед.
Чтобы не делать треугольных колёс.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818061
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСделал умножение, алгоритм мне не нравится, ибо мне кажется что он далеко не оптимален. Тут код С++, потому что мне сложно отказаться от тернарного оператора. Он мне слишком нравится, чтобы его не использовать
Саш... ну слов нет. Мне кажется чтение стандартов тебе только вредит.
Каша у тебя в голове. Пиши весь код на С++. Делай file extension на как с++.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818068
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сочетания в один проход не работают. Пример .
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818070
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercuryСделал умножение, алгоритм мне не нравится, ибо мне кажется что он далеко не оптимален. Тут код С++, потому что мне сложно отказаться от тернарного оператора. Он мне слишком нравится, чтобы его не использовать
Саш... ну слов нет. Мне кажется чтение стандартов тебе только вредит.
Каша у тебя в голове. Пиши весь код на С++. Делай file extension на как с++.

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

Саш... ну слов нет. Мне кажется чтение стандартов тебе только вредит.
Каша у тебя в голове. Пиши весь код на С++. Делай file extension на как с++.

почему каша ?( мне просто очень нравится этот оператор :(
Тернарный оператор был изначально в "C". Это замечание к твоей фразе
о выборе С или С++. (я надеюсь третьего варианта здесь нет).
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818084
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercuryпропущено...


почему каша ?( мне просто очень нравится этот оператор :(
Тернарный оператор был изначально в "C". Это замечание к твоей фразе
о выборе С или С++. (я надеюсь третьего варианта здесь нет).

В Си тернарный оператор используется только для присваивания, а не для того, как я люблю его использовать.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818087
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот ещё скриншот
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818092
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	char* res="1";
	char* t = (char*)malloc(10);
	for (int i = 0; i < m; ++i)
	{
		sprintf(t, "%d", up[i]);
		res = la_multiplication(res, t);
	}
	free(t);



тут немного изменил. но проблема не в этом, а в том как я работаю с res. в la_multiplication происхомди malloc, и потом память не освобождается.
Атомарные типы на стеке удаляются автоматом при выходе из функции. Например если ты написал
функцию int sum(int x,int y) которая просто складывает два числа и возвращает резалт - то ты
имеешь замечательную возможность использовать рекуррентные формы такие как:

Код: plaintext
1.
sum(x,0);



Код: plaintext
1.
sum(x,sum(y,0));



То-же самое для char* это сделать сложно т.к. мы теряем результата второго каллбэка sum(..)
и он утекает вникуда до тех пор пока ОС не завершит процесс. Вобщем получаем мемори лик.

Это дефект или артефакт "C"-like декларации функции которая должна ВЕРНУТЬ строку. И ему уже 100 лет
в обед. Здесь сам Бог или Страуструп велит использовать С++/STD с шаблонами строк или чисел.

Опять же странно что ты здесь не использовал возможности С++.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818097
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury, по поводу присваивания - ОК. Убедил. Но не злоупотребляй синтаксисом.
Знавал я перцев которые тело цикла for переносили в выражение for. Код работал
но при этом был аццки нечитабелен. Были красавцы которые любят ВЛОЖЕННЫЙ
тернарный оператор или пытаются КАЖДЫЙ if в коде разложить в тернарность.
Где-то получается. Где-то нет. Разумеется читать код - невозможно. Хочется
руки оторвать.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818103
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТо-же самое для char* это сделать сложно т.к. мы теряем результата второго каллбэка sum(..)
и он утекает вникуда до тех пор пока ОС не завершит процесс. Вобщем получаем мемори лик.

Это дефект или артефакт "C"-like декларации функции которая должна ВЕРНУТЬ строку. И ему уже 100 лет
в обед. Здесь сам Бог или Страуструп велит использовать С++/STD с шаблонами строк или чисел.

Опять же странно что ты здесь не использовал возможности С++.

создам реплику той функции, которая будет освобождать память для аргументов перед выходом. Не использовал возможности, потому что не знаю их.
maytonSashaMercury, по поводу присваивания - ОК. Убедил C:
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818116
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryА вот сейчас делаю сочетания, может быть кто-нибудь подскажет как обосновать что этот алгоритм будет работать за один проход ? Либо обратное ?

По поводу расчёта сочетаний. Алгоритм не смотрел пока. Ничего не скажу. Для опровержения
его нужно тестить. Для доказательства - х.з. Можно взять канонический и через эквивалентные
преобразования доказать равенство. Но впрочем в процессе преобразований можно наломать боков.
Так что... путь долгий.

По поводу прямой формулы. Она редко используется для больших чисел. В числителе и знаменателе - аццки
огромные числа хотя впрочем частное не такое великое. Разумеется математи середины 20 века не имели
технически возможности посчитать большой факториал. ПОэтому обычно берут приближённый
расчёт через Пуассончик. Интеграл Пуассона. Он даёт вполне приемлемую точность. Поскольку
Пуассончик - неберущийся то обычно используют его табличное задание. А в софте - интеграл методом
прямоугольников.

Если функция С(m,n) будет стоять под оптимизацией то можно использовать Треугольник Паскаля как кеш
или частичную мемоизацию. Суть в том что если вы раньше расчитали С(m-1,n), C(m,n-1) то С(m,n) можно
получить просто сложением от ранее расчитанного.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818119
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНе использовал возможности, потому что не знаю их.
Да што там. Подключ std::string и используй их как хранилище целых чисел вместо char *.
Заодно и утечки уйдут.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818121
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПодключ std::string и используй их как хранилище целых чиселБолее логичным выглядит vector<int> или как его там.
Это, опять-таки, если изобретать велосипед.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818130
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не... ему символы блихе IMHO.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818132
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Марк, мне нужно точное значение.
За один проход не сработает. Нужно думать как делать иначе.
Проще всего взять готовую реализацию, готовую библиотеку и использовать её. Если я когда-нибудь буду работать программистом С++, то вероятно буду делать так. Но мне нравится программировать, и нравится думать, потому я буду делать это так, как начал делать. Без использования того, что уже реализовано, и не смотря на то, как где-то сделано
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818135
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНе... ему символы блихе IMHO.

это правда :) я лучше чувствую то с чем работаю
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818262
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати. Подумай над библиотекой рациональных чисел. Так чтобы 1/3 + 2/3 точно равнялось 1.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818460
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovSashaMercuryа как я массивы буду хранить ?Как-то так:
Код: sql
1.
int arr[] = {0, 0, 0, 0, 0, 0};



P.S. Я бы посмотрел на уже имеющиеся пакеты длинной арифметики прежде, чем начать изобретать собственный велосипед.
Чтобы не делать треугольных колёс.

массив формируется динамически, я не могу хранить его в таком виде.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818464
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКстати. Подумай над библиотекой рациональных чисел. Так чтобы 1/3 + 2/3 точно равнялось 1.

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

https://ru.wikipedia.org/wiki/Алгоритм_Евклида

Если взять более общий случай (знаменатели разные) то тебе понадобиться
приведение к общему знаменателю. Я в этой задаче пошёл по самому длинному пути.
Я раскладывал числа на множители. Для этого мне нужны были все primes в диапазоне
знаменателей. Потом я делал булевы операции над primes и получал НОК.

Делал сложение числителей с учотов весов. И ... хопа. Снова нужно сокращать.
Раскладывал полученый числитель на множители ну вобщем трахомозг.

Вобщем я отказался от разложения на primes по одной простой причине. Алгоритм
Евклида позволил сделать сокращение дроби без разложения на множители.
Это воистину полезный и замечательный алгоритм. Как говоится из серии must have.

А от приведения к общ знаменателю я отказался. Я просто множил оба знаменателя.
Один хрен.. Евклид работал быстрее любого разложения. И его фаза была финальной
в обоих вариантах. Вобщем НОК оказался не нужен.

P.S. Попытка разлагать числа на primes вызвала у меня много часов безсонницыт
и несколько килобайт букв на этом форуме. Вобщем к этой задаче я еще вернусь.
Если будет интересно. Эффективный алго prime-gen я так и не создал. Но гораздо ценнее
были практические знания из теории чисел которые я получил в процессе.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38818945
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, так у вас работают сочетания ?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38819057
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если честно я еще не смотрел. А что?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38819346
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наведи порядок в сорцах. У тебя аллоцирование памяти "C"-like, а циклы используешь от С++.

Вобщем сделай нормальное приложение. С точкой входа в программу.

Давай удачи.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38819368
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonУ тебя аллоцирование памяти "C"-like, а циклы используешь от С++.
Уже 15 лет как в С можно объявлять переменную прямо в цикле :)
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38819416
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ох увы мне увы. Сижу на старых Сях.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38821006
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Подскажите пожалуйста, имеет место быт такой код ? Меня больше интересуют моменты касаемо isFreeMemory

Код: 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.
//выделение len Байт
char* allocate_memory(size_t len)
{
	return (char*)malloc(len*sizeof(char));
}

//освобождение памяти
int freeMemory(char* s1,char* s2,int isFreeMemory)
{
	if (isFreeMemory >= 1)
		free(s1);
	if (isFreeMemory >= 2)
		free(s2);
	return 0;
}



//СУММА
//s1>=s2
int la_sum_inplace(char* sum, size_t p, char* s1, size_t p1, char* s2, size_t p2)
{
	memset(sum, '0', p); *(sum + p - 1) = '\0';//установка стартового значения
	memcpy(sum + p1 - p2 + 1, s2, p2-1);//пишем в конец результирующей строки минимальное число
	int d = 0;
	for (int i = p - 2; i > 0; i--)
	{
		int t0 = *(sum + i) + *(s1 + i - 1) + d - 2 * SHIFT;
		int t1 = t0 % 10;
		*(sum + i) = t1 + '0';
		d = (t0 >= 10) ? 1 : 0;
	}
	if (!d && p!=2)
		memmove(sum, sum + 1, p - 1);
	else
		*(sum + 0) = d + '0';
	return 0;
}

//s1+s2      s1,s2>=0
char* la_sum(char* s1, char* s2, int isFreeMemory)
{
	size_t p[2] = { strlen(s1)+1, strlen(s2)+1 };
	int max_i = (p[0] > p[1]) ? 0 : 1; //индекс максимальной строки
	int min_i = 1 - max_i;//индекс минимальной строки
	char* max_s = (max_i == 0) ? s1 : s2;
	char* min_s = (min_i == 0) ? s1 : s2;

	int p_res = p[max_i] + 1;//просим на 1 Байт больше чтобы исключить вероятность повторного аллоцирования
	char* res = allocate_memory(p_res);
	la_sum_inplace(res, p_res, max_s, p[max_i], min_s, p[min_i]);	// calculate in-place	
	freeMemory(s1, s2, isFreeMemory);
	return res;
}
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38821007
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разбираюсь с этой memory leak .. Пока что она меня бьёт больше чем я её
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38821022
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возьми себе за правило устанавливать указатель в NULL после освобождения памяти. Тогда отлаживать проще будет.
Схематично так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
char* p = NULL;
....
if(p) {
   ... память уже выделена
} else {
   p = malloc(...);
}
... работаем с p
free(p);
p = NULL;
...
if(p) {
  ... память не освобождена
}
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38821072
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
//освобождение памяти
int freeMemory(char* s1,char* s2,int isFreeMemory)
{
	if (isFreeMemory >= 1)
		free(s1);
	if (isFreeMemory >= 2)
		free(s2);
	return 0;
}

s2 никогда не освободится, есичё ))
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38821077
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВозьми себе за правило устанавливать указатель в NULL после освобождения памяти. Тогда отлаживать проще будет.а лучше взять себе за правило использовать для каждой задачи свою локальную переменную, тогда отлаживать будет ещё проще, особенно, если давать им имена чуть более осмысленные, чем "р", "с" и прочие "ab" )))
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38821083
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, и почему бы не инициализировать переменную прямо по месту её объявления.
Схематично так
Код: plaintext
1.
2.
3.
char* p = malloc(...);
... работаем с p
free(p);
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38821114
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychDima T, и почему бы не инициализировать переменную прямо по месту её объявления.
Схематично так
Код: plaintext
1.
2.
3.
char* p = malloc(...);
... работаем с p
free(p);


Когда так можно сделать, то и проблем нет.

Я общий случай описал.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38821126
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychSashaMercury
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
//освобождение памяти
int freeMemory(char* s1,char* s2,int isFreeMemory)
{
	if (isFreeMemory >= 1)
		free(s1);
	if (isFreeMemory >= 2)
		free(s2);
	return 0;
}

s2 никогда не освободится, есичё ))глупость я написал, освободится, конечно
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38821137
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TegorychDima T, и почему бы не инициализировать переменную прямо по месту её объявления.
Схематично так
Код: plaintext
1.
2.
3.
char* p = malloc(...);
... работаем с p
free(p);


Когда так можно сделать, то и проблем нет.

Я общий случай описал.если сразу проектировать программу в этом стиле, то он и будет общим случаем, с 95% вероятностью
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38821267
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychDima Tпропущено...

Когда так можно сделать, то и проблем нет.

Я общий случай описал.если сразу проектировать программу в этом стиле, то он и будет общим случаем, с 95% вероятностью
На вкус и цвет ...
Задачи разные бывают. У меня на С в основном DLL-ки вспомогательные, которые грузятся всегда, а задействованы могут быть пару раз в году. Какой смысл напрягать проц лишними операциями при загрузке?
Поэтому лично я предпочитаю инициализировать NULL, а при необходимости память выделить.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38821345
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryРазбираюсь с этой memory leak .. Пока что она меня бьёт больше чем я её
Саш. А ты себя позиционируешь как Windows-C++ разработчик? Или есть другие варианты?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38821723
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TУ меня на С в основном DLL-ки вспомогательные, которые грузятся всегда, а задействованы могут быть пару раз в году. Какой смысл напрягать проц лишними операциями при загрузке?что бы это значило? в коде char *prt = malloc(...); процессор напрягается в момент исполнения этой строчки кода, если ptr - не глобальный объект. Если функция из dll используется 2 раза в год, то и такая строчка исполнится 2 раза в год, при загрузке библиотеки только DllMain исполняется автоматом.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38821945
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересные темы обсуждаете господа, даже поиграть забыл ...
maytonSashaMercury, даю подсказку. В сложении дробей помогает алгоритм Евклида.

https://ru.wikipedia.org/wiki/Алгоритм_Евклида

Если взять более общий случай (знаменатели разные) то тебе понадобиться
приведение к общему знаменателю. Я в этой задаче пошёл по самому длинному пути.
Я раскладывал числа на множители. Для этого мне нужны были все primes в диапазоне
знаменателей. Потом я делал булевы операции над primes и получал НОК.

Делал сложение числителей с учотов весов. И ... хопа. Снова нужно сокращать.
Раскладывал полученый числитель на множители ну вобщем трахомозг.

Вобщем я отказался от разложения на primes по одной простой причине. Алгоритм
Евклида позволил сделать сокращение дроби без разложения на множители.
Это воистину полезный и замечательный алгоритм. Как говоится из серии must have.

А от приведения к общ знаменателю я отказался. Я просто множил оба знаменателя.
Один хрен.. Евклид работал быстрее любого разложения. И его фаза была финальной
в обоих вариантах. Вобщем НОК оказался не нужен.

Жёстко ...
a*b = НОК(a,b) * НОД(a,b) - спасибо моему учителю, долгих ему лет здоровья

mayton, а что там с СС Фибоначи, так интересно начиналось?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38821965
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У, как у вас тут интересно...
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38821993
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вобщем Фибоначчи я задумывал как один из способов организации кеша Primes.
В отличие от кодов Левеншнтейна код Фибоначчи подкупает своей простотой.
Но развивая идею я думал о реализации основных 4-х арифметических операциях.
И хотя для задачи cachePrimes сложение и вычитание не является необходимостью
я просто обобщал и решил а "почему-бы и нет". В мохнатые времена один Росиянин
создавал ЭВМ работающую на "троичной" арифметике. Вобщем полёту фантазии нет
предела.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822089
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Дмитрий, спасибо, я попробую сейчас, исправлю кое-что:)


maytonSashaMercuryРазбираюсь с этой memory leak .. Пока что она меня бьёт больше чем я её
Саш. А ты себя позиционируешь как Windows-C++ разработчик? Или есть другие варианты?

Марк, Нет конечно, какой из меня Программист, или Разработчик. Уже говорил свою позицию по значению слова Программист (Разработчик). Позиционирую себя изучающим язык программирования Си
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822104
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё получилось :)
проблема была немного в другом, впрочем, как мне кажется, с утечками проблема решена также. Всем спасибо.
Сегодня всё расскажу и покажу
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822110
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас занимаюсь декомпозицией задачи, чтобы выложить её в нормальном виде. Не знаю как правильно это доделать, подскажите пожалуйста

Вот такой файл la.h

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "la.c"

#define MIN_POW (1+1)
#define SHIFT '0'

char* allocate_memory(size_t len);

int freeMemory(char* s1, char* s2, int isFreeMemory);



вот такой la.c

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include <stdlib.h>
//выделение len Байт
char* allocate_memory(size_t len)
{
	return (char*)malloc(len*sizeof(char));
}

//освобождение памяти
int freeMemory(char* s1, char* s2, int isFreeMemory)
{
	if (isFreeMemory >= 1)
	{
		free(s1);
		s1 = NULL;
	}
	if (isFreeMemory >= 2)
	{
		free(s2);
		s2 = NULL;
	}
	return 0;
}



тут уже косяк. Дважды подключаю stdlib.h но программа пока запускается.
Однако, когда я делаю так, sum.h
Код: plaintext
1.
2.
3.
#include "la.h"
int la_sum_inplace(char* sum, size_t p, char* s1, size_t p1, char* s2, size_t p2);
char* la_sum(char* s1, char* s2, int isFreeMemory);



и так sum.c

Код: 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.
#include "sum.h"

//СУММА
//s1>=s2
int la_sum_inplace(char* sum, size_t p, char* s1, size_t p1, char* s2, size_t p2)
{
	memset(sum, '0', p); *(sum + p - 1) = '\0';//установка стартового значения
	memcpy(sum + p1 - p2 + 1, s2, p2 - 1);//пишем в конец результирующей строки минимальное число
	int d = 0;
	for (int i = p - 2; i > 0; i--)
	{
		int t0 = *(sum + i) + *(s1 + i - 1) + d - 2 * SHIFT;
		int t1 = t0 % 10;
		*(sum + i) = t1 + '0';
		d = (t0 >= 10) ? 1 : 0;
	}
	if (!d && p != 2)
		memmove(sum, sum + 1, p - 1);
	else
		*(sum + 0) = d + '0';
	return 0;
}

//s1+s2      s1,s2>=0
char* la_sum(char* s1, char* s2, int isFreeMemory)
{
	size_t p[2] = { strlen(s1) + 1, strlen(s2) + 1 };
	int max_i = (p[0] > p[1]) ? 0 : 1; //индекс максимальной строки
	int min_i = 1 - max_i;//индекс минимальной строки
	char* max_s = (max_i == 0) ? s1 : s2;
	char* min_s = (min_i == 0) ? s1 : s2;

	int p_res = p[max_i] + 1;//просим на 1 Байт больше чтобы исключить вероятность повторного аллоцирования
	char* res = allocate_memory(p_res);
	la_sum_inplace(res, p_res, max_s, p[max_i], min_s, p[min_i]);	// calculate in-place	
	freeMemory(s1, s2, isFreeMemory);
	return res;
}



тут происходит вот что "Error 3 error LNK2005: _freeMemory already defined in main.obj ", в чём проблема понятно, а как исправить пока не дошло
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822116
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

SashaMercuryтут уже косяк. Дважды подключаю stdlib.h но программа пока запускается.


Саш, тебе нужно немного почитать о подключении заголовков в C, C++
в *.h файле ты цепляешь заголовки, а не код

Вот такой файл la.h
Код: plaintext
1.
2.
3.
4.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
...


вот такой la.c
Код: plaintext
1.
2.
#include "la.h"
...
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822118
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

спасибо! Не знаю почему так сделал(вроде бы сделал сначала правильно, но почему-то сборка прошла неудачно) ( Исправил и всё сразу заработало
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822120
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

c++ - Include в заголовочных файлах
ещё, что бы заголовочные файлы не включались по нескольку раз вставляют директивы препроцессора
Код: plaintext
1.
2.
3.
4.
#ifndef Point_h__
#define Point_h__
...  // это включится всего 1 раз
#endif



SashaMercury , Вот кстати тебе задачка , на неё многие ответить не могут (первый курс универа надо)
интересно, сможешь осилить или нет, ответ там простой

Графический примитив - линейно залитый цветом треугольник
Дано: 3 точки на плоскости, их цвет c1,c2,c3 , треугольник образуемый ими нужно равномерно залить цветом
Найти: формулу c(x,y) - ?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822122
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),
не знаю как бы решал первый курс, а я бы решил данную задачу используя билинейную интерполяцию. Тут частный случай, потому скорее всего как-то можно использовать формулу .
PS
кстати, можно, вероятно, составить систему уравнений, и через нее выразить x y.

Подождите :)
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822128
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Буду использовать следующую нотацию .

Функция имеет вид , где, и коэффициенты рассчитываются по следующим формулам
,

,
,
,
.

Я бы решал так :)
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822129
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в t3 опечатка, понятно что там минус
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822138
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

не совсем понял как у вас с зависит от x,y

вот тут серьёзные дядьки решают эту задачку, но так делать не стоит, комменты гораздо полезнее

Щас народ проснётся, может придумают что, направление у тебя правильное :-)
PS: переменная t тебе ни к чему, а вот это поможет уравнения решить
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822142
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

оператор L зависит от (x,y). Навскидку, "серьёзные дядьки" решают аналогично способу предложенному выше :)

А вот в главный файл, что нужно включать ? все хидеры, или только la.h ?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822145
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryА вот в главный файл, что нужно включать ? все хидеры, или только la.h ?
если они у тебя описаны в la.h, то они включатся
ориентируйся на простое правило
1. если заголовки тебе нужны для описания типов параметров то включаешь в *.h
2. если используется только в реализации, то в *.cpp, *.c
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822146
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, у меня 5 пар хидер name.h -файл name.c
в каждом name.h подключаю la.h, а в каждом name.c подключаю name.h .
В main.c подключаю la.h

Вроде бы правильно всё(хотя мне так не кажется), но снова аналогичная ошибка
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822151
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)что бы заголовочные файлы не включались по нескольку раз вставляют директивы препроцессора
Код: plaintext
1.
2.
3.
4.
#ifndef Point_h__
#define Point_h__
...  // это включится всего 1 раз
#endif


можно проще: первой строчкой в .h написать
Код: plaintext
1.
#pragma once
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822157
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury, надо так
la.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MIN_POW (1+1)
#define SHIFT '0'
char* allocate_memory(size_t len);
int freeMemory(char* s1, char* s2, int isFreeMemory);


la.c
Код: plaintext
1.
2.
#include "la.h"
...



sum.h
Код: plaintext
1.
2.
3.
#include "la.h"
int la_sum_inplace(char* sum, size_t p, char* s1, size_t p1, char* s2, size_t p2);
char* la_sum(char* s1, char* s2, int isFreeMemory);


sum.c
Код: plaintext
1.
2.
#include "sum.h"
...



main.c
Код: plaintext
1.
2.
#include "sum.h"
...
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822180
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так и делаю :(
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822216
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Графический примитив - линейно залитый цветом треугольник
Дано: 3 точки на плоскости, их цвет c1,c2,c3 , треугольник образуемый ими нужно равномерно залить цветом
Найти: формулу c(x,y) - ?
В графическом и геометрическом моделировании ГиГМ никто такую формулу не ищет.
Треугольник (в общем случае не коллинеарный оси OX в системе координат)
режут на 2 под-треугольника. По средней точке по вертикали OY. Для полученных треугольников
ищут уравнения боковых отрезков и делают итератор по алгоритму Брезенхема
или используют линейную зависимость в fix-point арифметике на целых числах.
Находят 2 точки и заполняют отрезок наиболее быстрым образом (не setPixel)
чаще всего черед прямой доступ к памяти графического контекста.

Для старинных API использовался доступ к видеопамяти через различные
хитрые ухищрения.

Для DirectX/OpenGL треугольник fillitся встроенными функциями, которые
работают очень быстро и рисуют миллион треугольников в секунду.

Та общая формула которая находит принадлежность точки треугольнику - нужна в других
задачах но не в fill polyline.

Кстати предлагаю подумать над порядком точек. Возможен вариант когда треугольник
"вывернут наизнанку" и мы определям обратную формулу.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822225
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryТак и делаю :(
Как так? давай подробнее и с сообщением об ошибке.

Это убрал из la.h ?
Код: plaintext
1.
#include "la.c"
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822338
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ графическом и геометрическом моделировании ГиГМ никто такую формулу не ищет.
Треугольник (в общем случае не коллинеарный оси OX в системе координат)
режут на 2 под-треугольника. По средней точке по вертикали OY. Для полученных треугольников
ищут уравнения боковых отрезков и делают итератор по алгоритму Брезенхема
или используют линейную зависимость в fix-point арифметике на целых числах.
Находят 2 точки и заполняют отрезок наиболее быстрым образом (не setPixel)
чаще всего черед прямой доступ к памяти графического контекста.

вопрос не в том как находятся координаты периметра треугольника, а по какой формуле находится цвет внутри него для точки с координатами (x,y) (т.е. уже известно что она лежит внутри треугольника)
цвета точек c1,c2,c3 и их координаты соответственно (x1,y1),(x2,y2),(x3,y3)
mayton
Для DirectX/OpenGL треугольник fillitся встроенными функциями, которые
работают очень быстро и рисуют миллион треугольников в секунду.

Та общая формула которая находит принадлежность точки треугольнику - нужна в других
задачах но не в fill polyline.

то, что кто-то реализовал эти методы за/до вас, не значит что формулы не используются
кстати, для перспективной проекции формула будет другая
maytonКстати предлагаю подумать над порядком точек. Возможен вариант когда треугольник
"вывернут наизнанку" и мы определям обратную формулу.

порядок точек не важен
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822344
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercuryТак и делаю :(
Как так? давай подробнее и с сообщением об ошибке.

Это убрал из la.h ?
Код: plaintext
1.
#include "la.c"


SashaMercury, покажи лучше начала всех файлов которые у тебя есть в проекте
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822414
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)вопрос не в том как находятся координаты периметра треугольника, а по какой формуле находится цвет внутри него для точки с координатами (x,y) (т.е. уже известно что она лежит внутри треугольника)
цвета точек c1,c2,c3 и их координаты соответственно (x1,y1),(x2,y2),(x3,y3)

ОК. Как будет угодно. Я-бы предложил вынести это в пятничные задачи.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822453
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonkealon(Ruslan)вопрос не в том как находятся координаты периметра треугольника, а по какой формуле находится цвет внутри него для точки с координатами (x,y) (т.е. уже известно что она лежит внутри треугольника)
цвета точек c1,c2,c3 и их координаты соответственно (x1,y1),(x2,y2),(x3,y3)

ОК. Как будет угодно. Я-бы предложил вынести это в пятничные задачи.
да ладно, уравнение плоскости через три точки даже на кофе-брейк не тянет
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822556
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)maytonпропущено...

ОК. Как будет угодно. Я-бы предложил вынести это в пятничные задачи.
да ладно, уравнение плоскости через три точки даже на кофе-брейк не тянет
Тогда давай вернёмся к длинной арифметке. Топик ибо.
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822609
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТогда давай вернёмся к длинной арифметке. Топик ибо.
а что там возвращаться, у автора проблемы больше с С++
по сути :
1. если в продакшене, то - GMP, как ему уже советовали
2. если самому разобраться
сложить,вычесть - столбиком наверное пойдёт

алгоритмы умножения: Метод умножения Шёнхаге — Штрассена , умножение Карацубы , Алгоритм Фюрера

деление, остаток от деления - столбиком хватит наверное через вычитание для начала

операция k^n mod m - Алгоритм Монтгомери

но скорее всего он пока не осилит этого ...

SashaMercury, ты в каком классе учишься?
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822632
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)SashaMercury, ты в каком классе учишься?
если, вы читали Лабиринт отражений/Фальшивые зеркала, то вы наверное знаете, что не всегда на такие вопросы можно получить ответы.

Всё что вы привели выше, уверен? реализовать смогу. Но я чувствую разницу между прочитать алгоритм и реализовать его(тут и дворник справится), и между самому решить эту задачу(пусть даже для этой задачи уже есть решение). Когда я задаю вопросы, то задаю их не ради получения личной выгоды в виде решения лабораторных, устранения косяков на работе, smth else. Мне это нравится, в первую очередь, нравится думать, писать программы на Си, и видеть результат.

Что касается треугольника, то решения уже приведено выше, и оно правильное. Не понимаю почему на хабре ради такой ерунды создавали топик. Решение единственное, и не имеет вариаций. В том смысле, что это равносильно созданию топика о том, как найти определитель матрицы 3x3
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822634
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)maytonТогда давай вернёмся к длинной арифметке. Топик ибо.
а что там возвращаться, у автора проблемы больше с С++

Да нет у него проблем. Просто изучает. В плане оптимизации сложения
у меня есть свои мысли. В техникуме на курсе ЦУМПС (цифровые устр.
и мк.системы) мы изучали оптимизацию сложения через аппаратные
кодеры-декодеры или шифраторы-дешифраторы (не помню точно).
Суть - в двоичной системе счисления биты группируются на группы
по 4 штуки (тетрада). И для каждой тетрады строится булевая функция.
8+1 входов и 4+1 выхода. Оптимизируется и хардкодится. 5-й выход - это бит
переноса. Можно и группировать (наверное) и по 5 битов и более но
это вызовет скорее всего резкое усложнение сумматора.

Далее полученные аппаратные сумматоры тетрад объединяются в каскады.

Полученное устройство и будет максимально оптимизировано. Далее - сколько
не разгоняй - всё равно каскады работают последовательно. Но быстрее чем
по 1 биту складывать.

По поводу умножения. Ну... у меня есть идея цифро-аналогового умножителя
(только для вещественных чисел). И не уверен что она всем придётся по
вскусу. Уж больно она ... недетерминирована
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822647
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По проекту, ничего уже не покажу. Ибо он на другой машине. Но я заметил вот что, если запускать сборку когда открыт один файл, то всё ок, а если, когда открыт другой файл, то не работает..
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822963
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822968
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822969
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38822972
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
формула для цвета:


PS: вот дурной latex здесь
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38823020
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
>> Идеальный код
читал я её, кроме первой статьи про регэкспы на С ничего не впечатлило. Зато убило наглухо описание чудовищного хака виртуальной машины C#, чтобы побыстрее графику ( как мне помнится ) рисовать на 4 страницы убористым почерком ))
...
Рейтинг: 0 / 0
Длинная арифметика. Вопросы по реализации/оптимизации
    #38823293
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),
похоже на правду :)
...
Рейтинг: 0 / 0
207 сообщений из 207, показаны все 9 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Длинная арифметика. Вопросы по реализации/оптимизации
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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