nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 18 Jan 2019 18:11



Reply to topic  [ 71 posts ]  Go to page Previous  1, 2, 3, 4, 5  Next
Определение чётности числа в уравновешенной троичной системе 
Author Message
Doomed
User avatar

Joined: 21 Mar 2017 13:50
Posts: 384
Location: Spb
Reply with quote
-167. Нечетное. вроде работает.


Attachments:
чётность2.png
чётность2.png [ 12.71 KiB | Viewed 136 times ]
13 Jan 2019 13:46
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17308
Location: Colorado
Reply with quote
Shaos wrote:
Ну началось всё как раз с чётности как признака делимости на 2 без остатка :)

Кстати если для определения чётности в троичной системе речь идёт о подсчёте ненулевых разрядов, то оно как бы само собой сливается с понятием "parity"

Тогда оно наверное таки надо - загоню задачку в DDT, посмотрим что оно нагородит ;)

Задаём вот такой входной DDT файл - par3.ddt:
Code:
NNN=N
NNO=P
NNP=N
NON=P
NOO=N
NOP=P
NPN=N
NPO=P
NPP=N
ONN=P
ONO=N
ONP=P
OON=N
OOO=O
OOP=N
OPN=P
OPO=N
OPP=P
PNN=N
PNO=P
PNP=N
PON=P
POO=N
POP=P
PPN=N
PPO=P
PPP=N

N - нечётное
O - ноль
P - чётное

Далее пускаем ddtc par3.ddt и получаем на выходе ddt_par3.c:
Code:
 
/* Generated by DDTc v0.5
   Solution is 6 x DG403
   See www.ternary.info */

#include "ddt.h"

int ddt_par3(int f, DDT i1, DDT i2, DDT i3, DDT* o1)
{
 DDT r1,r2,r3,r4,r5,r6;
 int f1,f2,f3,f4,f5,f6;
 f1 = ddt_mux(f,i1,N,P,N,&r1);
 if(f1 < 0) return f1;
 f2 = ddt_mux(f,i1,P,N,P,&r2);
 if(f2 < 0) return f2;
 f3 = ddt_mux(f,i1,N,O,N,&r3);
 if(f3 < 0) return f3;
 f4 = ddt_mux(f,i2,r1,r2,r1,&r4);
 if(f4 < 0) return f4;
 f5 = ddt_mux(f,i2,r2,r3,r2,&r5);
 if(f5 < 0) return f5;
 f6 = ddt_mux(f,i3,r4,r5,r4,&r6);
 if(f6 < 0) return f6;
 if(o1) *o1 = r6;
 return f1+f2+f3+f4+f5+f6;
}


Если считать, что OOO это всё-таки чётное число (P вместо O), то решение сокращается до 5 мультиплексоров:
Code:
 
/* Generated by DDTc v0.5
   Solution is 6 x DG403
   See www.ternary.info */

#include "ddt.h"

int ddt_par3(int f, DDT i1, DDT i2, DDT i3, DDT* o1)
{
 DDT r1,r2,r3,r4,r5;
 int f1,f2,f3,f4,f5;
 f1 = ddt_mux(f,i1,N,P,N,&r1);
 if(f1 < 0) return f1;
 f2 = ddt_mux(f,i1,P,N,P,&r2);
 if(f2 < 0) return f2;
 f3 = ddt_mux(f,i2,r1,r2,r1,&r3);
 if(f3 < 0) return f3;
 f4 = ddt_mux(f,i2,r2,r1,r2,&r4);
 if(f4 < 0) return f4;
 f5 = ddt_mux(f,i3,r3,r4,r3,&r5);
 if(f5 < 0) return f5;
 if(o1) *o1 = r5;
 return f1+f2+f3+f4+f5;
}

_________________
:eugeek: https://twitter.com/Shaos1973


13 Jan 2019 13:53
Profile WWW
Doomed
User avatar

Joined: 21 Mar 2017 13:50
Posts: 384
Location: Spb
Reply with quote
Я вот больше по графике понимаю. А эти колонки цифр и буков в головушке моей не укладываются.
З.Ы. У меня тоже 5 получается для трёх разрядов.


13 Jan 2019 14:02
Profile
Doomed
User avatar

Joined: 27 Jul 2018 13:07
Posts: 381
Reply with quote
...для определения чётности числа: я бы по-разрядно сложил бы все числа троичного числа и суму сначала поделил бы на 3 если число поделилось на три без остатка затем поделил бы на 2 - если есть остаток то число нечётное, если же сума от деления на три имеет остаток то число есть нечётное и проверять делением на два ненужно.


13 Jan 2019 14:04
Profile
Doomed
User avatar

Joined: 21 Mar 2017 13:50
Posts: 384
Location: Spb
Reply with quote
TernarySystem wrote:
я бы по-разрядно сложил

Сложение на аппаратном уровне выглядит сложнее. Как минимум три мультиплексора на разряд.


13 Jan 2019 14:45
Profile
Doomed
User avatar

Joined: 27 Jul 2018 13:07
Posts: 381
Reply with quote
AlexanderZh wrote:
TernarySystem wrote:
я бы по-разрядно сложил

Сложение на аппаратном уровне выглядит сложнее. Как минимум три мультиплексора на разряд.


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


13 Jan 2019 14:52
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17308
Location: Colorado
Reply with quote
TernarySystem wrote:
AlexanderZh wrote:
TernarySystem wrote:
я бы по-разрядно сложил

Сложение на аппаратном уровне выглядит сложнее. Как минимум три мультиплексора на разряд.


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

Логисторы? :o

_________________
:eugeek: https://twitter.com/Shaos1973


13 Jan 2019 15:09
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17308
Location: Colorado
Reply with quote
AlexanderZh wrote:
Я вот больше по графике понимаю. А эти колонки цифр и буков в головушке моей не укладываются.
З.Ы. У меня тоже 5 получается для трёх разрядов.

вот так с нулём получается:

Attachment:
Parity3.png
Parity3.png [ 3.27 KiB | Viewed 113 times ]


это я в логисиме вручную перерисовал чего DDT нагенерил - надо уже доделать ddtv, которая будет визуализировать троичные схемы на мультиплексорах

P.S. без нуля (ноль - чётное) выкидывается мультиплексор r3, мультиплексоры r4,r5 и r6 переименовываются в r3,r4 и r5, а средний вход нового r4 (старого r3) цепляется к выходу r1

_________________
:eugeek: https://twitter.com/Shaos1973


13 Jan 2019 15:22
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17308
Location: Colorado
Reply with quote
4-тритный вариант с нулём занял 9 мультиплексоров (без нуля было 7):
Code:
/* Generated by DDTc v0.5
   Solution is 10 x DG403
   See www.ternary.info */

#include "ddt.h"

int ddt_par4(int f, DDT i1, DDT i2, DDT i3, DDT i4, DDT* o1)
{
 DDT r1,r2,r3,r4,r5,r6,r7,r8,r9;
 int f1,f2,f3,f4,f5,f6,f7,f8,f9;
 f1 = ddt_mux(f,i1,P,N,P,&r1);
 if(f1 < 0) return f1;
 f2 = ddt_mux(f,i1,N,P,N,&r2);
 if(f2 < 0) return f2;
 f3 = ddt_mux(f,i1,N,O,N,&r3);
 if(f3 < 0) return f3;
 f4 = ddt_mux(f,i2,r1,r2,r1,&r4);
 if(f4 < 0) return f4;
 f5 = ddt_mux(f,i2,r2,r1,r2,&r5);
 if(f5 < 0) return f5;
 f6 = ddt_mux(f,i2,r1,r3,r1,&r6);
 if(f6 < 0) return f6;
 f7 = ddt_mux(f,i3,r4,r5,r4,&r7);
 if(f7 < 0) return f7;
 f8 = ddt_mux(f,i3,r5,r6,r5,&r8);
 if(f8 < 0) return f8;
 f9 = ddt_mux(f,i4,r7,r8,r7,&r9);
 if(f9 < 0) return f9;
 if(o1) *o1 = r9;
 return f1+f2+f3+f4+f5+f6+f7+f8+f9;
}


Attachments:
Parity4.png
Parity4.png [ 4.17 KiB | Viewed 110 times ]

_________________
:eugeek: https://twitter.com/Shaos1973
13 Jan 2019 16:35
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17308
Location: Colorado
Reply with quote
Тут видно, что все мультиплексоры используются в режиме XYX, что в нашем случае не имеет упрощённой реализации как например XYY и XXY (это E12 и E21 каждый из которых занимает только половину одной микросхемы DG403). По идее можно повернуть все входы унарной операцией OPN (это 4 мультиплексора в случае 4 входов) и потом всё оставшееся заменить на E12 - тогда это потребует 4*E12 + 4*E21 + 9*E12 = 13*E12 + 4*E21 или 2 микросхемы DG403 в режиме E21 и 7 микросхем DG403 в режиме E12 (всего 9). Если попробовать сбалансировать, то половину входов можно повернуть в одну сторону (скажем первый и третий) через OPN, а вторую половину (скажем второй и четвёртый) в другую через PNO - тогда кроме 4 муксов на входах (что есть 4 микросхемы DG403) муксы r1,r2,r3,r7,r8 выродятся в E12, а муксы r4,r5,r6 и r9 - в E21, т.е. это ещё 4 микросхемы DG403 плюс одна половинка в режиме E12 - т.е. опять таки 9 микросхем DG403. Надо посмотреть больше входов - может там будет выгода...

_________________
:eugeek: https://twitter.com/Shaos1973


13 Jan 2019 16:56
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Кстати если для определения чётности в троичной системе речь идёт о подсчёте ненулевых разрядов, то оно как бы само собой сливается с понятием "parity"

Я вот подумал, а что, если наоборот - подсчитывать нулевые разряды? :wink:

_________________
iLavr


13 Jan 2019 18:32
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17308
Location: Colorado
Reply with quote
Lavr wrote:
Shaos wrote:
Кстати если для определения чётности в троичной системе речь идёт о подсчёте ненулевых разрядов, то оно как бы само собой сливается с понятием "parity"

Я вот подумал, а что, если наоборот - подсчитывать нулевые разряды? :wink:

Логичнее таки считать единички (вместе с минус-единичками) т.к. именно они добавляют нечётности (ибо суммируются степени тройки, которые все нечётные)

_________________
:eugeek: https://twitter.com/Shaos1973


13 Jan 2019 19:05
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17308
Location: Colorado
Reply with quote
AlexanderZh wrote:
-167. Нечетное. вроде работает.

Image

А в чём это собрано и работает? Я вижу там двух-проводная троичность судя по всему (хотя у лампочек - три провода)
У меня в либе для логисима старший бит это минус, а младший - плюс, а тут судя по всему наоборот (красная лампочка это минус, а зелёная - плюс?)

_________________
:eugeek: https://twitter.com/Shaos1973


13 Jan 2019 21:56
Profile WWW
Doomed
User avatar

Joined: 21 Mar 2017 13:50
Posts: 384
Location: Spb
Reply with quote
Зеленая минус, красная плюс. Старший бит является минусом, младший плюсом. Вроде как и должно быть...
А работает это всё в Logisim Fork, там присутствует rgb светодиод, ну и простенькая схемка управления им.
Тритики стоят снизу вверх (от младшего к старшему).


Attachments:
rgb.png
rgb.png [ 7.4 KiB | Viewed 94 times ]
14 Jan 2019 00:45
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17308
Location: Colorado
Reply with quote
Не - должно быть красное - минус, зелёное - плюс, как в биржевых котировках :)
А биты да - аналогично моему варианту

_________________
:eugeek: https://twitter.com/Shaos1973


14 Jan 2019 01:07
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 71 posts ]  Go to page Previous  1, 2, 3, 4, 5  Next

Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.