热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

程序员的数学笔记2余数

上一节程序员的数学笔记1–进制转换是介绍了进制,特别是十进制和二进制之间的转换,移位操作和逻辑操作。今天介绍的是余数,看完本节笔记&#x

上一节程序员的数学笔记1–进制转换是介绍了进制,特别是十进制和二进制之间的转换,移位操作和逻辑操作。

今天介绍的是余数,看完本节笔记,你会发现生活中有很多东西都有余数的影子。




余数


余数的特性

整数是没有边界的,它可能是正无穷,也可能是负无穷。

**但余数却总是在一个固定的范围内。**假如除数是 m,那么余数的范围就是 0~(m-1)。

生活中,余数可以用来算星期,web 编程中可以用于分页。


同余定理


两个整数 a 和 b,如果它们除以正整数 m 得到的余数相等,我们就可以说 a 和 b 对于模 m 同余。


同余定理可以用来做分类,或者说是均分操作。因为可以将对同个正整数 m 相除得到的余数相等的分在同一个类中。


哈希函数

每个编程语言都有对应的哈希函数,哈希有时候也被翻译为散列,**它是指将任意长度的输入,通过哈希算法压缩为某一固定长度的输出。**这其实就是一个求余的过程。

例如,假设对于 100 万条数据记录,要做到高速存取,最理想情况是开辟一个连续的空间存放这些数据,减少寻址的时间,但很多时候条件并不允许。这个时候我们可以考察一下,系统是否可以提供若干个较小的连续空间,每个空间可以存放一定数量的记录。比如找到100个较小的连续空间,每个空间可以容纳 1 万条数据连续存放。那么我们可以采用余数和同余定理来设计一个散列函数,并实现哈希表的结构。

这个函数可以如下所示:

f(x) = x mod size

x表示等待被转换的数值,size表示有限存储空间的数量,mod表示取余操作。通过余数,你就能将任何数值,转换为有限范围内的一个数值,然后据这个新的数值,来确定将数据存放在何处。

而在我们这个例子中,size=100,那么对于记录标号分别是 1 和 101 的两条数据,根据上述公式进行取余操作,得到的余数都是 1,那么它们就会分到同一个存储的空间中。

这种的做法好处不仅是设定一个存放分类的规则,而且取余操作简单快速,不会增加寻址时间。

更进一步,如果想增加数据散列的随机程度,可以加入一个较大的随机数 MAX,如下所示:

f(x) = (x + MAX) mod size

比如对标号为 1 的记录,随机数是590199,那么计算结果是得到余数为 0,而标号为 101,随机数变成 627901,对应余数是 2。这样在新的计算公式下,这两个记录就分配到不同的存储空间了。

这种做法更适合需要将数据重新洗牌的应用场景,比如加密算法、MapReduce 中的数据分发、记录的高速查询和定位等。

举个例子,对于一个加密算法,如果我们要加密一组三位数,那我们设定一个这样的加密规则:


  1. 先对每个三位数的个、十和百位数,都加上一个较大的随机数。
  2. 然后将每位上的数字都除以 7,用所得到的余数代替原来的三位数;
  3. 最后将第一位和第三位交换。

这就是一个基本的加密变换过程。

例如对数字 625 加密,根据刚刚的规则,随机数采用 590127,百、十和个位数都分别加上这个随机数,分别得到的是 590133、590129、590132,接着分别除以 7,得到的余数分别是 5,1,4,然后交换得到最终的结果是 415。而如果需要解密,因为加密的人会知道加密规则、随机数和求余所用的除数 7 以及求余操作中的商,就可以解密还原回原来的数字。

更多的采用余数和求余操作的应用例子:


  • 尾号限行
  • 最大公约数、模幂运算(DES、AES、RSA),凯撒密码,孙子定理
  • 进制的转换,应该说十进制转换成其他进制都是循环求余操作

关于余数的一些应用例子,你是否还想到其他的应用呢?

可以留言回复,和我进行交流!



欢迎关注我的微信公众号–机器学习与计算机视觉,或者扫描下方的二维码,大家一起交流,学习和进步!


推荐阅读
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 2022年的风口:你看不起的行业,真的很挣钱!
    本文介绍了2022年的风口,探讨了一份稳定的副业收入对于普通人增加收入的重要性,以及如何抓住风口来实现赚钱的目标。文章指出,拼命工作并不一定能让人有钱,而是需要顺应时代的方向。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • Python入门后,想要从事自由职业可以做哪方面工作?1.爬虫很多人入门Python的必修课之一就是web开发和爬虫。但是这两项想要赚钱的话 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 数字账号安全与数据资产问题的研究及解决方案
    本文研究了数字账号安全与数据资产问题,并提出了解决方案。近期,大量QQ账号被盗事件引起了广泛关注。欺诈者对数字账号的价值认识超过了账号主人,因此他们不断攻击和盗用账号。然而,平台和账号主人对账号安全问题的态度不正确,只有用户自身意识到问题的严重性并采取行动,才能推动平台优先解决这些问题。本文旨在提醒用户关注账号安全,并呼吁平台承担起更多的责任。令牌云团队对此进行了长期深入的研究,并提出了相应的解决方案。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 小程序自动授权和手动接入的方式及操作步骤
    本文介绍了小程序支持的两种接入方式:自动授权和手动接入,并详细说明了它们的操作步骤。同时还介绍了如何在两种方式之间切换,以及手动接入后如何下载代码包和提交审核。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 数据结构与算法的重要性及基本概念、存储结构和算法分析
    数据结构与算法在编程领域中的重要性不可忽视,无论从事何种岗位,都需要掌握数据结构和算法。本文介绍了数据结构与算法的基本概念、存储结构和算法分析。其中包括线性结构、树结构、图结构、栈、队列、串、查找、排序等内容。此外,还介绍了图论算法、贪婪算法、分治算法、动态规划、随机化算法和回溯算法等高级数据结构和算法。掌握这些知识对于提高编程能力、解决问题具有重要意义。 ... [详细]
  • cs231n Lecture 3 线性分类笔记(一)
    内容列表线性分类器简介线性评分函数阐明线性分类器损失函数多类SVMSoftmax分类器SVM和Softmax的比较基于Web的可交互线性分类器原型小结注:中文翻译 ... [详细]
  • Maven构建Hadoop,
    Maven构建Hadoop工程阅读目录序Maven安装构建示例下载系列索引 序  上一篇,我们编写了第一个MapReduce,并且成功的运行了Job,Hadoop1.x是通过ant ... [详细]
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
author-avatar
guan
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有