Moderator: haqreu
Mac Buster
Retired
Posts: 1474 Joined: 03 Aug 2003 22:37
Location: Moscow
Post
by Mac Buster » 16 Nov 2005 01:08
Давайте думать о быстрых алгоритмах умножения и деления уравновешенного троичного числа на степень двойки. Мне стало известно, что такой алгоритм уже разработан в штатах и это меня как-то настораживает
Если про умножение есть кое-какие идеи, то вот оносительно деления ничего в голову не приходит.
Extreme Entertainment
Mac Buster
Retired
Posts: 1474 Joined: 03 Aug 2003 22:37
Location: Moscow
Post
by Mac Buster » 19 Dec 2005 13:55
Неужели ни кто ничего не может предложить ?
Extreme Entertainment
Shaos
Admin
Posts: 24008 Joined: 08 Jan 2003 23:22
Location: Silicon Valley
Post
by Shaos » 20 Dec 2005 19:21
Mac Buster wrote: Неужели ни кто ничего не может предложить ?
Обозначим троичные сдвиги так:
>>> троичный сдвиг вправо (равносильно делению на 3)
<<< троичный сдвиг влево (равносильно умножению на 3)
Тогда можно записать:
2*T = 3*T-T = (T<<<1)-T
4*T = 3*T+T = (T<<<1)+T
10*T = 9*T+T = (T<<<2)+T
А вот с делением такие фокусы уже не пройдут
Я тут за главного - если что шлите мыло на me собака shaos точка net
Mac Buster
Retired
Posts: 1474 Joined: 03 Aug 2003 22:37
Location: Moscow
Post
by Mac Buster » 20 Dec 2005 23:46
Shaos wrote: Тогда можно записать:
2*T = 3*T-T = (T<<<1)-T
4*T = 3*T+T = (T<<<1)+T
10*T = 9*T+T = (T<<<2)+T
Да, примерно об этом я писал выше.
А вот с делением такие фокусы уже не пройдут
Универсального решения я пока не нашёл, а выделение частных случаев занимает слишком много времени
Extreme Entertainment
Alexandr
Novelist
Posts: 34 Joined: 20 Oct 2005 18:46
Post
by Alexandr » 22 Dec 2005 05:40
Shaos wrote: А вот с делением такие фокусы уже не пройдут
Деление немного можно ускорить если, выполнять сдвиг делимого и делителя на количество нулевых младших разрядов делителя, а потом выполнять деление полученного делимого на полученный делитель
Shaos
Admin
Posts: 24008 Joined: 08 Jan 2003 23:22
Location: Silicon Valley
Post
by Shaos » 29 May 2020 19:50
Автор Тунгуски
в 2009 году предложил делить на 2 путём умножения на число .PPPPPP... (что есть 0.5):
Code: Select all
A B C D / 2
-----------
A B C . D
A B . C D
+ A . B C D
-----------------
[0, A, A+B, A+B+C].[B + C + D, C+D, D]
Я тут за главного - если что шлите мыло на me собака shaos точка net