|
Одним делением вычислить два, можно ли? |
|
|
|
May 19 2011, 16:30
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Добрый день. Возникла задача, под которую у меня мозг не заточен, если не ошибаюсь, из математики конечных полей. Господа математики, подскажите, можно ли вычислить одним делением X и Y:
X=(a mod k1) mod k2 Y = (a mod k1)/k2
k1, k2 - константы, 16 бит. а- переменная, 32 бит.
Нужна аппаратная реализация этого, если в лоб - два делителя подряд - задержка большая, скорость снижается, да и ресурсов делитель немало ест. Нужна реализация с одним делителем + умножители и сумматоры/вычитатели если нужно.
Спасибо!
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 24)
|
May 19 2011, 23:18
|

Гуру
     
Группа: Модератор 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/
|
|
|
|
|
May 20 2011, 05:16
|
Местный
  
Группа: Свой
Сообщений: 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.
Эскизы прикрепленных изображений
|
|
|
|
|
May 20 2011, 09:02
|
Группа: Участник
Сообщений: 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 ( функция вычисляет частное и остаток одновременно). Так вот как-то может преобразовать выражение чтоб операция деления и (или) остатка от деления была одна, предпочтительнее вместо второй операции деления использовать несколько (может быть) умножений и сложений/вычитаний. Т.е вторая операция деления - это уже край.
|
|
|
|
|
May 24 2011, 06:42
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 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).
|
|
|
|
|
May 24 2011, 13:54
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 17-06-10
Из: Киев
Пользователь №: 57 986

|
Вопрос как обычно звучит так - чего хочет топикстартер?  Цитата Поясню подробней x и y - остаток и частное от деления. Я понял исходные данные вот так: X=(a mod k1) mod k2 - частное от деления а на k1*k2 Y = (a mod k1) div k2 - остаток от деления а на k1*k2 Но судя по тому что автор дал взаимоисключающие толкования переменных x и y- то вопрос остается открытым
|
|
|
|
|
May 24 2011, 18:12
|
Профессионал
    
Группа: Свой
Сообщений: 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)
|
|
|
|
|
May 25 2011, 07:21
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 17-06-10
Из: Киев
Пользователь №: 57 986

|
Цитата Удивительно толкование. И совсем неверное. Совершенно верно, и только благодаря этому, я вынудил топикстартера самому ответить на свой вопрос - нельзя одним длением получить искомые три переменные (по крайней мере в рамках кристалла).
|
|
|
|
|
May 25 2011, 11:19
|
Вечный студент
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
May 26 2011, 06:46
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 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.
|
|
|
|
|
May 26 2011, 19:20
|
Профессионал
    
Группа: Свой
Сообщений: 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. Не, таблица не вариант, памяти в обрез
|
|
|
|
|
May 28 2011, 04:11
|
Вечный студент
   
Группа: Участник
Сообщений: 500
Регистрация: 11-09-06
Из: Питер
Пользователь №: 20 262

|
Цитата(ViKo @ May 27 2011, 22:45)  Видимо, тем, что придется умножить на 1/k, затем из результата вычесть целую часть, оставить дробную, затем дробную умножить на k. Так получится остаток от деления на k. Ну да, примерно так, но не совсем. Умножить на (65536 div k) (целая константа), выкинуть (просто игнорировать) 2 мл. байта – и частное готово. Для получения остатка нужно еще одно умножение и одно вычитание. И соответственно вместо второго деления тоже 2 умножения и одно вычитание. Все в целых числах. По-моему, этим должно не не_устраивать, а как раз устраивать  , ибо Цитата(alexPec @ May 19 2011, 19:30)  Нужна реализация с одним делителем + умножители и сумматоры/вычитатели если нужно. Цитата(alexPec @ May 20 2011, 18:38)  чтоб операция деления и (или) остатка от деления была одна, предпочтительнее вместо второй операции деления использовать несколько (может быть) умножений и сложений/вычитаний. Т.е вторая операция деления - это уже край. Конечно, из слов автора буквоед может сделать вывод, что непременно должно быть одно и только одно деление, но мы же не такие  Хотя и в этом случае – пожалуйста: одно деление «честное», а вместо второго – как я сказал
Сообщение отредактировал Diusha - May 28 2011, 04:18
|
|
|
|
|
Jun 2 2011, 20:47
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Цитата(singlskv @ Jun 2 2011, 12:16)  А если повезет с числами k1 и k2, то и этого не нужно будет  ТС, так какие там у Вас числа k1 и k2 ? k2 = {2,4,6} k1 - 27 значений может принимать, ну вот некоторые: 4024, 4650, 4482, 3776, 2832.
|
|
|
|
|
Jun 2 2011, 21:55
|
дятел
    
Группа: Свой
Сообщений: 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 решается ну совсем простым домножением
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|