剩余数(RNS)表示系统
引言
假设有如下问题:已知一个数分别除以8,7,3得到的余数分别是5,0,0,试问这个数是多少?如果求解这一问题,实际上就是对在(8|7|3)剩余数系统上表示的数求解对应的标准二进制形式。这可以视为是RNS表示灵感的起源。
何为剩余数(RNS)
假定有一个数x,给定一系列严格递减的相对质数mk−1,mk−2,…,m1,m0m_{k-1},m_{k-2},…,m_{1},m_{0}mk−1,mk−2,…,m1,m0,x对这些素数取模得到的余数分别为xk−1,xk−2,…,x1,x0x_{k-1},x_{k-2},…,x_{1},x_{0}xk−1,xk−2,…,x1,x0,那么我们可将x表示为:
x=(xk−1,xk−2,…,x1,x0)RNS(mk−1∣mk−2∣…∣m1∣m0)x=(x_{k-1},x_{k-2},…,x_{1},x_{0})_{RNS(m_{k-1}|m_{k-2}|…|m_{1}|m_{0})}x=(xk−1,xk−2,…,x1,x0)RNS(mk−1∣mk−2∣…∣m1∣m0)。
我们将RNS(mk−1∣mk−2∣…∣m1∣m0)RNS(m_{k-1}|m_{k-2}|…|m_{1}|m_{0})RNS(mk−1∣mk−2∣…∣m1∣m0)称为k模的RNS,k为x的位数。
新概念:动态范围
将RNS(mk−1∣mk−2∣…∣m1∣m0)RNS(m_{k-1}|m_{k-2}|…|m_{1}|m_{0})RNS(mk−1∣mk−2∣…∣m1∣m0)中的mk−1,mk−2,…,m1,m0m_{k-1},m_{k-2},…,m_{1},m_{0}mk−1,mk−2,…,m1,m0全部相乘,其乘积M称为对应RNS系统的动态范围,具体意义是RNS系统能表示的数的范围。
举一个具体的例子更好理解:
在RNS(8|7|5|3)4模剩余数系统中,十进制的21可表示为(5|0|1|0),该系统的动态范围为875*3=840,即一共可以表示840个数,对应840种不同取值。
个人理解,动态范围就类似几位二进制能表示的十进制数目。
新概念:RNS的补码
对于RNS表示的数x,其补码为(M-x)的RNS表示,例如:
规定默认剩余数系统为RNS(8|7|5|3)。对于十进制数21,对应RNS形式为(5|0|1|0),其补码为(840-21)=819对应的RNS形式为(3|0|4|0)。
事实上,还有一种计算补码的方式,即计算每个xix_{i}xi相对对应的mim_{i}mi的补码(实际上就是mi−xim_{i}-x_{i}mi−xi)。但要注意,0对应的补码仍为0。
仍然以上文的21为例,其RNS形式(5|0|1|0),而剩余数系统为RNS(8|7|5|3),因此对应补码为(8-5|0|5-1|0)=(3|0|4|0)。
引入补码的意义在于可以让RNS系统表示的M个可用值在任何一个连续范围(M)里。否则同一个RNS表示不能对应唯一的一个数。例如:
在剩余数系统RNS(8|7|5|3)下,如果RNS表示为(1|1|1|1),那么对应的十进制数可能为1,也可能是841,甚至更多……
新概念:RNS的位权
利用位权可根据RNS表示形式获得对应的十进制数,类似二进制中的位权2n−12^{n-1}2n−1。计算方式是将RNS表示与对应的位权相乘求和,最终对动态范围取模。
例如:对于RNS(8|7|5|3),其位权分别为105,120,336,280。
RNS表示(1|1|1|1)对应十进制数(105+120+336+280) mod 840 = 1.
新概念:RNS的编码利用率
考虑了位权之后,下一个问题就是RNS剩余数系统在计算机中需要多少bit存储,以及对这些位的利用率。计算方法也很简单,就是计算每一个mim_{i}mi对应的最大余数占据多少位,然后求和就可以了。编码的利用率就是RNS系统的动态范围除以需要bit数可表示的最大整数。
例如:对于RNS(8|7|5|3),最大余数分别为7,6,4,2,对应二进制位数为3,3,3,2,所以共需要3+3+3+2=11-bit。11-bit最多可表示2048个值,而该RNS系统最多可表示840个值,因此编码利用率为840/2048约等于41%。
RNS的算术
加减乘:加法和乘法可通过对应xix_{i}xi做加减并相对mim_{i}mi取模进行,减法可以视作补码的加法。从RNS的表示来看,它具备天然的并行计算优势(因为几个模数的取模是互相独立的),不存在级间的进位传播问题;而且由于余数取值范围较小,所以运算操作相对快速简单,甚至可以通过直接的查表法实现。
例如:对于剩余数系统RNS(8|7|5|3)
(5|5|0|2)-> x = (5*105+5*120+2*280) mod 840 = 5
(7|6|4|2) -> y = (7*105+6*120+4*336+2*280) mod 840 = 839
若规定剩余数系统表示的范围为-420~+419, 则y实际上是-1的补码,则
x+y=(5+7|5+6|0+4|2+2) = (4|4|4|1) = (4105+4120+4336+280) = 4
x-y = (5-7|5-6|0-4|2-2) = (-2|-1|-4|0) = (6|6|1|0) = 6
xy = (57|56|0|4) = (3|2|0|1)= -5
其实从上面的例子中也可以看到RNS的缺点,它不像我们平时的十进制数一样,往往难以判断其符号或者大小。如果不规定表示范围,可能y仍然被认为是个大正数。因此在使用RNS时,必须确定结果保留在某个确定范围内。因此它在信号处理等领域有广泛应用。
选取RNS的模
从前面的例子中可以看到,模数选择会影响整个剩余数系统可表示数的数目以及计算的效率,因此合理选择RNS的模是一个重要问题。
根据上面的例子及定义,模数选择应该符合以下要求:
1.模数彼此之间互素;
2.选取的模数应当逐渐递减(满足定义);
3.在满足前两条的基础上,除最大模数外的其他模数应该尽可能地大,其个数要尽可能少,以保证运算的效率;
例如,对于0~100 000 这个范围,我们可选取以下几种方案:
a. RNS(17|13|11|7|5|3|2)
动态范围M=510510
7模剩余数系统
共需要5+4+4+3+2+1=19-bit存储
b. RNS(17|13|11|7|3|2)
动态范围M=102102
6模剩余数系统
共需要5+4+4+4+2+1=19-bit存储
c. RNS(26|21|17|11)
动态范围M=102102
4模剩余数系统
共需要5+5+5+4=19-bit存储
以上几种方案,a明显编码利用率较低,且模数数目多,如果用硬件实现其相关运算需要多个模运算单元;同理,b和c相比虽然范围相同,但c的模数更少,因此编码利用率更高,目前来看c是最优的。但如果给出这样一个RNS系统:
d. RNS(15|13|11|8|7)
M = 120120
5模剩余数系统
共需要4+4+4+3+3=18-bit存储
可见,d方案在不改变动态范围的前提下,减少了1-bit的存储空间,虽然增加了一个模数。实际上,a~d方案对应的是不同的模选择策略。a使用的是最简单的顺序选择,即从2开始,逐步加入质数,直到动态范围满足要表示的数。而b是a精简的结果,因为a动态范围是目标的5倍左右,因此去除了模数集合中的5。根据原则3,要让模数尽可能得大,同时个数要少,我们将b中的模数两两相乘,获得了c。但在实际操作中发现,在模数集中加入较小质数的幂(两个素数的幂互素),然后按照a的方法插入质数,b的方法约减结果,c的方法两两合并,可以取得像d这样的更好结果。
参考文献:
https://zhuanlan.zhihu.com/p/335956750
https://zhuanlan.zhihu.com/p/258679655
剩余数(RNS)表示系统相关推荐
- RNS (Residue Number System) 剩余数系统
RNS(Residue Number System)介绍 目前RNS并没有一个正式的中文名,若有,请各位大佬指正. 简介 简而言之,剩余数系统就是将一个大一点的数A∈ZQA\in \mathcal{Z ...
- SEAL全同态加密开源库(七) rns剩余数系统-源码解析
SEAL全同态加密开源库(七) rns剩余数系统-源码解析 2021SC@SDUSC 2021-11-14 前言 这是SEAL开源库代码分析报告第六篇,本篇将分析util文件夹中的rns.h和rns. ...
- 利用Python语言编程,完成猜数游戏,系统随机产生一个1到100的数字num1,用户输入一个数字guess,如果没有猜对,根据系统给出的提示重新猜数,直到才对为止。
利用Python语言编程,完成猜数游戏,系统随机产生一个1到100的数字num1,用户输入一个数字guess,如果没有猜对,根据系统给出的提示重新猜数,直到才对为止. 要求:(1)系统每次都要给出新的 ...
- Android 系统(266)---细数利用android系统机制的保活手段
Android 进程常驻(2)----细数利用android系统机制的保活手段 这是一个轻量级的库,配置几行代码,就可以实现在android上实现进程常驻,也就是在系统强杀下,以及360获取root权 ...
- 日化用品行业数智化B2B系统简化分销流程,提升日化用品企业供应链竞争力
目录 日化用品企业建设B2B网站的价值可分为以下五点: 目前国内日化用品行业发展B2B电商的现状: 1.精细化商机管理,智能B2B电商平台驱动销售业绩增长 2.大数据驱动,数智化B2B系统精准构造用户 ...
- linux普通用户句柄数上限,linux系统下的用户文件句柄数限制
为什么要修改用户打开的文件数 系统默认单个进程可以打开1024个文件,对于一些应用如tomcat.oracle等,运行时经常open成千上万个文件,系统管理员需根据系统上运行的应用需求,修改系统文件数 ...
- Android 进程常驻(2)----细数利用android系统机制的保活手段
这是一个轻量级的库,配置几行代码,就可以实现在android上实现进程常驻,也就是在系统强杀下,以及360获取root权限下,clean master获取root权限下都无法杀死进程 支持系统2.3到 ...
- 零售业变革下,数智化供应链系统精细化库存管理,构建企业数字化供应链体系
尽管业内对"新零售时代"仍有着争议,但随着互联网及移动互联网的兴起,网络购物已成为数亿消费者的习惯,已经甚少有企业可以忽略这一趋势.另一方面,全球新冠病毒疫情对消费零售供应链和线下 ...
- 十六进制190的2进制数_十六进制数系统解释
十六进制190的2进制数 Hexadecimal numbers, often shortened to "hex numbers" or "hex", are ...
- 测试服务器最大链接数_LoaRunner性能测试系统学习教程:probe监控(3)
上期我们讲到LoaRunner性能测试Tomcat监控,这期我们讲LoaRunner性能测试probe监控. probe监控 这是一款 Tomcat 管理和监控工具,前身是 Lambda Probe. ...
最新文章
- [bzoj] 1176 Mokia || CDQ分治
- android怎么搭建人脸库,OpenCV-2.4.6-android-sdk 人脸识别demo搭建
- 多目标决策问题1.1.1:线性加权法——熵权法确定权重
- cocos2d-x jni相关目录分析
- 在拉取和推送都存在,冲突时,用命令行解决
- 编程题:带参数的宏定义来实现,求圆的周长和面积。
- ABAP Authorization object where used list in tcode SUIM
- 转为字符数组_数组的20种常用的方法?
- 二进制编译安装mysql_二进制编译安装mysql
- phpcms导航高亮:“首页” 高亮显示(含代码、截图、案例)
- 5、URLConnection(2)
- 英雄联盟S11总决赛EDG夺冠,网友:立下的flag可以兑现了
- ffmpeg mp4 html5,FFMPEG mkv to mp4 conversion lacks audio in HTML5 player
- Google与GitHub 结盟,为保护软件供应链而战
- 文件隐藏工具Funter for Mac使用方法
- Mysql源码编译安装主从复制
- MP3转换器下载 - 通用mp3转换器
- Vue安装教程(保姆级详细教程)
- Redis持久化 - 邱乘屹的个人技术博客
- {“errcode“:44001,“errmsg“:“empty media data, hint: [1655962096234893527769663], from ip: 222.72.xxx.
热门文章
- ORALCE 数据库静默安装教程(Center OS 7) --用于个人理解
- Starting MySQL... ERROR The server quit without updating PID file 解决办法
- 格式化分配单元大小_格式化时应将分配单位大小设置为什么?
- linux内核参数 ati显卡,Ubuntu Linux环境下ATI显卡问题解析
- 减少谷歌浏览器占用内存的方法
- 深入浏览器之页面加载中的计算机网络
- ubuntu 编译时候对pthread_creat未定义
- CSS基础学习十九:CSS布局之图文混排,图像签名,多图拼接和图片特效
- 【2022考研最后40天】要注意这4个时间节点和这5件事情
- 复旦大学计算机学院预推免,保研经验:老牌985学霸,排名、六级、科研,样样拔尖,预推免直博复旦,导师为杰青!...