1、平衡三进制乘法表

        前面写了平衡三进制的加法器,这个乘法器是在这基础上的,没看过的可以回去看看,说到乘法器还是要参考前苏联的资料的,平衡三进制的乘法也是很方便的,在平衡三进制基础中有详细讲过,下图就是资料:

        也就是有(-1/0/1)这三相数互相相乘,结果得到的还是(-1/0/1),所以是很方便的,你认真看这乘法表其实就是逻辑表中的同或门(零乘任何数都为0,然后1*1与T*T结果都为1、最后是T*1或是1*T结果都为T),所以平衡三进制同或门等同于乘法表。


2、平衡三进制2位乘法器

        这平衡三进制的乘法器,与二进制结构差不太多,也就是从低位到高位,依次相乘后相加与我们人类的计算一样,只过用一个用的是二进制,另一个用的是平衡三进制,原理结构图,如下所示:

        用上面的思路,即AB*CD,得AC*100+10*(AD+BC)+BD,这三部分在不同的位置上,同或门完成的是AC相乘的结果,就是1位相乘的结果,它结果就是1trit,所以很有优势,也是只要半加器相加就可以,这样就可以写出,如下代码:

// **加和(TSUM)逻辑表 当为TT、01、10时出1,当为11、0T、T0时出T,其余为0 此门用于半加器的加和位处理 **
const TSUM:[[u8; 3];3]= [[0, 1, 2],[1, 2, 0],[2, 0, 1],
];
// **共识(TCONS)逻辑表 双T出T、双1出1、其余为0 此门用于半加器的进位处理 **
const TCONS:[[u8; 3];3]= [[0, 0, 0],[0, 1, 0],[0, 0, 2],
];
// **调和(TANY)逻辑表 当为TT、0T、T0时出T,当为11、01、10时出1,其余为0 此门用于全加器进位处理 **
const TANY:[[u8; 3];3]= [[0, 1, 2],[1, 1, 0],[2, 0, 2],
];
// **同或门(TXNOR)逻辑表 双T及双1出1、1T及T1出T、其余为0 此门相当于乘法表用于相乘处理 **
pub const TXNOR:[[u8; 3];3]= [[0, 0, 0],[0, 1, 2],[0, 2, 1],
];/// 半加器:返回 (sum, carry)
pub fn ternary_half_adder(a: u8, b: u8) -> (u8, u8) {let sum = TSUM[a as usize][b as usize];// 和let carry=TCONS[a as usize][b as usize];// 进位;(sum, carry)
}
/// 全加器:基于半加器实现
pub fn ternary_full_adder(a: u8, b: u8, c_in: u8) -> (u8, u8) {//2个平衡三进制半加器及1个平衡三进制调和门,组成一个平衡三进制全加器let (num,c1_in)=ternary_half_adder(a,b);let (sum,c2_in)=ternary_half_adder(num,c_in);let carry=TANY[c1_in as usize][c2_in as usize];//两个进位数合成一个进位数;(sum, carry)
}
/// 2位乘法器
pub fn ternary_2trit_mul(a: u8, b: u8, c:u8, d:u8) -> (u8, u8,u8,u8) {//2个平衡三进制同或门及1个平衡三进制调和门,组成一个平衡三进制全加器let ac=TXNOR[a as usize][c as usize];let ad=TXNOR[a as usize][d as usize];let bc=TXNOR[b as usize][c as usize];let bd=TXNOR[b as usize][d as usize];let (num,carry)=ternary_half_adder(ad, bc);let (num2,carry2)=ternary_half_adder(ac, carry);(carry2,num2,num,bd)
}///多位三进制加法器基础,输入两个的三进制向量,返回加法结果向量和最终进位
pub fn ternary_stackadder_base(mut stack1: Vec<u8>,mut stack2: Vec<u8>,carry_in: u8)-> (Vec<u8>, u8){let mut result:Vec<u8> = Vec::new();//存储和let mut c_in:u8=carry_in;//Rust标准库中Vec,天然支持后进先出(LIFO),用栈协同弹出,倒序遍历, 支持不同长度while !stack1.is_empty() || !stack2.is_empty() {let v1 = stack1.pop().unwrap_or(0);let v2 = stack2.pop().unwrap_or(0);let (s_out, next_carry) =ternary_full_adder(v1, v2, c_in);result.push(s_out);//存结果c_in=next_carry;//进位传递}//result.push(c_in);可选,最高位溢出推入result.reverse(); // 反转,从高位到低位排列(result, c_in)
}//多位三进制加法器
pub fn ternary_stack_adder(stack1: Vec<u8>,stack2: Vec<u8>) -> Vec<u8> {let (mut result, carry) = ternary_stackadder_base(stack1,stack2, 0);result.insert(0, carry);result
}fn main() {println!("结果{:?}",ternary_2trit_mul(1, 2, 2, 0));//1T(2)*T0(-3)=0T10(-9+3=-6)println!("结果{:?}",ternary_2trit_mul(2, 2, 1, 2));//TT(-4)*1T(2)=0T01(-9+1=-8)println!("结果{:?}",ternary_2trit_mul(1, 1, 1, 1));//11(4)*11(4)=1TT1(27-9-3+1=16)
}

结果正确。


3、平衡三进制多位乘法器

        在这基础上实现多位乘法器,也是很简单的,可以用经典的“列乘法”逻辑,也就是被乘数是固定的,每个乘数单独相乘,得到多个部分积,最后移位后相加即可,详情请看计算机组成原理(九):乘法器,借用一下思路,如下所示:

  A = 1101  (13 in decimal)
× B = 1011  (11 in decimal)
--------------1101   (部分积1)
+    1101    (部分积2)
+   0000     (部分积3)
+  1101      (部分积4)
--------------10001111   (143 in decimal)

也就分别得到各个部分积,这也可用于平衡三进制,得代码如下所示:

// **全加器和(TFULLSUM) 逻辑表**
const TFULLSUM:[[[u8; 3];3];3] = [[[0, 1, 2],[1, 2, 0],[2, 0, 1],],[[1, 2, 0],[2, 0, 1],[0, 1, 2],],[[2, 0, 1],[0, 1, 2],[1, 2, 0],],
];
// **全加器进位(TFULLCONS) 逻辑表**
const TFULLCONS:[[[u8; 3];3];3] = [[[0, 0, 0],[0, 1, 0],[0, 0, 2],],[[0, 1, 0],[1, 1, 0],[0, 0, 0],],[[0, 0, 2],[0, 0, 0],[2, 0, 2],],
];
// **同或门(TXNOR)逻辑表 双T及双1出1、1T及T1出T、其余为0 此门相当于乘法表用于相乘处理 **
pub const TXNOR:[[u8; 3];3]= [[0, 0, 0],[0, 1, 2],[0, 2, 1],
];/// 全加器:基于三维数组实现
pub fn ternary_full_adder(a: u8, b: u8, c_in: u8) -> (u8, u8) {let sum =TFULLSUM[a as usize][b as usize][c_in as usize];// 和let carry=TFULLCONS[a as usize][b as usize][c_in as usize];// 进位(sum, carry)
}
///多位三进制加法器基础,输入两个的三进制向量,返回加法结果向量和最终进位
pub fn ternary_stack_adder(mut stack1: Vec<u8>,mut stack2: Vec<u8>)-> Vec<u8>{let mut result:Vec<u8> = Vec::new();//存储和let mut c_in:u8=0;//Rust标准库中Vec,天然支持后进先出(LIFO),用栈协同弹出,倒序遍历, 支持不同长度while !stack1.is_empty() || !stack2.is_empty() {let v1 = stack1.pop().unwrap_or(0);let v2 = stack2.pop().unwrap_or(0);let (s_out, next_carry) =ternary_full_adder(v1, v2, c_in);result.push(s_out);//存结果c_in=next_carry;//进位传递}result.push(c_in);//推入最高位result.reverse(); // 反转,从高位到低位排列result
}///多位三进制乘法器基础
pub fn ternary_mul_base(stack1: Vec<u8>, stack2: Vec<u8>)-> Vec<u8>{let mut partials: Vec<Vec<u8>> =  Vec::new();let mut shift = 0;//将 stack2 看作乘数,从低位到高位for &m2 in stack2.iter().rev(){//将 stack1 看作被乘数,固定不动let mut partial: Vec<u8> = stack1.iter().map(|&m1| TXNOR[m1 as usize][m2 as usize]).collect();// 在尾部精确补0partial.extend(vec![0; shift]);shift += 1;partials.push(partial);}//累加所有偏移乘积let mut result = vec![0];for partial in partials {result = ternary_stack_adder(result, partial);}result
}fn main() {let stack1=vec![1,1,0,1];let stack2=vec![1,0,1,1];let re=ternary_mul_base(stack1,stack2);print!("{:?}",re);
}

结果正确,1101(十进制31)*1011(十进制31)=1TTT0111(十进制1147)。


4、平衡三进制偏积表乘法器

        从上面可以得知,它是用各个部分积累计相加得到结果的,也就是说只要得到,各个偏积就能有结果,比如:

A=1101(被乘数)        B=1011(乘数)

1101 * 1=1101
1101 * 1=1101
1101 * 0=0000
1101 * 1=1101

所以,在平衡三进制中,有任何数0乘都得0,任何数乘1等于它本身,任何数乘T(-1)等于相反数,这样可构建出偏积表,有没有注意上多个部分积,只有1101与0000,它是二进制的,而对于平衡三进制它的结果有三种,即:0000、1101、2202,这个就是偏积表,用被乘数形成偏积表,乘数当成下标来调用偏积表,然后移位后相加就可以得到最后的结果,长的当被乘数好,这样算的快,这个版本比上面的版本好,代码如下所示:

// **全加器和(TFULLSUM) 逻辑表**
const TFULLSUM:[[[u8; 3];3];3] = [[[0, 1, 2],[1, 2, 0],[2, 0, 1],],[[1, 2, 0],[2, 0, 1],[0, 1, 2],],[[2, 0, 1],[0, 1, 2],[1, 2, 0],],
];
// **全加器进位(TFULLCONS) 逻辑表**
const TFULLCONS:[[[u8; 3];3];3] = [[[0, 0, 0],[0, 1, 0],[0, 0, 2],],[[0, 1, 0],[1, 1, 0],[0, 0, 0],],[[0, 0, 2],[0, 0, 0],[2, 0, 2],],
];
// **非门(TNEG)逻辑表 输入T,输出1;输入0,输出0;输入1,输出T;**
const TNEG:[u8; 3]= [0, 2, 1];/// 全加器:基于三维数组实现
pub fn ternary_full_adder(a: u8, b: u8, c_in: u8) -> (u8, u8) {let sum =TFULLSUM[a as usize][b as usize][c_in as usize];// 和let carry=TFULLCONS[a as usize][b as usize][c_in as usize];// 进位(sum, carry)
}
///多位三进制加法器基础,输入两个的三进制向量,返回加法结果向量和最终进位
pub fn ternary_stack_adder(mut stack1: Vec<u8>,mut stack2: Vec<u8>)-> Vec<u8>{let mut result:Vec<u8> = Vec::new();//存储和let mut c_in:u8=0;//Rust标准库中Vec,天然支持后进先出(LIFO),用栈协同弹出,倒序遍历, 支持不同长度while !stack1.is_empty() || !stack2.is_empty() {let v1 = stack1.pop().unwrap_or(0);let v2 = stack2.pop().unwrap_or(0);let (s_out, next_carry) =ternary_full_adder(v1, v2, c_in);result.push(s_out);//存结果c_in=next_carry;//进位传递}result.push(c_in);//推入最高位result.reverse(); // 反转,从高位到低位排列result
}///多位三进制乘法器基础
pub fn ternary_mul_base(stack1: Vec<u8>, stack2: Vec<u8>)-> Vec<u8>{let partial_t: Vec<u8> = stack1.iter().map(|&m| TNEG[m as usize]).collect();// 构建偏积表:分别是乘以 0, 1, T 的情况let partials = vec![vec![0; stack1.len()], //0乘任何数,都得0stack1.clone(),        //任何数乘1,等于它本身partial_t,             //任何数乘T(-1)等于相反数];let mut result: Vec<u8> = vec![0];for (shift, &m2) in stack2.iter().rev().enumerate() {let mut part = partials[m2 as usize].clone();//用偏积表,m2当成下标,出可变副本part.resize(part.len() + shift, 0); // 更高效的偏移,低位补 0result = ternary_stack_adder(result, part);//加入当前部分积}result
}fn main() {let stack1=vec![1,1,0,1];let stack2=vec![1,0,1,1];let re=ternary_mul_base(stack1,stack2);print!("{:?}",re);
}

结果正确。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86203.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86203.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/86203.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决Vue2官网Webpack源码泄露漏洞

一&#xff1a;漏洞产生 Webpack是一个JavaScript应用程序的静态资源打包器。大部分Vue等应用项目会使用Webpack进行打包&#xff0c;如果没有正确配置&#xff0c;就会导致项目源码泄露&#xff0c;可能泄露的各种信息如API、加密算法、管理员邮箱、内部功能等等。 F12查看源…

新中国风通用读书颂词分享PPT模版

新国风PPT模版&#xff0c;古风影视剧PPT模版&#xff0c;天青色中国风读书颂词分享会PPT模版&#xff0c;国风通用PPT模版&#xff0c;茶味PPT模版&#xff0c;风雪夜归人PPT模版&#xff0c;小别离PPT模版&#xff0c;西江月茶词PPT模版 新中国风通用读书颂词分享PPT模版&…

Rust自动化测试的框架

Rust实现Web自动化测试的框架 以下是10个使用Rust实现Web自动化测试的框架示例,涵盖不同场景和工具链: 使用thirtyfour(基于Selenium) use thirtyfour::prelude::*;async fn example_selenium() -> WebDriverResult<()> {let caps = DesiredCapabilities::chro…

MySQL性能测试模板

引言&#xff1a;为什么MySQL性能测试如此重要&#xff1f; 你是否遇到过这些问题&#xff1a; 线上数据库突然卡顿&#xff0c;QPS暴跌&#xff1f;业务高峰期MySQL服务器CPU 100%&#xff0c;却找不到瓶颈&#xff1f;新功能上线后&#xff0c;数据库性能不升反降&#xff…

第八课:大白话教你逻辑回归

这节课咱们来聊聊 逻辑回归(Logistic Regression),别看名字里有“回归”,它其实是用来干 分类 的活儿的!我会用最接地气的方式,从定义讲到实战,保证你笑着学会,还能拿去忽悠朋友! 一:逻辑回归是啥?——当回归想不开,转行搞分类 1.1 定义:逻辑回归是个“概率算命…

项目中后端如何处理异常?

为了统一管理异常&#xff0c;在项目中封装了自定义异常类(BusinessException),全局异常处理器(GlobalExceptionHandler), 以及一些状态码(ErrorCode), 便于前端统一处理异常. 主要流程如下: 当项目业务发生逻辑错误时,会抛出BusinessException, 其中包含自定义错误码和信息.…

群晖 NAS Docker 镜像加速配置详细教程

通过为群晖NAS的Docker配置镜像仓库加速服务&#xff0c;可显著提升镜像拉取速度与稳定性。本指南详细介绍使用毫秒镜像 (1ms.run) 服务的配置步骤及日常使用方法。 一、配置前准备 开始配置前&#xff0c;推荐使用毫秒镜像的免登录方式获取镜像仓库地址。相比传统的账号密码…

Deepoc行业垂直大模型作为行业知识与AI深度融合的专用工具

一、​​行业专用智能诊断与预测性维护​​ ​​设备健康管理​​ ​​多源异构数据融合​​&#xff1a;垂直大模型通过时序对齐算法&#xff08;如动态时间规整DTW&#xff09;整合振动&#xff08;5kHz&#xff09;、温度&#xff08;1Hz&#xff09;、电流等多维度传感器数…

内存泄漏系列专题分析之二十五:内存泄漏测试report Camera相机进程各种内存指标dump方式

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:内存泄漏系列专题分析之二十四:内存泄漏测试Camera相机进程内存指标分布report概述 这一篇我们开始讲: 内存泄漏系列专题分析之二十五:内存泄漏测试report Camera相机进程各种内存指标dump方式 目录 一、问…

mysql 加锁算法 详解

锁 锁分类 从锁的操作划分 共享锁和排他锁 共享锁&#xff08;读锁&#xff09;和排他锁&#xff08;写锁&#xff09;。对于更新语句&#xff0c;InnoDB会自动加上排他锁&#xff1b;对于查询语句&#xff0c;如果是快照读&#xff0c;由于MVCC的存在&#xff0c;InnoDB不会…

使用EasyExcel导出带下拉框选项excel模板

使用EasyExcel导出excel模版&#xff0c;表头字段动态生成下拉框选择&#xff0c;并且阻止输入不符合下拉框选项的值&#xff0c;会在表格进行提示。 为了避免excel下拉框选项过多&#xff0c;导致下拉框内容不显示&#xff0c;新建一个sheet页&#xff0c;将下拉框内容存储在…

自动化 UI 测试智能体在 Trae 平台的部署体验

我用Trae 做了一个有意思的Agent 「自动化 UI 测试」。 点击 Trae - AI 原生 IDE 立即复刻&#xff0c;一起来玩吧&#xff01; 前言 用户界面&#xff08;UI&#xff09;作为用户与软件交互的窗口&#xff0c;其质量直接影响用户体验和产品口碑。传统的手动 UI 测试不仅效率…

身份证识别接口功能与应用场景-Android证件识别api集成

数字化信息高速发展的时代&#xff0c;信息的高效处理与精准识别已成为众多行业发展的关键驱动力。针对联网平台身份核验过程中&#xff0c;证件信息手动录入效率低、出错率高、用户体验差等问题推出了身份证识别接口&#xff0c;旨在为各行各业提供高效与便捷的身份核验解决方…

POJ2718-Smallest Difference(穷竭搜索:全排列)

题目描述 给定一些不同的十进制数字&#xff0c;您可以通过选择这些数字的一个非空子集并以某种顺序编写它们来形成一个整数。剩余的数字可以以某种顺序写下来形成第二个整数。除非结果整数为 0&#xff0c;否则整数可能不以数字 0 开头。 例如&#xff0c;如果给定数字 0, 1…

银行账户管理系统-交互系统

这篇博文是对上一篇(银行账户管理系统)的提升,上一篇是基础的学习,这一篇是在上一篇的基础上做的交互系统。Tkinter基础函数知识点点击下面超链接就可以跳转到对应的界面。希望可以帮助到你。这是则篇的框架银行账户管理系统代码解释-CSDN博客介绍。 写文章-CSDN创作中心h…

基于大数据的社会治理与决策支持方案PPT(66页)

大数据引领社会治理新变革 大数据技术的兴起&#xff0c;为社会治理带来了前所未有的变革。它改变了我们认识社会的方式&#xff0c;使得社会治理更加精准、高效。通过大数据融合分析&#xff0c;实现了对社会动态的全面监控和深度挖掘。 构建城市块数据中心 以“社会治理”…

Containerd容器技术

目录 一&#xff0c;containerd概述 1&#xff0c;containerd 概述 2&#xff0c;containerd 的主要功能 1. 容器生命周期管理 2. 与底层基础设施交互 3. 与上层系统集成 3&#xff0c;containerd 的核心特点 1. 轻量级与低资源消耗 2. 标准化与开放性 3. 高性能与稳定…

awk命令详解

Shell AWK 命令详解 一、AWK 简介与基本语法 AWK 是一种强大的文本处理工具,名称来源于其三位创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的姓氏首字母。它逐行扫描文件,寻找匹配特定模式的行并执行相应操作。 基本语法结构: awk [选项] 模式 {动作} 文件名…

面试150跳跃游戏

思路 贪心算法&#xff0c;使用变量cover表示当前所能覆盖的最大距离&#xff0c;如果cover大于等于n-1表示能覆盖到&#xff0c;反之则不能 class Solution:def canJump(self, nums: List[int]) -> bool:if not nums:return Falsenlen(nums)cover0for i in range(n):if i…

磁悬浮轴承温度漂移克星:三招实现精准控制

在磁悬浮轴承&#xff08;Active Magnetic Bearing, AMB&#xff09;的高性能应用中&#xff0c;位置传感器的精度就是系统的生命线。然而&#xff0c;传感器输出随温度变化产生的漂移&#xff08;温漂&#xff09;&#xff0c;如同一个潜伏的破坏者&#xff0c;悄然引入测量误…