引言

假设有如下问题:已知一个数分别除以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
x
y = (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)表示系统相关推荐

  1. RNS (Residue Number System) 剩余数系统

    RNS(Residue Number System)介绍 目前RNS并没有一个正式的中文名,若有,请各位大佬指正. 简介 简而言之,剩余数系统就是将一个大一点的数A∈ZQA\in \mathcal{Z ...

  2. SEAL全同态加密开源库(七) rns剩余数系统-源码解析

    SEAL全同态加密开源库(七) rns剩余数系统-源码解析 2021SC@SDUSC 2021-11-14 前言 这是SEAL开源库代码分析报告第六篇,本篇将分析util文件夹中的rns.h和rns. ...

  3. 利用Python语言编程,完成猜数游戏,系统随机产生一个1到100的数字num1,用户输入一个数字guess,如果没有猜对,根据系统给出的提示重新猜数,直到才对为止。

    利用Python语言编程,完成猜数游戏,系统随机产生一个1到100的数字num1,用户输入一个数字guess,如果没有猜对,根据系统给出的提示重新猜数,直到才对为止. 要求:(1)系统每次都要给出新的 ...

  4. Android 系统(266)---细数利用android系统机制的保活手段

    Android 进程常驻(2)----细数利用android系统机制的保活手段 这是一个轻量级的库,配置几行代码,就可以实现在android上实现进程常驻,也就是在系统强杀下,以及360获取root权 ...

  5. 日化用品行业数智化B2B系统简化分销流程,提升日化用品企业供应链竞争力

    目录 日化用品企业建设B2B网站的价值可分为以下五点: 目前国内日化用品行业发展B2B电商的现状: 1.精细化商机管理,智能B2B电商平台驱动销售业绩增长 2.大数据驱动,数智化B2B系统精准构造用户 ...

  6. linux普通用户句柄数上限,linux系统下的用户文件句柄数限制

    为什么要修改用户打开的文件数 系统默认单个进程可以打开1024个文件,对于一些应用如tomcat.oracle等,运行时经常open成千上万个文件,系统管理员需根据系统上运行的应用需求,修改系统文件数 ...

  7. Android 进程常驻(2)----细数利用android系统机制的保活手段

    这是一个轻量级的库,配置几行代码,就可以实现在android上实现进程常驻,也就是在系统强杀下,以及360获取root权限下,clean master获取root权限下都无法杀死进程 支持系统2.3到 ...

  8. 零售业变革下,数智化供应链系统精细化库存管理,构建企业数字化供应链体系

    尽管业内对"新零售时代"仍有着争议,但随着互联网及移动互联网的兴起,网络购物已成为数亿消费者的习惯,已经甚少有企业可以忽略这一趋势.另一方面,全球新冠病毒疫情对消费零售供应链和线下 ...

  9. 十六进制190的2进制数_十六进制数系统解释

    十六进制190的2进制数 Hexadecimal numbers, often shortened to "hex numbers" or "hex", are ...

  10. 测试服务器最大链接数_LoaRunner性能测试系统学习教程:probe监控(3)

    上期我们讲到LoaRunner性能测试Tomcat监控,这期我们讲LoaRunner性能测试probe监控. probe监控 这是一款 Tomcat 管理和监控工具,前身是 Lambda Probe. ...

最新文章

  1. [bzoj] 1176 Mokia || CDQ分治
  2. android怎么搭建人脸库,OpenCV-2.4.6-android-sdk 人脸识别demo搭建
  3. 多目标决策问题1.1.1:线性加权法——熵权法确定权重
  4. cocos2d-x jni相关目录分析
  5. 在拉取和推送都存在,冲突时,用命令行解决
  6. 编程题:带参数的宏定义来实现,求圆的周长和面积。
  7. ABAP Authorization object where used list in tcode SUIM
  8. 转为字符数组_数组的20种常用的方法?
  9. 二进制编译安装mysql_二进制编译安装mysql
  10. phpcms导航高亮:“首页” 高亮显示(含代码、截图、案例)
  11. 5、URLConnection(2)
  12. 英雄联盟S11总决赛EDG夺冠,网友:立下的flag可以兑现了
  13. ffmpeg mp4 html5,FFMPEG mkv to mp4 conversion lacks audio in HTML5 player
  14. Google与GitHub 结盟,为保护软件供应链而战
  15. 文件隐藏工具Funter for Mac使用方法
  16. Mysql源码编译安装主从复制
  17. MP3转换器下载 - 通用mp3转换器
  18. Vue安装教程(保姆级详细教程)
  19. Redis持久化 - 邱乘屹的个人技术博客
  20. {“errcode“:44001,“errmsg“:“empty media data, hint: [1655962096234893527769663], from ip: 222.72.xxx.

热门文章

  1. ORALCE 数据库静默安装教程(Center OS 7) --用于个人理解
  2. Starting MySQL... ERROR The server quit without updating PID file 解决办法
  3. 格式化分配单元大小_格式化时应将分配单位大小设置为什么?
  4. linux内核参数 ati显卡,Ubuntu Linux环境下ATI显卡问题解析
  5. 减少谷歌浏览器占用内存的方法
  6. 深入浏览器之页面加载中的计算机网络
  7. ubuntu 编译时候对pthread_creat未定义
  8. CSS基础学习十九:CSS布局之图文混排,图像签名,多图拼接和图片特效
  9. 【2022考研最后40天】要注意这4个时间节点和这5件事情
  10. 复旦大学计算机学院预推免,保研经验:老牌985学霸,排名、六级、科研,样样拔尖,预推免直博复旦,导师为杰青!...