реклама на сайте
подробности

 
 
> Одним делением вычислить два, можно ли?
alexPec
сообщение May 19 2011, 16:30
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



Добрый день. Возникла задача, под которую у меня мозг не заточен, если не ошибаюсь, из математики конечных полей.
Господа математики, подскажите, можно ли вычислить одним делением X и Y:

X=(a mod k1) mod k2
Y = (a mod k1)/k2

k1, k2 - константы, 16 бит.
а- переменная, 32 бит.

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

Спасибо!

Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 24)
Сергей Борщ
сообщение May 19 2011, 22:04
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Или я чего-то не понимаю, или X и Y - это остаток и частное от деления a mod k1 на k2, т.е. получаются одновременно в процессе деления на k2.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Xenia
сообщение May 19 2011, 23:18
Сообщение #3


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(alexPec @ May 19 2011, 20:30) *
Добрый день. Возникла задача, под которую у меня мозг не заточен, если не ошибаюсь, из математики конечных полей.
Господа математики, подскажите, можно ли вычислить одним делением X и Y:

X=(a mod k1) mod k2
Y = (a mod k1)/k2


Есть функция:
div_t div(int numer, int denom);
возвращающая структру:
typedef struct {
int quot;
int rem;
} div_t;

или функция
ldiv_t div (long numerator, long denominator);
возвращающая структру:
typedef struct {
long quot;
long rem;
} ldiv_t;

В возвращаемой структуре лежат сразу частное (quot) и остаток (rem).
Обе функции описаны в stdlib.h

http://www.cplusplus.com/reference/clibrary/cstdlib/div/
Go to the top of the page
 
+Quote Post
Волощенко
сообщение May 20 2011, 05:16
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 347
Регистрация: 16-02-06
Из: г.Николаев, Украина
Пользователь №: 14 377



Цитата(alexPec @ May 19 2011, 19:30) *
Нужна аппаратная реализация этого, если в лоб - два делителя подряд - задержка большая, скорость снижается, да и ресурсов делитель немало ест.
Нужна реализация с одним делителем + умножители и сумматоры/вычитатели если нужно.

Делимое/делитель дают частное и остаток от деления. Возможно, Вам нужны и частное, и остаток вместе....
Аппаратная реализация для этого - это матрица элементов, например в а.с. 1462297 G 06 F 7/52 от 05.08.87 Матричное устройство для деления (деление в доп.кодах).
Подробней смотрите в http://electronix.ru/forum/index.php?showtopic=46469&hl=
Еще книга М.А.Карцев, В.А.Брик "Вычислительные системы и синхронная арифметика", 1981г.... см.рис.5.1.2, 5.4.1.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Visk
сообщение May 20 2011, 09:02
Сообщение #5





Группа: Участник
Сообщений: 8
Регистрация: 9-04-10
Из: Россия, Ижевск
Пользователь №: 56 527



Цитата(Волощенко @ May 20 2011, 09:16) *
Делимое/делитель дают частное и остаток от деления. Возможно, Вам нужны и частное, и остаток вместе....
Аппаратная реализация для этого - это матрица элементов, например в а.с. 1462297 G 06 F 7/52 от 05.08.87 Матричное устройство для деления (деление в доп.кодах).
Подробней смотрите в http://electronix.ru/forum/index.php?showtopic=46469&hl=
Еще книга М.А.Карцев, В.А.Брик "Вычислительные системы и синхронная арифметика", 1981г.... см.рис.5.1.2, 5.4.1.


Спасибо за ответы!
Я alexpec, только пишу с другого компа...

Поясню подробней x и y - да, остаток и частное от деления. Использую алтеровскую мегафункцию деления, она дает одновременно частное и остаток от деления. Но проблема в том, что сначала первым делителем надо найти a mod k1, а вторым уже x и y ( функция вычисляет частное и остаток одновременно). Так вот как-то может преобразовать выражение чтоб операция деления и (или) остатка от деления была одна, предпочтительнее вместо второй операции деления использовать несколько (может быть) умножений и сложений/вычитаний. Т.е вторая операция деления - это уже край.
Go to the top of the page
 
+Quote Post
alexPec
сообщение May 20 2011, 15:38
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



Напишу то же самое от себя...

Поясню подробней x и y - да, остаток и частное от деления. Использую алтеровскую мегафункцию деления, она дает одновременно частное и остаток от деления. Но проблема в том, что сначала первым делителем надо найти a mod k1, а вторым уже x и y ( функция вычисляет частное и остаток одновременно). Так вот как-то может преобразовать выражение чтоб операция деления и (или) остатка от деления была одна, предпочтительнее вместо второй операции деления использовать несколько (может быть) умножений и сложений/вычитаний. Т.е вторая операция деления - это уже край.
Go to the top of the page
 
+Quote Post
i-mir
сообщение May 23 2011, 19:44
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 197
Регистрация: 17-06-10
Из: Киев
Пользователь №: 57 986



Не совсем понятно что у вас за проблема. Не укладываетесь в максимальное время цикла?
И эти два деления являются самыми проблемными из всей цепочки?

Тогда:
1. Напишите свою простенькую процедуру деления одновременно двух делимых - задача тривиальная
2. Или в начале умножьте k1*k2, а потом делите штатной функцией - получите два искомых значения

Но честно - я бы просмотрел все остальное и попробовал оптимизировать там. Не верится что
ресурсы кристалла уже вами использованы на 95% и все уперлось здесь. Посмотрите тайм-ауты
и другие цепочки использующие время. Если критичным осталось именно деление, то
это вершина оптимального кодирования под заданный кристалл.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 24 2011, 06:42
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(i-mir @ May 23 2011, 22:44) *
Не совсем понятно что у вас за проблема.
...
1. Напишите свою простенькую процедуру деления одновременно двух делимых - задача тривиальная
2. Или в начале умножьте k1*k2, а потом делите штатной функцией - получите два искомых значения

Я понял так, что нужно вычислить последовательно два остатка от деления.
Например, для k1 = 10 и k2 = 3:
15 mod 10 = 5; 5 mod 3 = 2.
Автор хочет сразу из 15 получить 2. Я не вижу решения за одну операцию.

P.S. Может быть, поделить на сумму даст нужный результат? 15 mod 13 = 2. Верна ли такая математика?
P.P.S. Поправляю - нет, не верна... и это очевидно (взять по модулю 13 - может дать результат от 0 до 12).
Go to the top of the page
 
+Quote Post
i-mir
сообщение May 24 2011, 13:54
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 197
Регистрация: 17-06-10
Из: Киев
Пользователь №: 57 986



Вопрос как обычно звучит так - чего хочет топикстартер? sm.gif
Цитата
Поясню подробней x и y - остаток и частное от деления.


Я понял исходные данные вот так:
X=(a mod k1) mod k2 - частное от деления а на k1*k2
Y = (a mod k1) div k2 - остаток от деления а на k1*k2

Но судя по тому что автор дал взаимоисключающие толкования
переменных x и y- то вопрос остается открытым
Go to the top of the page
 
+Quote Post
scifi
сообщение May 24 2011, 14:20
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(i-mir @ May 24 2011, 17:54) *
Я понял исходные данные вот так:
X=(a mod k1) mod k2 - частное от деления а на k1*k2
Y = (a mod k1) div k2 - остаток от деления а на k1*k2

Удивительно толкование. И совсем неверное.
Вполне очевидно, что "mod" означает остаток от деления. Как оператор % в языке Си.
Что касается самого вопроса, то мне с моим ограниченным опытом (когда-то прослушал курс лекций по криптографии) кажется, что в общем случае эти операции не упрощаются.
Go to the top of the page
 
+Quote Post
alexPec
сообщение May 24 2011, 18:12
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



Цитата(scifi @ May 24 2011, 18:20) *
Удивительно толкование. И совсем неверное.
Вполне очевидно, что "mod" означает остаток от деления. Как оператор % в языке Си.

Совершенно верно, mod - остаток от деления это где-то выше уже писал.

Цитата
Я понял исходные данные вот так:
X=(a mod k1) mod k2 - частное от деления а на k1*k2
Y = (a mod k1) div k2 - остаток от деления а на k1*k2

Но судя по тому что автор дал взаимоисключающие толкования
переменных x и y- то вопрос остается открытым


Что тут взаимоисключающего? Во-первых div - это частное, а mod - остаток, а не наоборот, а во-вторых, как правильно заметил Scifi,
(a mod k1) mod k2 совершенно не обязательно равно a mod (k1*k2)
Go to the top of the page
 
+Quote Post
des00
сообщение May 25 2011, 04:25
Сообщение #12


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



никак, делайте два деления на одном блоке %)


--------------------
Go to the top of the page
 
+Quote Post
i-mir
сообщение May 25 2011, 07:21
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 197
Регистрация: 17-06-10
Из: Киев
Пользователь №: 57 986



Цитата
Удивительно толкование. И совсем неверное.

Совершенно верно, и только благодаря этому, я вынудил
топикстартера самому ответить на свой вопрос - нельзя одним
длением получить искомые три переменные
(по крайней мере в рамках кристалла).


Go to the top of the page
 
+Quote Post
Diusha
сообщение May 25 2011, 11:19
Сообщение #14


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



1. Вот крутится такая мысля…
От деления a на k1 нужен только остаток. Значит прибавив к а любое целое число, умноженное на k1, мы ничего не изменим.
Допустим, при делении a на k1 мы получаем частное t и остаток r

a=k1*t+r

Во втором делении r делим на k2 и получаем Y и X.

a=k1*t+k2*Y+X

Возьмем в качестве «любого целого числа» Y–t

b = a+k1*(Y–t) = (k1+k2)*Y+X

Такое b можно подставить в Ваши формулы вместо а, и результат будет тот же.
Но самое интересное, что деление b на (k1+k2) даст сразу вожделенные X и Y… казалось бы. Но беда в том, что t мы не знаем. Мысля до конца не доведена, но я дал посыл, может быть кто-нибудь доведет.

2. Если k1 и k2 – константы, то вообще возможно обойтись без единого деления. Для простоты рассмотрю на примере деления 2-разрядных десятичных чисел. Пусть надо разделить 37 на 13.
37/13 = 37*100/13/100.
Берем число 100 div 13 =7 (константа). Вместо деления 37 (переменная) умножаем на 7 (константа). Получаем 259. Два младших разряда (добавленных выше) выкидываем и получаем частное =2.
Остаток находим как 37–13*2

Сообщение отредактировал Diusha - May 25 2011, 11:27
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 26 2011, 06:46
Сообщение #15


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Если k1 не очень большое число (а k2 должно быть еще меньше, естественно), то второе деление можно заменить поиском по таблице, общим размером k1:
[0, 1, 2... k2-1], [0, 1, 2... k2-1], [0, 1, 2... k2-1], ...0, 1, ... (на каком-то числе закончится)
Тогда сначала нужно поделить на k1 и найти остаток, а потом по таблице по этому остатку-индексу найти остаток от деления на k2.
Go to the top of the page
 
+Quote Post
alexPec
сообщение May 26 2011, 19:20
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



Цитата(ViKo @ May 26 2011, 10:46) *
Если k1 не очень большое число (а k2 должно быть еще меньше, естественно), то второе деление можно заменить поиском по таблице, общим размером k1:
[0, 1, 2... k2-1], [0, 1, 2... k2-1], [0, 1, 2... k2-1], ...0, 1, ... (на каком-то числе закончится)
Тогда сначала нужно поделить на k1 и найти остаток, а потом по таблице по этому остатку-индексу найти остаток от деления на k2.

Не, таблица не вариант, памяти в обрез sad.gif
Go to the top of the page
 
+Quote Post
Diusha
сообщение May 27 2011, 15:57
Сообщение #17


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



Цитата(alexPec @ May 26 2011, 22:20) *
Не, таблица не вариант, памяти в обрез sad.gif

Так а чем умножение на константу вместо деления на константу не устраивает?
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 27 2011, 19:45
Сообщение #18


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Diusha @ May 27 2011, 18:57) *
Так а чем умножение на константу вместо деления на константу не устраивает?

Видимо, тем, что придется умножить на 1/k, затем из результата вычесть целую часть, оставить дробную, затем дробную умножить на k. Так получится остаток от деления на k. sm.gif
P.S. Возможно, смайлик я поставил зря.
Go to the top of the page
 
+Quote Post
Diusha
сообщение May 28 2011, 04:11
Сообщение #19


Вечный студент
****

Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262



Цитата(ViKo @ May 27 2011, 22:45) *
Видимо, тем, что придется умножить на 1/k, затем из результата вычесть целую часть, оставить дробную, затем дробную умножить на k. Так получится остаток от деления на k.

Ну да, примерно так, но не совсем.
Умножить на (65536 div k) (целая константа), выкинуть (просто игнорировать) 2 мл. байта – и частное готово. Для получения остатка нужно еще одно умножение и одно вычитание. И соответственно вместо второго деления тоже 2 умножения и одно вычитание. Все в целых числах.
По-моему, этим должно не не_устраивать, а как раз устраивать sm.gif , ибо

Цитата(alexPec @ May 19 2011, 19:30) *
Нужна реализация с одним делителем + умножители и сумматоры/вычитатели если нужно.

Цитата(alexPec @ May 20 2011, 18:38) *
чтоб операция деления и (или) остатка от деления была одна, предпочтительнее вместо второй операции деления использовать несколько (может быть) умножений и сложений/вычитаний. Т.е вторая операция деления - это уже край.

Конечно, из слов автора буквоед может сделать вывод, что непременно должно быть одно и только одно деление, но мы же не такие wink.gif
Хотя и в этом случае – пожалуйста: одно деление «честное», а вместо второго – как я сказал

Сообщение отредактировал Diusha - May 28 2011, 04:18
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 28 2011, 07:16
Сообщение #20


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Diusha @ May 28 2011, 07:11) *
... но мы же не такие wink.gif

Мы не такие rolleyes.gif
Как не-буквоеды мы можем сказать - что-то нечисто в самой постановке задачи. Оно точно такое надо?
Go to the top of the page
 
+Quote Post
alexPec
сообщение May 28 2011, 09:16
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



Цитата(ViKo @ May 28 2011, 11:16) *
Мы не такие rolleyes.gif
Как не-буквоеды мы можем сказать - что-то нечисто в самой постановке задачи. Оно точно такое надо?

Спасибо за ответы, попробую.
Да, и оно точно так надо.
Go to the top of the page
 
+Quote Post
i-mir
сообщение May 30 2011, 19:00
Сообщение #22


Частый гость
**

Группа: Свой
Сообщений: 197
Регистрация: 17-06-10
Из: Киев
Пользователь №: 57 986



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

Когда в свое время было мало ПЗУ и еще меньше ОЗУ на
борту 8-ми битного железа, то все делали на целочисленной
арифметике подогнанной под границы 2^n ... заменяли
все что можно сдвигами - и получали неплохие результаты.

Будьте корректны с коллегами, поделитесь спецификацией
на часть данного приложения. ради спорта, ибо ради другого
просто не интересно.




Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 2 2011, 08:16
Сообщение #23


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(ViKo @ May 27 2011, 23:45) *
Видимо, тем, что придется умножить на 1/k, затем из результата вычесть целую часть, оставить дробную, затем дробную умножить на k. Так получится остаток от деления на k. sm.gif
А если повезет с числами k1 и k2, то и этого не нужно будет sm.gif
ТС, так какие там у Вас числа k1 и k2 ?

Go to the top of the page
 
+Quote Post
alexPec
сообщение Jun 2 2011, 20:47
Сообщение #24


Профессионал
*****

Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968



Цитата(singlskv @ Jun 2 2011, 12:16) *
А если повезет с числами k1 и k2, то и этого не нужно будет sm.gif
ТС, так какие там у Вас числа k1 и k2 ?

k2 = {2,4,6}
k1 - 27 значений может принимать, ну вот некоторые: 4024, 4650, 4482, 3776, 2832.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Jun 2 2011, 21:55
Сообщение #25


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(alexPec @ Jun 3 2011, 00:47) *
k2 = {2,4,6}
k1 - 27 значений может принимать, ну вот некоторые: 4024, 4650, 4482, 3776, 2832.

ну тогда первое получение (а mod k1) таки честное деление
ну а деление на {2,4,6} с остатком это жеж совсем просто,
для 2 и 4 все совсем очевидно,
для 6 решается ну совсем простым домножением
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th September 2025 - 16:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01677 секунд с 7
ELECTRONIX ©2004-2016