模块运算的乐趣

一位读者最近建议我写一篇关于模运算的文章(又名“取余数”)。我没有仔细考虑过,但意识到模是非常强大的:它应该在我们的心智工具箱中,紧邻加法和乘法。

与其用公式来打你的脸,不如让我们探索一个多年来我们一直在潜移默化地接触的想法。有一个关于模运算的好文章这激发了这篇文章的灵感。

奇数、偶数和三个

在发现整数(1、2、3、4、5……)后不久,我们意识到它们分为两组:

  • 偶数:可被2整除(0,2,4,6..)
  • 奇数:不能被2整除(1,3,5,7…)

为什么这种区别很重要?这是抽象的开始-我们注意到属性一个数字(如偶数或奇数),而不仅仅是数字本身(“37”)。

这是巨大的-它让我们在更深层次上探索数学,并找到两者之间的关系类型数字,而不是具体数字。例如,我们可以制定这样的规则:

  • 偶数x偶数=偶数
  • 奇数x奇数=奇数
  • 偶数x奇数=偶数

这些规则是通用的,它们在属性级别起作用。(直觉上,我有一个化学类比“均匀度”是一些数字所具有的分子,不能通过乘法消除。)

但偶数/奇数是一个非常特殊的属性:除以2。数字3怎么样?这个怎么样:

  • “三个七”是指一个数字可以被3整除(0,3,6,9…)
  • “喉咙”意味着你是可被3整除(1,2,4,5,7,8…)

奇怪,但可行。你会注意到一些事情:有两种类型的throdd。像“4”这样的数字距离三点七只有一步之遥(余数1),而数字5距离二点(余数2)。

“三个七”只是数字的另一个属性。也许没有偶数/奇数那么有用,但它确实存在:我们可以制定类似“threevenxthreeven=threeven”等规则。

但它正在变得疯狂。我们不能总是造新单词。

输入模数

模运算(在许多编程语言中缩写为“mod”或“%”)是除法时的余数。例如,“5 mod 3=2”表示2是5除以3的余数。

将日常术语转换为数学,“偶数”是指“0 mod 2”,也就是说,它被2除时有0的余数。奇数为“1 mod 2”(余数为1)。

为什么这么酷?好吧,我们的“奇数/偶数”规则变成了这样:

  • 偶数x偶数=0 x 0=0[偶数]
  • 奇数x奇数=1 x 1=1[奇数]
  • 偶数x奇数=0 x 1=0[偶数]

酷,嗯?计算起来很容易——我们将“属性”转换为实际的方程式,并发现了一些新的事实。

什么是偶x偶x奇x奇?它是0 x 0 x 1 x 1=0。事实上,你可以看到是否有一个偶数乘法在任何地方整个结果将为零……我的意思是偶数:)。

时钟数学

模块化数学的秘密在于,我们已经在使用它来保持时间——有时被称为“时钟算法”。

例如:现在是7:00(上午/下午无所谓)。7小时后时针在哪里?

小时。7+7=14,但我们不能在时钟上显示“14:00”。所以它必须是2。我们凭直觉,用数学术语进行推理:

  • (7+7)mod 12=(14)mod 12=2 mod 12[2是14除以12的余数]

等式“14 mod 12=2 mod 12”表示“14点钟”和“2点钟”在12小时制时钟上看起来是一样的。他们是同余的,用三等号表示:14≡2 mod 12。

另一个例子:现在是8:00。25小时后大牌会在哪里?

你可能会意识到,25小时只是“1天+1小时”,而不是25到8。因此,时钟将提前1小时结束,即9点。

  • (8+25)模12≡

您直观地将25转换为1,并将其添加到8。

有趣的特性:数学很有用

用时钟作为类比,我们可以计算出模运算的规则是否“有效”(确实有效)。

加法/减法

让我们假设时钟上有两次看起来一样(“2:00”和“14:00”)。如果我们给两者加上相同的“x”小时,会发生什么?

嗯,它们在时钟上的变化量是一样的!2:00+5小时Select14:00+5小时-两者都显示为7:00。

为什么?好吧,我们从来都不在乎14号携带的多余的“12:00”。我们只需在两个余数的基础上加上5,它们的前进速度是一样的。对于所有的同余数(2和14),加法和减法的结果是一样的。

乘法

很难看出乘法是否保持不变。如果14≡2(mod 12),我们可以将两边相乘并得到相同的结果吗?

让我们看看,当我们乘以3时会发生什么?

好吧,2:00*3≡6:00。但什么是“14:00”*3?

记住,14=12+2。所以,我们可以说

  • 14*3=(12+2)*3=第12版(12*3)+(2*3)

第一部分(12*3)可以忽略!14所携带的“12小时溢出”只会重复几次。但谁在乎呢?无论如何,我们忽略了溢出。

乘法时,重要的是余数,14:00和2:00的2个小时相同。直观地说,这就是我如何看到乘法并没有改变与模块化数学的关系(你可以对模块化关系的两边进行乘法,得到相同的结果)。请参阅上面的链接为了得到更严格的证明-这些是我的直观的铅笔线.

模运算的使用

现在有趣的部分-为什么模运算有用?

简单的时间计算

我们凭直觉这么做,但给它起个名字很好。你有一班飞机下午3点到达。延迟了14个小时。它什么时候降落?

好的,14≡2模12。所以我认为这是“2小时和一个上午/下午的开关”,所以我知道这将是“3+2=凌晨5点”。

这比普通的模运算符复杂一些,但原理是一样的。

将项目放入随机组

假设你有人买了电影票,并有一个确认号码。你想把他们分成两组。

你是做什么的?“这里很奇怪,那里也很奇怪”。你不需要知道发行了多少张票(上半场,下半场),每个人都可以立即计算出自己的团队(无需联系中央当局),随着越来越多的人买票,该计划也会起作用。

需要3组?除以3,取余数(又名mod 3)。您将拥有组“0”、“1”和“2”。

在编程中,取模是将项放入哈希表的方法:如果表中有N个条目,请将项键转换为数字,进行mod N,然后将项放入该桶中(可能在那里保留一个链接列表)。随着哈希表的大小增加,可以重新计算键的模。

挑选随机项目

我在现实生活中使用模。真正地。我们有4个人在玩一场游戏,需要挑选一个人先去。玩mod N迷你游戏!给人们数字0、1、2和3。

现在每个人都会说“一,二,三,开枪!”并伸出任意数量的手指。把它们加起来,再除以4——谁得到余数,谁就先去。(例如:如果手指的总和是11,那么谁有“3”,谁就先去,因为11 mod 4=3)。

它速度快,效果好。

按周期运行任务

假设任务需要按特定时间表进行:

  • 任务A每小时运行3次
  • 任务B每小时运行6次
  • 任务C每小时运行1次

你如何存储这些信息并制定时间表?单向:

  • 每分钟运行一个计时器(将分钟记录为“n”)
  • 3x/小时是指每60/3=20分钟一次。因此,只要“n%20==0”,任务A就会运行
  • 只要“n%10==0”,任务B就会运行
  • 只要“n%60==0”,任务C就会运行

哦,您需要每小时运行1次的任务C1,但时间不同于任务C?当然,在“n mod 60==1”时运行它(仍然是每小时一次,但与C1不同)。

在心理上,我看到一个循环,我想在不同的间隔“击中”,所以我插入了一个mod。有趣的是,点击数可以独立重叠。在这方面,它有点像XOR(每个XOR都可以分层,但那是另一篇文章!)。

类似地,在编程时,您可以通过执行:if(n%100==0){print…}来打印每100个日志项。

这是一种非常灵活、简单的方法,可以让项目按计划运行。事实上,这是回答FizzBuzz健全性检查如果你的蝙蝠带中没有模运算,这个问题就会变得更加棘手。

查找数字的属性

假设我告诉你:

  • a=(47*2*3)

你能快速推断出什么?“a”必须是偶数,因为它等于2的乘法。

如果我还告诉你:

  • a=(39*7)

你会犹豫的。不是因为你“知道”这两种产品不同,而是因为一种显然是偶数,另一种很奇怪。有一个问题:a在两者中不能是相同的数字,因为属性不匹配.

像“偶数”、“threeven”和“mod n”这样的属性比单个数字更通用,我们可以检查它们的一致性。所以我们可以使用模来计算数字是否一致,而不需要知道它们是什么!

如果我告诉你:

  • 3a+5b=8
  • 3a+b=2

这些方程能用整数求解吗?让我们看看:

  • 3a+5b=8……让我们“修改3它”:0+2b≡2修改3,或b≡1修改3
  • 3a+b=2……让我们“mod 3 it”:0+b≡2 mod 3),或b≡2mod 3

好伙计们,这是一个禁忌!B不能同时是“1模3”和“2模3”-这就像同时是奇偶一样荒谬!

但有一个问题:像“1.5”这样的数字既不是偶数也不是奇数——它们不是整数!模属性适用于整数,所以我们可以说b不能是整数.

因为,事实上,我们可以解这个方程:

  • (3a+5b)–(3a+b)=8–2
  • 4b=6
  • b=1.5
  • 3a+1.5=2,所以3a=0.5,a=1/6

不要被模的力量所诱惑!知道它的极限:它适用于整数。

密码学

玩弄数字在密码学中有着非常重要的用途。这里涉及的内容太多了,但在Diffie-Hellman密钥交换-用于设置SSL连接以加密web流量。

简明英语

极客喜欢在常规上下文中使用技术词汇。你可能会听到“X等于Y的模Z”,这大致意味着“忽略Z,X和Y是一样的。”

例如:

  • b和b是相同的,模大写
  • iTouch和iPad的模数大小相同;)

向前和向上

思考模运算符的“效用”很奇怪,就像有人问为什么指数有用一样。在日常生活中,不是很常见,但它是一种了解世界模式并创建自己模式的工具。

总的来说,我看到了一些通用用例:

  • 范围缩小器:取一个输入,mod N,你有一个从0到N-1的数字。
  • 组赋值器:输入mod N,将其标记为从0到N-1的组。这个组可以由任意数量的参与方商定——例如,知道N=20的不同服务器可以商定ID=57属于哪个组。
  • 属性演绎:根据属性(偶数、三个偶数等)处理数字,并计算出在属性级别派生的原则

我相信我还错过了几十种用法,欢迎在下面发表评论。数学快乐!

本系列其他帖子

  1. 数字1到100的加法技巧
  2. 重新思考算术:视觉指南
  3. 快速洞察:划分的直观含义
  4. 快速洞察:减法负数
  5. 平方数中令人惊讶的图案(1、4、9、16…)
  6. 模块运算的乐趣
  7. 学习如何计数(避免击剑问题)
  8. 数字系统的古怪介绍
  9. 再看素数
  10. 黄金比率的直觉
  11. 对数字零的不同解释

加入45万月刊读者

喜欢这篇文章吗?还有很多东西可以帮助你建立对数学的持久、直观的理解。加入奖金内容和最新更新的时事通讯。