From sitkarev на komitex.ru Tue Mar 1 02:42:38 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Tue, 01 Mar 2011 01:42:38 +0300 Subject: [P&AM Lab] =?utf-8?b?REZUINGBINC/0YDQuNC80LXRgNCw0LzQuCDQuCDQs9GA?= =?utf-8?b?0LDRhNC40LrQsNC80Lg=?= Message-ID: <4D6C24DE.6050806@komitex.ru> Приветствую всех. Я обещал выложить портянку, которую показывал 145-й группе по дискретному преобразованию Фурье. Добавил туда иллюстрации и исправил некоторые опечатки, которые удалось заметить. Если будут комментарии или замечания -- с радостью приму. Скачать можно с FTP сервера, размер файла ~500 Kб. ftp://wiki.syktsu.ru/fourier.pdf -- Г.А. From rg-400 на list.ru Tue Mar 1 13:16:01 2011 From: rg-400 на list.ru (=?UTF-8?B?0JXQs9C+0YAg0J7QtNC40L3RhtC+0LI=?=) Date: Tue, 01 Mar 2011 12:16:01 +0300 Subject: [P&AM Lab] =?utf-8?b?REZUINGBINC/0YDQuNC80LXRgNCw0LzQuCDQuCDQs9GA?= =?utf-8?b?0LDRhNC40LrQsNC80Lg=?= In-Reply-To: <4D6C24DE.6050806@komitex.ru> References: <4D6C24DE.6050806@komitex.ru> Message-ID: <4D6CB951.30008@list.ru> Невозможно скачать: jam на wbook ~ $ wget -c ftp://wiki.syktsu.ru/fourier.pdf --2011-03-01 12:12:50-- ftp://wiki.syktsu.ru/fourier.pdf => ?fourier.pdf? Преобразование адреса wiki.syktsu.ru... 217.24.113.52 Устанавливается соединение с wiki.syktsu.ru|217.24.113.52|:21... соединились. Регистрация под именем anonymous ... Недопустимое имя или пароль. From ilyin_mikhail на inbox.ru Tue Mar 1 17:30:51 2011 From: ilyin_mikhail на inbox.ru (Mikhail Ilyin) Date: Tue, 01 Mar 2011 16:30:51 +0300 Subject: [P&AM Lab] =?koi8-r?b?REZUINMg0NLJzcXSwc3JIMkgx9LBxsnLwc3J?= In-Reply-To: <4D6CB951.30008@list.ru> References: <4D6C24DE.6050806@komitex.ru> <4D6CB951.30008@list.ru> Message-ID: Сейчас пособие доступно по адресу http://wiki.syktsu.ru/fourier.pdf Tue, 01 Mar 2011 12:16:01 +0300 письмо от Егор Одинцов : > Невозможно скачать: > > jam на wbook ~ $ wget -c ftp://wiki.syktsu.ru/fourier.pdf > > --2011-03-01 12:12:50-- ftp://wiki.syktsu.ru/fourier.pdf > => "fourier.pdf" > Преобразование адреса wiki.syktsu.ru... 217.24.113.52 > Устанавливается соединение с wiki.syktsu.ru|217.24.113.52|:21... > соединились. > Регистрация под именем anonymous ... > Недопустимое имя или пароль. > > > _______________________________________________ > Lab mailing list > Lab на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/lab From Lonely.RuyK на mail.ru Tue Mar 1 23:27:46 2011 From: Lonely.RuyK на mail.ru (LonelyRuyK) Date: Tue, 1 Mar 2011 22:27:46 +0300 Subject: [P&AM Lab] =?utf-8?b?0JHQuNCx0LvQuNC+0YLQtdC60LAg0LHQvtC70YzRiNC4?= =?utf-8?b?0YUg0YfQuNGB0LXQuw==?= In-Reply-To: <201102282249.15280.Lonely.RuyK@mail.ru> References: <201102212233.25450.Lonely.RuyK@mail.ru> <4D6BC0D4.4010905@komitex.ru> <201102282249.15280.Lonely.RuyK@mail.ru> Message-ID: <201103012227.46920.Lonely.RuyK@mail.ru> Вышел патч к 6 версии. test.c пока не изменил но к следующей версии появятся функции bnum_print и, надеюсь, bnum_mul, и тогда её подредактирую Григорий Александрович, вопрос по пропатченой версии add: зачем надо было в куске if (a->top < b->top) { const struct bignum *tmp; tmp = a; a = b; b = tmp; } tmp структуру const делать? From sitkarev на komitex.ru Wed Mar 2 00:10:29 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Tue, 01 Mar 2011 23:10:29 +0300 Subject: [P&AM Lab] =?utf-8?b?0JHQuNCx0LvQuNC+0YLQtdC60LAg0LHQvtC70YzRiNC4?= =?utf-8?b?0YUg0YfQuNGB0LXQuw==?= In-Reply-To: <201103012227.46920.Lonely.RuyK@mail.ru> References: <201102212233.25450.Lonely.RuyK@mail.ru> <4D6BC0D4.4010905@komitex.ru> <201102282249.15280.Lonely.RuyK@mail.ru> <201103012227.46920.Lonely.RuyK@mail.ru> Message-ID: <4D6D52B5.7030703@komitex.ru> Верно. bnum_mul() нужно делать с длинным умножением, т.е. школьным алгоритмом в столбик. Потом можно задуматься уже над bnum_karatsuba_mul() или bnum_kmul(). Будет с чем сравнить и с чем проверять. Конечно, bnum_print() тоже нужен. Надо помнить что мы и в 16-й форме и в 10-й хотим смотреть на числа. И bnum_to_ascii() наверное нужен, который будет это в строку переводить, в буфер а не на stdout. const struct bignum *tmp -- здесь const нужен для того чтобы показать что мы не собираемся ничего менять в *tmp. Мы только читаем поля или сам указатель, но ничего не меняем в байтах на которые он указывает. -- Г.А. 01.03.2011 22:27, LonelyRuyK пишет: > Вышел патч к 6 версии. test.c пока не изменил но к следующей версии появятся > функции bnum_print и, надеюсь, bnum_mul, и тогда её подредактирую > Григорий Александрович, вопрос по пропатченой версии add: > зачем надо было в куске > if (a->top< b->top) { > const struct bignum *tmp; > tmp = a; > a = b; > b = tmp; > } > tmp структуру const делать? From sitkarev на komitex.ru Wed Mar 2 02:54:50 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 02 Mar 2011 01:54:50 +0300 Subject: [P&AM Lab] =?utf-8?b?REZUINGBINC/0YDQuNC80LXRgNCw0LzQuCDQuCDQs9GA?= =?utf-8?b?0LDRhNC40LrQsNC80Lg=?= In-Reply-To: References: <4D6C24DE.6050806@komitex.ru> <4D6CB951.30008@list.ru> Message-ID: <4D6D793A.3070902@komitex.ru> Исправил замеченные ошибки и опечатки. Иллюстрация для входного сигнала в примере с DFT в предыдущей версии была неверной. -- Г.А. 01.03.2011 16:30, Mikhail Ilyin пишет: > Сейчас пособие доступно по адресу > > http://wiki.syktsu.ru/fourier.pdf > From nateford на inbox.ru Wed Mar 2 21:16:34 2011 From: nateford на inbox.ru (=?koi8-r?Q?=EB=CF=CE=D3=D4=C1=CE=D4=C9=CE_=EE=C9=CB=D5=CC=CF=D7?=) Date: Wed, 02 Mar 2011 20:16:34 +0300 Subject: [P&AM Lab] =?koi8-r?b?78LSwdTO2cUg1NLJx8/Oz83F1NLJ3sXTy8nFIMbV?= =?koi8-r?b?zsvDycku?= Message-ID: Всем добрый вечер. Подскажите пожалуйста, почему gcc ругается на применение обратных тригонометрических функций, говорит undefined link? Хотя заголовок нужный подключен. ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: From sitkarev на komitex.ru Wed Mar 2 21:21:07 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 02 Mar 2011 20:21:07 +0300 Subject: [P&AM Lab] =?utf-8?b?0J7QsdGA0LDRgtC90YvQtSDRgtGA0LjQs9C+0L3QvtC8?= =?utf-8?b?0LXRgtGA0LjRh9C10YHQutC40LUg0YTRg9C90LrRhtC40Lgu?= In-Reply-To: References: Message-ID: <4D6E7C83.1000706@komitex.ru> И правильно делает что ругается. Потому что заголовок говорит только о том какие аргументы и значение принимает и возвращает функция, дабы компилятор мог проверить что ты туда передал. Это не означает что библиотека в которой находится код этих функций должна быть линкована с бинарником. Поэтому нужно указать что ты конкретно желаешь в такой-то библиотеке делать поиск внешних символов (связей). $ gcc -o test test.c -lm Все математические функции библиотеки Си находятся в libm, так что добавь флаг линковщика и порядок. На всякий случай погляди ещё функцию atan2(3), может быть она тебе подойдёт лучше. -- Г.А. 02.03.2011 20:16, Константин Никулов пишет: > Всем добрый вечер. > > Подскажите пожалуйста, почему gcc ругается на применение обратных тригонометрических функций, говорит undefined link? Хотя заголовок нужный подключен. From Lonely.RuyK на mail.ru Thu Mar 3 02:23:21 2011 From: Lonely.RuyK на mail.ru (LonelyRuyK) Date: Thu, 3 Mar 2011 01:23:21 +0300 Subject: [P&AM Lab] =?utf-8?b?0JHQuNCx0LvQuNC+0YLQtdC60LAg0LHQvtC70YzRiNC4?= =?utf-8?b?0YUg0YfQuNGB0LXQuw==?= In-Reply-To: <4D6D52B5.7030703@komitex.ru> References: <201102212233.25450.Lonely.RuyK@mail.ru> <201103012227.46920.Lonely.RuyK@mail.ru> <4D6D52B5.7030703@komitex.ru> Message-ID: <201103030123.22081.Lonely.RuyK@mail.ru> Найден недочёт в bnum_safe_set (Забыли про присваивание знака) Написана предварительная версия bnum_mul. Отдаю её на ваш суд:) ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: mul.c Type: text/x-csrc Size: 1145 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Thu Mar 3 02:27:34 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 03 Mar 2011 01:27:34 +0300 Subject: [P&AM Lab] =?utf-8?b?0JHQuNCx0LvQuNC+0YLQtdC60LAg0LHQvtC70YzRiNC4?= =?utf-8?b?0YUg0YfQuNGB0LXQuw==?= In-Reply-To: <201103030123.22081.Lonely.RuyK@mail.ru> References: <201102212233.25450.Lonely.RuyK@mail.ru> <201103012227.46920.Lonely.RuyK@mail.ru> <4D6D52B5.7030703@komitex.ru> <201103030123.22081.Lonely.RuyK@mail.ru> Message-ID: <4D6EC456.2000307@komitex.ru> Борь, я пишу только прототипы. А тебе их доводить до ума -- твоя библиотека и твой проект. Тебе нужно с карандашом каждую строчку разбирать. Лучше наверное в список не присылать код, у тебя же теперь есть репозиторий ))) Это удобнее. Здесь можно только какие-то куски разбирать, наверное так. -- Г.А. 03.03.2011 01:23, LonelyRuyK пишет: > Найден недочёт в bnum_safe_set (Забыли про присваивание знака) Написана > предварительная версия bnum_mul. Отдаю её на ваш суд:) From sitkarev на komitex.ru Thu Mar 3 02:31:42 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 03 Mar 2011 01:31:42 +0300 Subject: [P&AM Lab] =?utf-8?b?0JHQuNCx0LvQuNC+0YLQtdC60LAg0LHQvtC70YzRiNC4?= =?utf-8?b?0YUg0YfQuNGB0LXQuw==?= In-Reply-To: <201103030123.22081.Lonely.RuyK@mail.ru> References: <201102212233.25450.Lonely.RuyK@mail.ru> <201103012227.46920.Lonely.RuyK@mail.ru> <4D6D52B5.7030703@komitex.ru> <201103030123.22081.Lonely.RuyK@mail.ru> Message-ID: <4D6EC54E.9020105@komitex.ru> В целом, неплохо. Прогресс есть. Замечания будут уже только завтра, точнее сегодня -- но днём, что увидел. Думаю стоит закоммитить в репозиторий, потом будем слать патчи. -- Г.А. 03.03.2011 01:23, LonelyRuyK пишет: > Найден недочёт в bnum_safe_set (Забыли про присваивание знака) Написана > предварительная версия bnum_mul. Отдаю её на ваш суд:) From nateford на inbox.ru Thu Mar 3 20:55:50 2011 From: nateford на inbox.ru (=?koi8-r?Q?=EB=CF=CE=D3=D4=C1=CE=D4=C9=CE_=EE=C9=CB=D5=CC=CF=D7?=) Date: Thu, 03 Mar 2011 19:55:50 +0300 Subject: [P&AM Lab] =?koi8-r?b?8MXSxcTB3sEg1yDG1c7Lw8nAIMTX1c3F0s7Px88g?= =?koi8-r?b?zcHT08nXwQ==?= In-Reply-To: <201103030123.22081.Lonely.RuyK@mail.ru> References: <201102212233.25450.Lonely.RuyK@mail.ru> <4D6D52B5.7030703@komitex.ru> <201103030123.22081.Lonely.RuyK@mail.ru> Message-ID: Всем добрый вечер. Подскажите пожалуйста, как передать в функцию двумерный массив вида float arr[x][y] да еще и потом в нем ворошить что-то. From rg-400 на list.ru Thu Mar 3 21:01:17 2011 From: rg-400 на list.ru (=?KOI8-R?Q?=E5=C7=CF=D2_=EF=C4=C9=CE=C3=CF=D7?=) Date: Thu, 03 Mar 2011 20:01:17 +0300 Subject: [P&AM Lab] =?koi8-r?b?8MXSxcTB3sEg1yDG1c7Lw8nAIMTX1c3F0s7Px88g?= =?koi8-r?b?zcHT08nXwQ==?= In-Reply-To: References: <201102212233.25450.Lonely.RuyK@mail.ru> <4D6D52B5.7030703@komitex.ru> <201103030123.22081.Lonely.RuyK@mail.ru> Message-ID: <4D6FC95D.4070508@list.ru> 03.03.2011 19:55, Константин Никулов пишет: > Всем добрый вечер. > > Подскажите пожалуйста, как передать в функцию двумерный массив вида > float arr[x][y] > да еще и потом в нем ворошить что-то. > Если массив произвольный, то лучше передать ссылку на массив (type **arr) и размеры(int x, int y). Вроде так почти всегда делают. From sitkarev на komitex.ru Thu Mar 3 21:13:28 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 03 Mar 2011 20:13:28 +0300 Subject: [P&AM Lab] =?utf-8?b?0J/QtdGA0LXQtNCw0YfQsCDQsiDRhNGD0L3QutGG0Lg=?= =?utf-8?b?0Y4g0LTQstGD0LzQtdGA0L3QvtCz0L4g0LzQsNGB0YHQuNCy0LA=?= In-Reply-To: <4D6FC95D.4070508@list.ru> References: <201102212233.25450.Lonely.RuyK@mail.ru> <4D6D52B5.7030703@komitex.ru> <201103030123.22081.Lonely.RuyK@mail.ru> <4D6FC95D.4070508@list.ru> Message-ID: <4D6FCC38.9010000@komitex.ru> Хороший вопрос. Я вкладываю исходник, думаю что объяснения тогда будут лишними. Вариант в func() гибче, чем func2d(). Егор в общем прав но видимо поспешил и вставил лишний уровень косвенности. Мне кажется что там достаточно всегда (type *). -- Г.А. 03.03.2011 20:01, Егор Одинцов пишет: > 03.03.2011 19:55, Константин Никулов пишет: >> Всем добрый вечер. >> >> Подскажите пожалуйста, как передать в функцию двумерный массив вида >> float arr[x][y] >> да еще и потом в нем ворошить что-то. >> > Если массив произвольный, то лучше передать ссылку на массив (type **arr) > и размеры(int x, int y). Вроде так почти всегда делают. > ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: arr.c Type: text/x-csrc Size: 631 bytes Desc: отсутствует URL: From nateford на inbox.ru Fri Mar 4 00:57:36 2011 From: nateford на inbox.ru (=?koi8-r?Q?=EB=CF=CE=D3=D4=C1=CE=D4=C9=CE_=EE=C9=CB=D5=CC=CF=D7?=) Date: Thu, 03 Mar 2011 23:57:36 +0300 Subject: [P&AM Lab] =?koi8-r?b?8NLPx9LBzc3BLCDT3snUwcDdwdEg1NLBxcvUz9LJ?= =?koi8-r?b?wCDQz8Qg0sXey8/KLg==?= In-Reply-To: <4D6FCC38.9010000@komitex.ru> References: <201102212233.25450.Lonely.RuyK@mail.ru> <4D6FC95D.4070508@list.ru> <4D6FCC38.9010000@komitex.ru> Message-ID: Написал программу для прокладки кратчайшей траектории под дном речки на расстоянии от дна не менее 1,5 единицы с помощью роющей машины, которая может рыть под под наибольшим углом 7 градусов. Задается: количество точек, в которых задается глубина, глубина в каждой из этих точек и длина интервала между точками. Выводится: направление роющей машины в каждой точке и глубина от поверхности речки в каждой точке, а так же как далеко от речки машина зайдет под землю и выйдет из под нее, а так же соответствующие углы. Наверняка куча ошибок, и нету комментов, но скоро сброшу версию с ними. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: отсутствует Type: application/octet-stream Size: 4052 bytes Desc: отсутствует URL: From rg-400 на list.ru Fri Mar 4 11:19:43 2011 From: rg-400 на list.ru (=?KOI8-R?Q?=E5=C7=CF=D2_=EF=C4=C9=CE=C3=CF=D7?=) Date: Fri, 04 Mar 2011 10:19:43 +0300 Subject: [P&AM Lab] =?koi8-r?b?8NLPx9LBzc3BLCDT3snUwcDdwdEg1NLBxcvUz9LJ?= =?koi8-r?b?wCDQz8Qg0sXey8/KLg==?= In-Reply-To: References: <201102212233.25450.Lonely.RuyK@mail.ru> <4D6FC95D.4070508@list.ru> <4D6FCC38.9010000@komitex.ru> Message-ID: <4D70928F.2000203@list.ru> 03.03.2011 23:57, Константин Никулов пишет: > Написал программу для прокладки кратчайшей траектории под дном речки на расстоянии от дна не менее 1,5 единицы с помощью роющей машины, которая может рыть под под наибольшим углом 7 градусов. > > Задается: количество точек, в которых задается глубина, глубина в каждой из этих точек и длина интервала между точками. > Выводится: направление роющей машины в каждой точке и глубина от поверхности речки в каждой точке, а так же как далеко от речки машина зайдет под землю и выйдет из под нее, а так же соответствующие углы. > > Наверняка куча ошибок, и нету комментов, но скоро сброшу версию с ними. Было бы здорово, если бы ты сразу тут идею рассказал. Вроде ты выбираешь самую глубокую точку и идешь вправо(там тоже выбираешь самую глубокую точку) и т.д...., а затем влево аналогично? Еще нужно бы уточнить угол может быть от 0 до 7, если да то нужно бы еще между максимумами выбирать углы так, чтобы они образовывали ломанную близкую к прямой. Насчет функций: int left_deepest(int start, float *set) int right_deepest(int start, float *set) Они обе ищут максимум в каком-то массиве, так что лучше будет использовать функцию с понятным названием int max_array_value(float *arr, int size) и с таким же как у тебя наполнением: int max_array_value(float *arr, int size) { float max; int idx, i; if (size == 0) return -1; idx = 0; /* считаем, что максимальный элемент это первый */ max = arr[0]; for (i = 0; i< size; i++) if (max< arr[i]) { max = arr[i]; idx = i; } return idx; } И теперь лишь нужно вычислять адрес первого элемента и размер. From nateford на inbox.ru Fri Mar 4 15:08:12 2011 From: nateford на inbox.ru (=?koi8-r?Q?=EB=CF=CE=D3=D4=C1=CE=D4=C9=CE_=EE=C9=CB=D5=CC=CF=D7?=) Date: Fri, 04 Mar 2011 14:08:12 +0300 Subject: [P&AM Lab] =?koi8-r?b?8NLPx9LBzc3BLCDT3snUwcDdwdEg1NLBxcvUz9LJ?= =?koi8-r?b?wCDQz8Qg0sXey8/KLg==?= Message-ID: Не знаю, Егор, там наверное не очень удобно так делать будет... По крайней мере у меня не получается придумать, как эту функцию приспособить... Вот исходник с комментами и небольшими исправлениями. Жду советов по улучшению... А еще есть бажок, происхождение которого я не могу понять: в переменной finish число всегда почему-то несколько меньше получается, чем должно.. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: отсутствует Type: application/octet-stream Size: 5098 bytes Desc: отсутствует URL: From nateford на inbox.ru Fri Mar 4 17:39:09 2011 From: nateford на inbox.ru (=?koi8-r?Q?=EB=CF=CE=D3=D4=C1=CE=D4=C9=CE_=EE=C9=CB=D5=CC=CF=D7?=) Date: Fri, 04 Mar 2011 16:39:09 +0300 Subject: [P&AM Lab] =?koi8-r?b?8NLPx9LBzc3BLCDT3snUwcDdwdEg1NLBxcvUz9LJ?= =?koi8-r?b?wA==?= Message-ID: А вот этот вариант даже заработал под виндовсом, ни в каком месте не вылетел с критической ошибкой... Правда с переменной finish все равно что-то невообразимое происходит. ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: отсутствует Type: application/octet-stream Size: 5209 bytes Desc: отсутствует URL: From nateford на inbox.ru Sun Mar 6 15:59:38 2011 From: nateford на inbox.ru (=?utf-8?Q?=D0=9A=D0=BE=D0=BD=D1=81=D1=82=D0=B0=D0=BD=D1=82=D0=B8=D0=BD_=D0=9D=D0=B8=D0=BA=D1=83=D0=BB=D0=BE=D0=B2?=) Date: Sun, 06 Mar 2011 14:59:38 +0300 Subject: [P&AM Lab] =?utf-8?b?0J/RgNC+0LPRgNCw0LzQvNCwLCDRgdGH0LjRgtCw0Y4=?= =?utf-8?b?0YnQsNGPINGC0YDQsNC10LrRgtC+0YDQuNGOINC/0L7QtCDRgNC10Yc=?= =?utf-8?b?0LrQvtC5?= In-Reply-To: References: Message-ID: Вот, вариант получше. Распилил main() на отдельные функции, к каждой написал комменты, немножко улучшил пользовательский интерфейс. Теперь это даже можно понять) ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: отсутствует Type: application/octet-stream Size: 6968 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Mon Mar 7 12:49:25 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 07 Mar 2011 11:49:25 +0300 Subject: [P&AM Lab] =?utf-8?b?0J/QvtGB0YLQsNC90L7QstC60LAg0LfQsNC00LDRh9C4?= =?utf-8?b?INC/0L4gS01M?= Message-ID: <4D749C15.8050405@komitex.ru> Приветствую всех. После субботней встречи я немного подумал и решил что пожалуй рекурсивная схема подойдёт для решения наших задач. Ниже некоторые соображения по этому поводу. Я нарисовал картинку чтобы было понятнее почему это будет работать и составил примерный псевдокод, чтобы было ясно как это реализовывать. Попробуем поставить задачу по реализации алгоритма умножения А.Карацубы. Сперва сделаем прикидку по глубине рекурсии. Пусть например числа закодированы 2^20 битами (1048576 бит) а базовыми числами примем тогда 2^5 (32 бита), что соответствует возможностям любой 32-х разрядной машины которая будет производить умножение 32-х битных чисел аппаратно. Тогда для того чтобы рекурсивно дойти до базового умножения от верхушки до низа нам потребуется 20-5=15 рекурсий (lb(2^20)-lb(32)=20-5=15), что можно считать приемлемым. Насколько большим окажется это число в десятичном виде? Посчитаем. lg(2^(2^20))=2^20*lg(2) ~ 315653 десятичных разряда. Пусть например, у нас рекурсия будет глубиной 27, это тоже приемлемо, тогда мы сможем умножать числа состоящие из: lg(2^(2^32))=2^32*lg(2) ~ 1292913986 десятичных разрядов. Для наших практических задач этого более чем достаточно. И даже если потребуются числа больше, рекурсия вполне допустима глубже. После того как будет работать рекурсивный алгоритм, можно задуматься об оптимизации. Ясно что нужно снижать накладные затраты на промежуточные операции, организацию рекурсивных вызовов, оптимизировать операции сдвигов. Для хранения разрядов промежуточных переменных, используемых в вычислениях, вероятно будет целесообразным выделять память в стеке через alloca(3) а не через malloc(3). Тогда следует добавить флаг в структуру bignum, который указывает на то что не нужно высвобождать память в поле val. Дальнейшая оптимизация будет заключаться в том чтобы устранить рекурсию на нижних ветвях совершенно, выполняя умножения чисел прямо в функции, без рекурсии. Тогда появятся функции вроде kmul_128, kmul_256, kmul_512 и т.д. По сути это тот-же самый рекурсивный вариант но в нём будут отсутствовать накладные расходы на передачу аргументов в стек/регистры и обратно при рекурсивном вызове. Ещё раз стоит сказать что задача оптимизации откладывается на самый последний момент. Сначала следует получить рабочие, надёжные и ясные алгоритмы с которыми можно будет делать сравнение и использовать как прототип. В псевдокоде задача выглядит приблизительно так: xy: результат умножения двух чисел, x*y x1: указатель на разряды в верхней половине числа x y1: указатель на разряды в верхней половине числа y x0: указатель на разряды в нижней половине числа x y0: указатель на разряды в нижней половине числа y n: количество бит из которых состоит число x и число y Вспомогательные функции для bignum: shift_left: осуществляет сдвиг влево (в сторону больших значений) add3: суммирует три числа 8<------------------------------------------------------------------------- function kmul_basic(xy [out], x1 [in], y1 [in], x0 [in], y0 [in], n [in]) { temp z0, z1, z2; m = n / 2; z2 = x1 * y1; z0 = x0 * y0; z1 = z2 + z0; shift_left(z2, 2*m); shift_left(z1, m); xy = add3(z0, z1, z2); } function kmul_recursive(xy [out], x1 [in], y1 [in], x0 [in], y0 [in], n [in]) { temp z0, z1, z2; m = n / 2; if (m <= basic_size) { kmul_basic(z2, x1+m, y1+m, x1, y1, m); kmul_basic(z0, x0+m, y0+m, x0, y0, m); } else { kmul_recursive(z2, x1+m, y1+m, x1, y1, m); kmul_recursive(z0, x0+m, y0+m, x0, y0, m); } z2 = x1 * y1; z0 = x0 * y0; z1 = z2 + z0; shift_left(z2, 2*m); shift_left(z1, m); xy = add3(z0, z1, z2); } 8<------------------------------------------------------------------------- Стоит дать некоторые пояснения. Здесь прибавление к x1,y1,x0,y0 целого числа m позволяет передать в функции половинки от значений x1,y1,x0,y0 (в битах), как будто это смещения к указателям, но заданные в битах. В функции kmul_recursive для промежуточных вычислений используются bignum, для удобства они заменены обычной арифметикой (всё-таки у нас псевдокод). Жду комментариев и поправок. Я мог что-то упустить из виду. -- Г.А. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: kml.ps.gz Type: application/x-gzip Size: 50470 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Mon Mar 7 13:16:29 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 07 Mar 2011 12:16:29 +0300 Subject: [P&AM Lab] =?utf-8?b?0J/QvtGB0YLQsNC90L7QstC60LAg0LfQsNC00LDRh9C4?= =?utf-8?b?INC/0L4gS01M?= In-Reply-To: <4D749C15.8050405@komitex.ru> References: <4D749C15.8050405@komitex.ru> Message-ID: <4D74A26D.4050903@komitex.ru> Заметили опечатки. Исправленный псевдо-код и портянка со схемой. 8<------------------------------------------------------------------------- function kmul_basic(xy [out], x1 [in], y1 [in], x0 [in], y0 [in], n [in]) { temp z0, z1, z2; m = n / 2; z2 = x1 * y1; z0 = x0 * y0; z1 = (x1 + x0)*(y1 + y0) - z2 - z0; shift_left(z2, 2*m); shift_left(z1, m); xy = add3(z0, z1, z2); } function kmul_recursive(xy [out], x1 [in], y1 [in], x0 [in], y0 [in], n [in]) { temp z0, z1, z2; m = n / 2; if (m <= basic_size) { kmul_basic(z2, x1+m, y1+m, x1, y1, m); kmul_basic(z0, x0+m, y0+m, x0, y0, m); } else { kmul_recursive(z2, x1+m, y1+m, x1, y1, m); kmul_recursive(z0, x0+m, y0+m, x0, y0, m); } z2 = x1 * y1; z0 = x0 * y0; z1 = (x1 + x0)*(y1 + y0) - z2 - z0; shift_left(z2, 2*m); shift_left(z1, m); xy = add3(z0, z1, z2); } 8<------------------------------------------------------------------------- > > Жду комментариев и поправок. Я мог что-то упустить из виду. > > -- > Г.А. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: kml.ps.gz Type: application/x-gzip Size: 50771 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Tue Mar 8 09:47:41 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Tue, 08 Mar 2011 08:47:41 +0300 Subject: [P&AM Lab] =?utf-8?b?0J/QvtGB0YLQsNC90L7QstC60LAg0LfQsNC00LDRh9C4?= =?utf-8?b?INC/0L4gS01M?= In-Reply-To: <4D74A26D.4050903@komitex.ru> References: <4D749C15.8050405@komitex.ru> <4D74A26D.4050903@komitex.ru> Message-ID: <4D75C2FD.1050302@komitex.ru> Ещё кое-что упустил из виду. Уж простите. Закомментировал ненужные строки в этой функции, мы же уже посчитали z0 и z2 на предыдущем шаге. Добавлю ещё следующее. В функции kmul_basic() вычисление z1 уже не вмещается в машинную арифметику 32-х разрядной машины, т.к. x0..y1 числа по 32 бита, их сумма и произведение будет больше чем 64 бита. Поэтому там эти операции уже как с bignum должны быть сделаны. Числа z2 и z0 вмещаются в u_int64_t, поэтому вероятно стоит какую-то функцию потом написать чтобы из bignum вычитать/прибавлять u_int64_t без необходимости представления z0 и z1 в bignum (видимо что-то вроде bignum_add_int() и bignum_sub_int() и т.д.). Экономия достигается за счёт того что после того как мы посчитали z0 и z1 во внешней функции рекурсивной длинное умножение, чтобы получить z1, выполняется для чисел почти в два раза меньше порядком чем исходное. А т.к. у нас длинное умножение O(n^2) -- эффект будет ощущаться на очень больших числах. Надо искать дальше где у нас неточности. Всё равно это только наброски. 8<-------------------------------------------------------------------- function kmul_recursive(xy [out], x1 [in], y1 [in], x0 [in], y0 [in], n [in]) { temp z0, z1, z2; m = n / 2; if (m <= basic_size) { kmul_basic(z2, x1+m, y1+m, x1, y1, m); kmul_basic(z0, x0+m, y0+m, x0, y0, m); } else { kmul_recursive(z2, x1+m, y1+m, x1, y1, m); kmul_recursive(z0, x0+m, y0+m, x0, y0, m); } /* z2 = x1 * y1; */ /* z0 = x0 * y0; */ z1 = (x1 + x0)*(y1 + y0) - z2 - z0; shift_left(z2, 2*m); shift_left(z1, m); xy = add3(z0, z1, z2); } 8<------------------------------------------------------------------- -- Г.А. 07.03.2011 12:16, Grigoriy A. Sitkarev пишет: > Заметили опечатки. > > Исправленный псевдо-код и портянка со схемой. > From nateford на inbox.ru Thu Mar 10 23:36:06 2011 From: nateford на inbox.ru (=?utf-8?Q?=D0=9A=D0=BE=D0=BD=D1=81=D1=82=D0=B0=D0=BD=D1=82=D0=B8=D0=BD_=D0=9D=D0=B8=D0=BA=D1=83=D0=BB=D0=BE=D0=B2?=) Date: Thu, 10 Mar 2011 22:36:06 +0300 Subject: [P&AM Lab] =?utf-8?b?0J/RgNC+0LPRgNCw0LzQvNCwLCDRgdGH0LjRgtCw0Y4=?= =?utf-8?b?0YnQsNGPINGC0YDQsNC10LrRgtC+0YDQuNGOINC/0L7QtCDRgNC10Yc=?= =?utf-8?b?0LrQvtC5?= In-Reply-To: References: Message-ID: Вот, сделал окончательный (надеюсь) вариант. Программа принимает от пользователя шаг, через который пользователь задает глубину речки, а так же количество точек, в которых задается глубина. Ну, и естественно, глубины. Так же программа принимает длину кусков трубы, которые ндо затолкать под землю и минимальное расстояние между дном речки и прокладываемой траекторией. Программа высчитывает траекторию движения мшины, причем длина каждого отрезка траектории нацело делится на заданную длину куска трубы. Расстояние в кусках трубы программа тоже ишет. ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: отсутствует Type: application/octet-stream Size: 8342 bytes Desc: отсутствует URL: From nateford на inbox.ru Fri Mar 11 11:36:19 2011 From: nateford на inbox.ru (=?utf-8?Q?=D0=9A=D0=BE=D0=BD=D1=81=D1=82=D0=B0=D0=BD=D1=82=D0=B8=D0=BD_=D0=9D=D0=B8=D0=BA=D1=83=D0=BB=D0=BE=D0=B2?=) Date: Fri, 11 Mar 2011 10:36:19 +0300 Subject: [P&AM Lab] =?utf-8?b?0J/RgNC+0LPRgNCw0LzQvNCwLCDRgdGH0LjRgtCw0Y4=?= =?utf-8?b?0YnQsNGPINGC0YDQsNC10LrRgtC+0YDQuNGOINC/0L7QtCDRgNC10Yc=?= =?utf-8?b?0LrQvtC5?= In-Reply-To: References: Message-ID: Беда, где-то бажок. Буду искать. Thu, 10 Mar 2011 22:36:06 +0300 письмо от Константин Никулов: Вот, сделал окончательный (надеюсь) вариант. Программа принимает от пользователя шаг, через который пользователь задает глубину речки, а так же количество точек, в которых задается глубина. Ну, и естественно, глубины. Так же программа принимает длину кусков трубы, которые ндо затолкать под землю и минимальное расстояние между дном речки и прокладываемой траекторией. Программа высчитывает траекторию движения мшины, причем длина каждого отрезка траектории нацело делится на заданную длину куска трубы. Расстояние в кусках трубы программа тоже ишет. _______________________________________________ Lab mailing list Lab на wiki.syktsu.ru (sentmsg?compose&To=Lab на wiki.syktsu.ru) http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/lab (http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/lab) ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: From nateford на inbox.ru Fri Mar 11 15:04:58 2011 From: nateford на inbox.ru (=?utf-8?Q?=D0=9A=D0=BE=D0=BD=D1=81=D1=82=D0=B0=D0=BD=D1=82=D0=B8=D0=BD_=D0=9D=D0=B8=D0=BA=D1=83=D0=BB=D0=BE=D0=B2?=) Date: Fri, 11 Mar 2011 14:04:58 +0300 Subject: [P&AM Lab] =?utf-8?b?0J/RgNC+0LPRgNCw0LzQvNCwLCDRgdGH0LjRgtCw0Y4=?= =?utf-8?b?0YnQsNGPINGC0YDQsNC10LrRgtC+0YDQuNGOINC/0L7QtCDRgNC10Yc=?= =?utf-8?b?0LrQvtC5?= In-Reply-To: References: Message-ID: Смешно, но все не так) Fri, 11 Mar 2011 10:36:19 +0300 письмо от Константин Никулов: Беда, где-то бажок. Буду искать. Thu, 10 Mar 2011 22:36:06 +0300 письмо от Константин Никулов: Вот, сделал окончательный (надеюсь) вариант. Программа принимает от пользователя шаг, через который пользователь задает глубину речки, а так же количество точек, в которых задается глубина. Ну, и естественно, глубины. Так же программа принимает длину кусков трубы, которые ндо затолкать под землю и минимальное расстояние между дном речки и прокладываемой траекторией. Программа высчитывает траекторию движения мшины, причем длина каждого отрезка траектории нацело делится на заданную длину куска трубы. Расстояние в кусках трубы программа тоже ишет. _______________________________________________ Lab mailing list Lab на wiki.syktsu.ru http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/lab _______________________________________________ Lab mailing list Lab на wiki.syktsu.ru (sentmsg?compose&To=Lab на wiki.syktsu.ru) http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/lab (http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/lab) ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: From nateford на inbox.ru Fri Mar 11 17:04:08 2011 From: nateford на inbox.ru (=?utf-8?Q?=D0=9A=D0=BE=D0=BD=D1=81=D1=82=D0=B0=D0=BD=D1=82=D0=B8=D0=BD_=D0=9D=D0=B8=D0=BA=D1=83=D0=BB=D0=BE=D0=B2?=) Date: Fri, 11 Mar 2011 16:04:08 +0300 Subject: [P&AM Lab] =?utf-8?b?0J/RgNC+0LPRgNCw0LzQvNCwLCDRgdGH0LjRgtCw0Y4=?= =?utf-8?b?0YnQsNGPINGC0YDQsNC10LrRgtC+0YDQuNGOINC/0L7QtCDRgNC10Yc=?= =?utf-8?b?0LrQvtC5?= Message-ID: Ура!) Переделал, теперь результаты похожи на правду. ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: отсутствует Type: application/octet-stream Size: 8854 bytes Desc: отсутствует URL: From nateford на inbox.ru Fri Mar 11 17:18:33 2011 From: nateford на inbox.ru (=?utf-8?Q?=D0=9A=D0=BE=D0=BD=D1=81=D1=82=D0=B0=D0=BD=D1=82=D0=B8=D0=BD_=D0=9D=D0=B8=D0=BA=D1=83=D0=BB=D0=BE=D0=B2?=) Date: Fri, 11 Mar 2011 16:18:33 +0300 Subject: [P&AM Lab] =?utf-8?b?0J/RgNC+0LPRgNCw0LzQvNCwLCDRgdGH0LjRgtCw0Y4=?= =?utf-8?b?0YnQsNGPINGC0YDQsNC10LrRgtC+0YDQuNGOINC/0L7QtCDRgNC10Yc=?= =?utf-8?b?0LrQvtC5?= Message-ID: беда сегодня со мной, криво вывод сделал. Вот с нормальным выводом... ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: отсутствует Type: application/octet-stream Size: 8855 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Sun Mar 13 01:30:16 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sun, 13 Mar 2011 00:30:16 +0300 Subject: [P&AM Lab] FFT sources Message-ID: <4D7BE5E8.9010301@komitex.ru> Приветствую всех. На нашем сервере subversion выложен исходный код FFT. Его можно стащить через svn: $ svn co http://wiki.syktsu.ru/svn/dsp или смотреть прямо в броузере исходники по ссылке http://wiki.syktsu.ru/websvn/listing.php?repname=dsp&path=%2F&sc=0. -- Г.А. From rg-400 на list.ru Mon Mar 14 21:34:18 2011 From: rg-400 на list.ru (=?KOI8-R?Q?=E5=C7=CF=D2_=EF=C4=C9=CE=C3=CF=D7?=) Date: Mon, 14 Mar 2011 20:34:18 +0300 Subject: [P&AM Lab] =?koi8-r?b?4snCzMnP1MXLwSDCz8zY28nIIN7J08XM?= In-Reply-To: <4D6EC54E.9020105@komitex.ru> References: <201102212233.25450.Lonely.RuyK@mail.ru> <201103012227.46920.Lonely.RuyK@mail.ru> <4D6D52B5.7030703@komitex.ru> <201103030123.22081.Lonely.RuyK@mail.ru> <4D6EC54E.9020105@komitex.ru> Message-ID: <4D7E519A.8010305@list.ru> Немного упростил функцию сравнения (тесты она прошла). Может есть смысл добавить макросы? #define BNUM_NEGATIVE(num) ((num)->sign == 1) #define BNUM_POSITIVE(num) ((num)->sign == 0) #define BNUM_SIGNEQ(num1, num2) ((num1)->sign == (num2)->sign)/ /Коммитить не могу, т.к. нет пользователя. From rg-400 на list.ru Mon Mar 14 21:44:54 2011 From: rg-400 на list.ru (=?KOI8-R?Q?=E5=C7=CF=D2_=EF=C4=C9=CE=C3=CF=D7?=) Date: Mon, 14 Mar 2011 20:44:54 +0300 Subject: [P&AM Lab] =?koi8-r?b?4snCzMnP1MXLwSDCz8zY28nIIN7J08XM?= In-Reply-To: <4D7E519A.8010305@list.ru> References: <201102212233.25450.Lonely.RuyK@mail.ru> <201103012227.46920.Lonely.RuyK@mail.ru> <4D6D52B5.7030703@komitex.ru> <201103030123.22081.Lonely.RuyK@mail.ru> <4D6EC54E.9020105@komitex.ru> <4D7E519A.8010305@list.ru> Message-ID: <4D7E5416.5010200@list.ru> забыл вложить ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: cmp.c Type: text/x-csrc Size: 753 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Mon Mar 14 22:17:54 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 14 Mar 2011 21:17:54 +0300 Subject: [P&AM Lab] =?utf-8?b?0JHQuNCx0LvQuNC+0YLQtdC60LAg0LHQvtC70YzRiNC4?= =?utf-8?b?0YUg0YfQuNGB0LXQuw==?= In-Reply-To: <4D7E519A.8010305@list.ru> References: <201102212233.25450.Lonely.RuyK@mail.ru> <201103012227.46920.Lonely.RuyK@mail.ru> <4D6D52B5.7030703@komitex.ru> <201103030123.22081.Lonely.RuyK@mail.ru> <4D6EC54E.9020105@komitex.ru> <4D7E519A.8010305@list.ru> Message-ID: <4D7E5BD2.5050303@komitex.ru> Вообще там по идее sign нужно как логическое значение использовать, поэтому раз уже макросы задумали то там нужно проверять на true/false. Сравнение тогда тоже на true. Можно добавить я думаю. Ты присылай Боре патчи он будет их накладывать и коммитить. По поводу сравнения, мне кажется что там не предусмотрен случай с -0 и 0, они должны быть равны. -- Г.А. 14.03.2011 20:34, Егор Одинцов пишет: > Немного упростил функцию сравнения (тесты она прошла). > > Может есть смысл добавить макросы? > > #define BNUM_NEGATIVE(num) ((num)->sign == 1) > #define BNUM_POSITIVE(num) ((num)->sign == 0) > #define BNUM_SIGNEQ(num1, num2) ((num1)->sign == (num2)->sign)/ > > /Коммитить не могу, т.к. нет пользователя. From sitkarev на komitex.ru Mon Mar 14 22:22:20 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 14 Mar 2011 21:22:20 +0300 Subject: [P&AM Lab] =?utf-8?b?0JHQuNCx0LvQuNC+0YLQtdC60LAg0LHQvtC70YzRiNC4?= =?utf-8?b?0YUg0YfQuNGB0LXQuw==?= In-Reply-To: <4D7E5BD2.5050303@komitex.ru> References: <201102212233.25450.Lonely.RuyK@mail.ru> <201103012227.46920.Lonely.RuyK@mail.ru> <4D6D52B5.7030703@komitex.ru> <201103030123.22081.Lonely.RuyK@mail.ru> <4D6EC54E.9020105@komitex.ru> <4D7E519A.8010305@list.ru> <4D7E5BD2.5050303@komitex.ru> Message-ID: <4D7E5CDC.7020605@komitex.ru> Да, там res обнуляется прямо в цикле. Так что вроде как нули с разными знаками должны дать ноль. Честно говоря, не очень очевидный вариант получился со сравнением. Причина простая. В предыдущей версии были чётко разделены две ветки, когда знаки равны и когда не равны. Как минимум, я думаю нужно вынести обнуление res из инициализации цикла. Можно и этот вариант оставить но мне кажется что предыдущий был проще хоть и длиннее. Я могу быть не прав. -- Г.А. 14.03.2011 21:17, Grigoriy A. Sitkarev пишет: > Вообще там по идее sign нужно как логическое значение использовать, > поэтому раз уже макросы задумали то там нужно проверять на true/false. > > Сравнение тогда тоже на true. > > Можно добавить я думаю. Ты присылай Боре патчи он будет их накладывать и > коммитить. > > По поводу сравнения, мне кажется что там не предусмотрен случай с -0 и > 0, они должны быть равны. > > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/lab From rg-400 на list.ru Mon Mar 14 23:49:18 2011 From: rg-400 на list.ru (=?KOI8-R?Q?=E5=C7=CF=D2_=EF=C4=C9=CE=C3=CF=D7?=) Date: Mon, 14 Mar 2011 22:49:18 +0300 Subject: [P&AM Lab] =?koi8-r?b?4snCzMnP1MXLwSDCz8zY28nIIN7J08XM?= In-Reply-To: <4D7E5CDC.7020605@komitex.ru> References: <201102212233.25450.Lonely.RuyK@mail.ru> <201103012227.46920.Lonely.RuyK@mail.ru> <4D6D52B5.7030703@komitex.ru> <201103030123.22081.Lonely.RuyK@mail.ru> <4D6EC54E.9020105@komitex.ru> <4D7E519A.8010305@list.ru> <4D7E5BD2.5050303@komitex.ru> <4D7E5CDC.7020605@komitex.ru> Message-ID: <4D7E713E.3080708@list.ru> 14.03.2011 21:22, Grigoriy A. Sitkarev пишет: > Да, там res обнуляется прямо в цикле. Так что вроде как нули с разными > знаками должны дать ноль. > > Честно говоря, не очень очевидный вариант получился со сравнением. > Причина простая. В предыдущей версии были чётко разделены две ветки, > когда знаки равны и когда не равны. > > Как минимум, я думаю нужно вынести обнуление res из инициализации > цикла. Можно и этот вариант оставить но мне кажется что предыдущий был > проще хоть и длиннее. Я могу быть не прав. Смущает количество return`ов (7 штук). res можно вытащить(скобочки лишние не хотел). Но тут у меня есть ошибка и теста на неё нет (когда числа разного знака и они меньше значения 65536), т.е. top == 0, а число не равно нулю. Нужно проверить тест. И еще бы сделать его более простыми и удобными. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: ncmp.c Type: text/x-csrc Size: 813 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Tue Mar 15 00:16:57 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 14 Mar 2011 23:16:57 +0300 Subject: [P&AM Lab] =?utf-8?b?0JHQuNCx0LvQuNC+0YLQtdC60LAg0LHQvtC70YzRiNC4?= =?utf-8?b?0YUg0YfQuNGB0LXQuw==?= In-Reply-To: <4D7E713E.3080708@list.ru> References: <201102212233.25450.Lonely.RuyK@mail.ru> <201103012227.46920.Lonely.RuyK@mail.ru> <4D6D52B5.7030703@komitex.ru> <201103030123.22081.Lonely.RuyK@mail.ru> <4D6EC54E.9020105@komitex.ru> <4D7E519A.8010305@list.ru> <4D7E5BD2.5050303@komitex.ru> <4D7E5CDC.7020605@komitex.ru> <4D7E713E.3080708@list.ru> Message-ID: <4D7E77B9.2040401@komitex.ru> > Смущает количество return`ов (7 штук). res можно вытащить(скобочки > лишние не хотел). Мы ещё и goto пользуемся, если это нужно. Это в структурном программировании на goto и несколько return-ов наложен запрет, часто просто бездумно ему следуют. А мы нет. Си позволяет делать очень сложные условия в циклах, делать инициализацию нескольких переменных и вставлять несколько выражений в приращение. Отсутствие ограничений может дать повод на неоправданно сложные конструкции в них. Если посмотреть классиков программирования, то можно заметить что они очень умеренно использовали эту возможность а сложные выражения в циклах через запятую оставлены для применения в макросах. Да и скобки лишними не бывают. Лаконичность она не в количестве знаков выражается, а в простоте задумки, реализованной в коде. Там эти скобки нужны, причём я например ставлю скобки везде, даже если это выражения в одну строчку, если хотя бы в одной части скобки были: if (a->top > b->top) res = 1; else if (a->top < b->top) res = -1; else { ... } С типографской точки зрения лучше выглядит: if (a->top > b->top) { res = 1; } else if (a->top < b->top) { res = -1; else { ... } -- Г.А. From Lonely.RuyK на mail.ru Tue Mar 15 02:25:42 2011 From: Lonely.RuyK на mail.ru (LonelyRuyK) Date: Tue, 15 Mar 2011 01:25:42 +0300 Subject: [P&AM Lab] =?utf-8?b?0JHQuNCx0LvQuNC+0YLQtdC60LAg0LHQvtC70YzRiNC4?= =?utf-8?b?0YUg0YfQuNGB0LXQuw==?= In-Reply-To: <4D7E77B9.2040401@komitex.ru> References: <201102212233.25450.Lonely.RuyK@mail.ru> <4D7E713E.3080708@list.ru> <4D7E77B9.2040401@komitex.ru> Message-ID: <201103150125.42624.Lonely.RuyK@mail.ru> Нашёл ошибку в ncmp.c Должно быть if (!BNUM_SIGNEQ(a, b)) if (((a->val > 0) && (b->val > 0)) && ((a->val[0] != 0x0) || (b->val[0] != 0x0))) return BNUM_POSITIVE(a) ? 1: -1; иначе не проходит проверку на 0, -0. надеюсь ничего не напутал From Lonely.RuyK на mail.ru Tue Mar 15 02:33:47 2011 From: Lonely.RuyK на mail.ru (LonelyRuyK) Date: Tue, 15 Mar 2011 01:33:47 +0300 Subject: [P&AM Lab] =?utf-8?b?0JHQuNCx0LvQuNC+0YLQtdC60LAg0LHQvtC70YzRiNC4?= =?utf-8?b?0YUg0YfQuNGB0LXQuw==?= In-Reply-To: <201103150125.42624.Lonely.RuyK@mail.ru> References: <201102212233.25450.Lonely.RuyK@mail.ru> <4D7E77B9.2040401@komitex.ru> <201103150125.42624.Lonely.RuyK@mail.ru> Message-ID: <201103150133.47770.Lonely.RuyK@mail.ru> Запостил новую функцию в репозиторий. Надеюсь фамилию правильно написал, и нигде не ошибся^_^ From ilyaart90 на rambler.ru Wed Mar 16 18:36:51 2011 From: ilyaart90 на rambler.ru ( ) Date: Wed, 16 Mar 2011 17:36:51 +0300 Subject: [P&AM Lab] =?windows-1251?b?7/Dl7uHw4Ofu4uDt6OUg9+jx6+A=?= Message-ID: <194962170.1300286211.194727216.56783@mcgi24.rambler.ru> Начал реализовывать ГОСТ и на одном этапе потребовалось разбить число int в массив по 4 бита на ячейку. есть ли какие-нибудь функции для этого? ато кроме сдвигов идей никаких. From sitkarev на komitex.ru Wed Mar 16 18:40:57 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 16 Mar 2011 17:40:57 +0300 Subject: [P&AM Lab] =?utf-8?b?0L/RgNC10L7QsdGA0LDQt9C+0LLQsNC90LjQtSDRh9C4?= =?utf-8?b?0YHQu9Cw?= In-Reply-To: <194962170.1300286211.194727216.56783@mcgi24.rambler.ru> References: <194962170.1300286211.194727216.56783@mcgi24.rambler.ru> Message-ID: <4D80CBF9.4080902@komitex.ru> Если напишешь функцию -- будет. Даю подсказку. Таблицу подстановок в ГОСТе лучше расширить до 256 байтов и заменять сразу по целому байту а не выдёргивая и сдвигая по 4-е бита. -- Г.А. 16.03.2011 17:36, ilyaart90 на rambler.ru пишет: > Начал реализовывать ГОСТ и на одном этапе потребовалось разбить число > int в массив по 4 бита на ячейку. > есть ли какие-нибудь функции для этого? > ато кроме сдвигов идей никаких. From ilyaart90 на rambler.ru Wed Mar 16 19:49:30 2011 From: ilyaart90 на rambler.ru ( ) Date: Wed, 16 Mar 2011 18:49:30 +0300 Subject: [P&AM Lab] =?windows-1251?b?7/Dl7uHw4Ofu4uDt6OUg9+jx6+A=?= References: <194962170.1300286211.194727216.56783@mcgi24.rambler.ru> <4D80CBF9.4080902@komitex.ru> Message-ID: <947016309.1300290570.98278824.52031@mcgi-wr-25.rambler.ru> и еще вопрос по самой таблице подстановок. как ее правильно заполнять? не смог найти матерьял доступнее RFC4357 (для меня это темный лес), на который все ссылаются. > Если напишешь функцию -- будет. > > Даю подсказку. Таблицу подстановок в ГОСТе лучше расширить до 256 байтов > и заменять сразу по целому байту а не выдёргивая и сдвигая по 4-е бита. From sitkarev на komitex.ru Wed Mar 16 20:44:01 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 16 Mar 2011 19:44:01 +0300 Subject: [P&AM Lab] =?utf-8?b?0L/RgNC10L7QsdGA0LDQt9C+0LLQsNC90LjQtSDRh9C4?= =?utf-8?b?0YHQu9Cw?= In-Reply-To: <947016309.1300290570.98278824.52031@mcgi-wr-25.rambler.ru> References: <194962170.1300286211.194727216.56783@mcgi24.rambler.ru> <4D80CBF9.4080902@komitex.ru> <947016309.1300290570.98278824.52031@mcgi-wr-25.rambler.ru> Message-ID: <4D80E8D1.8060207@komitex.ru> Не 256 конечно а 128, потому что 16*8=128. Я хотел сказать что вся таблица подстановок должна быть вмещена в 128 байт, хотя в каждом элементе хранится только 4-х битное значение. А дальше всё просто. u_int8_t sbox[128]; u_int32_t x, y; ... y = sbox[x & 0xf] | sbox[16 + ((x >> 4) & 0xf)] | sbox[32 + ((x >> 8) & 0xf)] | sbox[48 + ((x >> 12) 0xf)] | sbox[64 + ((x >> 16) & 0xf)] | sbox[80 + ((x >> 20) & 0xf] | sbox[96 + ((x >> 24) & 0xf)] | sbox[112 + ((x >> 28)]; ... Здесь в x результат предыдущего шага, а в y результат подстановки. Думаю что идея ясна. -- Г.А. 16.03.2011 18:49, ilyaart90 на rambler.ru пишет: > и еще вопрос по самой таблице подстановок. > как ее правильно заполнять? > не смог найти матерьял доступнее RFC4357 (для меня это темный лес), на > который все ссылаются. From sitkarev на komitex.ru Wed Mar 16 20:59:07 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 16 Mar 2011 19:59:07 +0300 Subject: [P&AM Lab] =?utf-8?b?0L/RgNC10L7QsdGA0LDQt9C+0LLQsNC90LjQtSDRh9C4?= =?utf-8?b?0YHQu9Cw?= In-Reply-To: <4D80E8D1.8060207@komitex.ru> References: <194962170.1300286211.194727216.56783@mcgi24.rambler.ru> <4D80CBF9.4080902@komitex.ru> <947016309.1300290570.98278824.52031@mcgi-wr-25.rambler.ru> <4D80E8D1.8060207@komitex.ru> Message-ID: <4D80EC5B.5040000@komitex.ru> Так быстро хотел ответить, что забыл подвинуть их на место. > y = sbox[x & 0xf] | sbox[16 + ((x >> 4) & 0xf)] | > sbox[32 + ((x >> 8) & 0xf)] | sbox[48 + ((x >> 12) 0xf)] | > sbox[64 + ((x >> 16) & 0xf)] | sbox[80 + ((x >> 20) & 0xf] | > sbox[96 + ((x >> 24) & 0xf)] | sbox[112 + ((x >> 28)]; Должно быть как-то так: y = sbox[x & 0xf] | sbox[16 + ((x >> 4) & 0xf)] << 4 | sbox[32 + ((x >> 8) & 0xf)] << 8 | sbox[48 + ((x >> 12) & 0xf)] << 12 | sbox[64 + ((x >> 16) & 0xf)] << 16 | sbox[80 + ((x >> 20) & 0xf]] << 20 | sbox[96 + ((x >> 24) & 0xf)] << 24 | sbox[112 + ((x >> 28)] << 28; -- Г.А. From Lonely.RuyK на mail.ru Sun Mar 20 13:58:10 2011 From: Lonely.RuyK на mail.ru (LonelyRuyK) Date: Sun, 20 Mar 2011 12:58:10 +0300 Subject: [P&AM Lab] =?utf-8?b?0J/QvtGB0YLQsNC90L7QstC60LAg0LfQsNC00LDRh9C4?= =?utf-8?b?INC/0L4gS01M?= In-Reply-To: <4D74A26D.4050903@komitex.ru> References: <4D749C15.8050405@komitex.ru> <4D74A26D.4050903@komitex.ru> Message-ID: <201103201258.10887.Lonely.RuyK@mail.ru> Закомиттил пробную версию k_mul.c, добавил тесты( к сожалению для довольно небольших чисел умножение по Карацубе пока работает "до десяти раз дольше"). Буду придумывать варианты оптимизации:) From Lonely.RuyK на mail.ru Thu Mar 24 22:48:56 2011 From: Lonely.RuyK на mail.ru (LonelyRuyK) Date: Thu, 24 Mar 2011 21:48:56 +0300 Subject: [P&AM Lab] GOST 28147-89 Message-ID: <201103242148.56459.Lonely.RuyK@mail.ru> Реализовал гост-89, посылаю пробную версию. Преподаватель, которому нужно сдавать программку с ГОСТом намекнул что неплохо бы приделать к ней графический интерфейс. Посоветуйте пожалуйста чем лучше пользоваться для его создания. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: gost.c Type: text/x-csrc Size: 4966 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Thu Mar 24 23:11:16 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 24 Mar 2011 22:11:16 +0300 Subject: [P&AM Lab] GOST 28147-89 In-Reply-To: <201103242148.56459.Lonely.RuyK@mail.ru> References: <201103242148.56459.Lonely.RuyK@mail.ru> Message-ID: <4D8B9754.5070100@komitex.ru> Может быть это и работает. Но это придётся выбраковывать. Комментарии до субботы подождут? Интерфейс вторичен, приходил из вашей группы один парень, я ему подробно объяснял почему так а не иначе, но в следующую субботу он не пришёл, не объявился в списке и никаких от него сигналов нет. Вы не понимаете пока и вам никто не объяснил что политика должна быть отделена от механизма. Сейчас здесь всё в одной куче, код практически не возможно использовать в приложениях, кроме того шифровать файлы таким алгоритмом нельзя потому что он у вас желает на вход получать блок из 64 бит а файл может быть и не кратен этому размеру. Сейчас там просто подставляются пробелы, чего делать категорически нельзя. Много недочётов к сожалению в использовании системных вызовов. Видимо придётся к этой теме повторно вернуться в субботу. Для шифрования данных любого размера (в битах), когда он не кратен размеру блока, определена процедура гаммирования. Вырабатывается гамма, она пропускается через блочное шифрование а затем биты шифруемых данных складываются с ней по модулю 2 (исключающее ИЛИ). Если просто вставлять туда нули или пробелы то задача криптоаналитика по подбору ключей существенно упрощается если у него есть доступ к открытому и закрытому сообщениям. Очень много замечаний, на мой взгляд делать интерфейсы пока рано. И вообще у вас задача реализовать алгоритм и сделать это хорошо, а не создавать "коробочные" продукты с целью кому-то впарить. Я понимаю что на людей с низким уровнем технической культуры использования вычислительной техники утилиты без GUI не производят впечатления, так вы и не фирма Apple чтобы завлекать потребителей и повышать продажи. Предлагаю в субботу сделать постановку задачи по ГОСТ 28147-89. Отвечая на вопрос по интерфейсу -- таких средств масса, существует несколько популярных библиотек, в частности GTK+, Qt, wxWidgets, FLTK, OpenMotif и т.д. Для первых двух есть неплохие конструкторы интерфейсов и возможно быстрое прототипирование через привязки к скриптовым языкам в т.ч. -- Г.А. 24.03.2011 21:48, LonelyRuyK пишет: > Реализовал гост-89, посылаю пробную версию. > Преподаватель, которому нужно сдавать программку с ГОСТом намекнул что неплохо > бы приделать к ней графический интерфейс. Посоветуйте пожалуйста чем лучше > пользоваться для его создания. From sitkarev на komitex.ru Sun Mar 27 20:26:58 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sun, 27 Mar 2011 20:26:58 +0400 Subject: [P&AM Lab] libgost subversion Message-ID: <4D8F6552.9030209@komitex.ru> Приветствую всех. Миша сегодня сделал нам ветку на репозитории и я положил туда код который вчера показывал. Есть косметические изменения в утилите gostcat: o добавлен вывод подсказки по ключу -h; o изменён метод передачи синхропосылки с командной строки. ------------8<--------------------------------------------------------- $ ./gostcat -h Usage: gostcat [OPTIONS] [FILE] Writes file transformed by GOST 28147-89 to standard output. Options: -b substitution box file -k secret key file -s inital gamma synchronisation sequence (hex) -o output file If no FILE provided or it is a -, then reads standard input. Examples: gostcat -k key.bin -s 0x01020304,0xdeadbeaf /etc/passwd > passwd.encr ----------->8---------------------------------------------------------- В примере всё видно, так что можете экспериментировать. Не забудьте что динамический линковщик ищет библиотеки по умолчанию в /lib и /usr/lib. Если вы соберёте libgost, то разделяемая библиотека libgost.so.1 лежит прямо в каталоге сборки. Нужно добавить этот путь в переменную окружения LD_LIBRARY_PATH. $ export LD_LIBRARY_PATH=".:$LD_LIBRARY_PATH" Ключ секретный я генерировал через /dev/urandom и утилитой dd(1) вычитывал из него столько байт сколько было нужно. $ dd if=/dev/urandom of=key.bin count=1 bs=32 Пример использования библиотеки попроще есть в test.c, если кто-то забыл. Вроде бы всё что хотел написать. Если будет желание что-то довести до ума, Миша сделает доступ к репозиторию на запись. Кто хочет стащить ветку, запускает svn(1): $ svn checkout http://wiki.syktsu.ru/svn/libgost Нужно подумать чего здесь ещё не хватает. Кто-то должен взяться сделать выработку имитовставки и гаммирование с обратной связью. -- Г.А.