FizzBuzz是技术筛选或访谈中的分类常见的编码问题。 它是这样的: 编写一个函数来列出1到100的整数,但对于3个,写“fizz”,以及每个5倍,写入“buzz”。 对于3和5的倍数,它应该写“fizzbuzz”; 对于每个其他数字,它应该打印不变的数字。 可以编写一个函数,它根本没有任何条件逻辑,但它使用MATH将整数分成4种可能的类别:通常的解决方案作为感兴趣的读者的练习留下。 “嘶嘶声”如果$ n \ Equiv 0 \ PMOD 3 $和N是COPRIME到5 “嗡嗡声”如果$ n \ Equiv 0 \ PMOD 5 $和N是COPRIME到3 “fizzbuzz”如果$ n \ Equif 0 \ PMOD 3 $和$ N \ Equiv 0 \ PMOD 5 $ [(lambda n:{1:n,6:" fizz",10:" buzz&#34 ;, 0:" fizzbuzz"} [n ** 4%15 ])(n + 1)在范围内(100)]
正如预期的那样,这些中的每一个都将1到100的整数列表与“嘶嘶”,“嗡嗡”或“fizzbuzz”替换为正确的斑点。
但为什么?恒定值0,6,10和1来自哪里?为什么$ n ^ 4 \ mod 15 $返回倍数为3但不是5,10的倍数为5但不是3,0的倍数为5和3的倍数,否则为1?最重要的是,这对我们可能会选择的每一美元都有真实吗?
$$ n ^ 4 \ mod {15} = \ begin {is} 0,& \案文{如果$ n $可被3和5} \ newline6,&amp是可分开的; \ text {如果$ n $可被3和coprime可被划分为5} \ newline10,& \案文{如果$ n $可被5和coprime可分解为3} \ newline1,& \ Text {如果$ n $ coprime到3和5} \ of {is} $$
第一种情况是微不足道的;如果n有3和5作为因素,那么将n升高到任何电源并返回结果$ \ mod 15 $将始终为0,因为与3和5都有任何整数,因为3和5的因素也是15 $的倍数(3 * 5)$。
对于每个常数c> 0只要C是COPRIME到5。(如果C不是第5条,我们都有第一个归还0.)
开始,假设$ c = 1 $。这给了$ 3 ^ 4 \ mod 15 $,或81美元\ mod 15 $,这将返回6:15 * 5 = 75美元,剩下的剩余部分为81。
假设c是一个整数> 1.将指数应用于每个因素并使用身份$(ab)=(a + a(b - 1))$:
\ begin {对齐} 3 ^ 4c ^ 4& \ mod 15 \ newline81c ^ 4& \ mod 15 \ newline(81 + 81(c ^ 4 - 1))& \ mod 15 \结束{aligned}
考虑表达式$ C ^ 4 $的瞬间。我们从Euler的一批定理euler的一批定理中知道,$ a ^ {φ(n)} \ Equif 1(\ mod n)$ why $ a $的$ a $ of $ n $和$φ$是euler的overent函数; $ n $的全部函数返回小于$ n $的整数数量为$ n $。每次素数$ P $,$φ(p)$等于$ p - 1 $。 ⊕图leonhard euler,因为c是coprime到5,$ c ^ 4 \ mod 5 $等于1;如果$ C ^ 4/5 $的剩余部分为1,那么必须是$ C ^ 4 - 1 $均匀分裂的情况;也就是说,无论C是什么,如果它是COPRIME到5,那么$(c ^ 4 - 1)$ 5为一个因素。另一个因素并不重要,所以让我们重写$(c ^ 4 - 1)$ 5×$ $。
\ begin {对齐}(81 + 81(5倍))& \ mod 15 \ newline(81 \ mod 15 + 81(5x)\ mod 15)& \ mod 15 \ newline(6 + 81(5x)\ mod 15)& \ mod 15 \ newline6 \ mod 15 \ neg {aligh}
我们可以在(2)中重写这一点,因为模块化表达式的属性是$(a + b)\ mod n =(a \ mod n + b \ mod n)\ mod n $。
在线(3)中,表达式81(5倍)$均为3和5作为因素,因此$ 81(5倍)\ mod 15 = 0 $,这给了6 \ mod 15 $,这是6。
所以对于任何C的COPRIME到5和> 1,$ 3c ^ 4 \ mod 15 $将返回6。
相同的过程发现,$ 5c ^ 4 \ mod 15 $总是返回10;对于c = 1,我们有625美元\ mod 15 $,即10美元,因为$ c> 1 $(共同为3),我们可以写
Euler的总理定理告诉我们,如果C是COPRIME到3,那么$ C ^ 2 \ Equif 1 \ mod 3 $;但我们有$ c ^ 4 $。但是,$ c ^ 4 $是$ c ^ 2c ^ 2 $,自$ ab \ mod n =((a \ mod n)(b \ mod n))\ mod n $,$ c ^ 4 \ mod 3 $也是1。
再次,如果$ c ^ 4 \等式1(\ mod 3)$ that $(c ^ 4 - 1)$均匀地划分为3,并作为一个因素。这再次将第二个术语减少到0,留下625美元\ mod 15 $,再次是10。
这将离开我们有一些数字C的情况,这是一个与3和5的共同的c。如果c是1,则我们有1美元\ mod 15 $,即1。
如果c> 1,我们可以再次将此写入$(1 +(c ^ 4 - 1))\ mod 15 $。自从我们知道,如果C是COPRIME到3和5,并且$ C ^ 4 \ Equif 1(\ Mod 3)$和$ C ^ 4 \ Equif 1(\ Mod 5)$,然后$(C ^ 4 - 1)$均为3和5作为因素。这么做,
\ begin {对齐}(1 +(c ^ 4 - 1))& \ mod 15 \ newline(1 \ mod 15 +(c ^ 4 - 1)\ mod 15)& \ mod 15 \ newline(1 + 0)& \ mod 15 \ newline1& \ mod 15 \ newline1 \ end {aligned}
所以$ n ^ 4 \ mod 15 $将始终返回0,如果3和5是n,6如果3是一个因素,但第5个,如果5是一个因子,而不是3,如果n是foprime,则为3两个和5,以及像 - >(n){{1 => n,6 => " fizz",10 => " Buzz&#34 ;, 0 => " fizzbuzz"} [n ** 4%15]}将始终返回每一个$ n $ up的正确fizzbuzz,直到$ n ^ 4 $ of offlowed计算机使用的整数类型..
可以为任何类似的问题创建类似的功能,我将呼叫FIZZBUZZ-CATERACTION问题FIZZBUZZ-CA类问题:例如,为2,“BAR”为3,“BAZ”的倍数的倍数打印“foo”如图5所示,每个单词的连接数为2,3或5个作为因素。作为因素所选择的数字不需要是素数,但如果其中一个具有另一个因素,则某些组将不存在。例如,如果我们选择修改FizzBuzz,这样的倍数为2返回“FIST”,并且4次返回“BUZZ”(而不是传统的3和5),我们将看到2个倍数的“FIZE”,“ fizzbuzz“对于2和4的任何倍数,但我们永远不会单独看到”嗡嗡声“,因为4的倍数为4,这是一个副本的倍数。如下所示的一般解决方案并不像我暗示的那样普遍:那里很多数字对哪些是不起作用的;因此,必须更具体地选择这些因素。它将适用于不同的素数,但对于复合数字并不好。我要感谢这篇非常明确的帖子的作者,详细介绍了为什么通用公式不适用于复合数字。
其中$φ$是euler的全部函数,而lcm $ oder是最不常见的多个。
概括的是,对于任何一组$ k $因素$ n_1,n_2,.. n_k $ of我们想要一个类似的类似fizzbuzz函数,我们可以使用公式:
对于类似的类似返回“foo”的倍数,为11的倍数返回为11的倍数,查找:
$φ(7)$ 6. $φ(11)$ 10,$ 6和10的$ 6和10将是30.所以等式将是:
[(lambda n:{1:n,7 ** 30%77:" foo",11 ** 30%77:"酒吧&#34 ;, 0:" foobar&# 34;} [n ** 30%77])(n + 1)范围(100)]
[1,2,3,4,5,6,' foo&#39 ;,8,9,10,'酒吧',12,13,' foo', 15,16,17,18,19,20,' foo&#39 ;,'酒吧和#39 ;,23,24,25,26,27,' foo&#39 ;,29 ,30,31,32,'酒吧&#39 ;,34,' foo&#39 ;,36,37,38,39,40,41,' foo',43, '酒吧',45,46,47,48,' foo&#39 ;,50,51,52,53,54,'酒吧&#39 ;,' foo' foo& #39 ;,57,58,59,60,61,62,' foo&#39 ;,64,65,'酒吧&#39 ;,67,68,69,' foo&# 39;,71,72,73,74,75,76,' foobar&#39 ;,78,79,80,81,82,83,' foo&#39 ;,85,86,87 ,'酒吧和#39 ;,89,90,' foo&#39 ;,92,93,94,95,96,97,' foo&#39 ;,' bar&# 39; 100]
$$ a ^ {lcm(φ(n_1),φ(n_2),..φ(n_k))} \ Equiv \ begin {is} 0 \ pmod {\ prod_ {i = 1} ^ k n_i},& \ text {如果$ n $以每一种$ n_1,n_2,.. n_k $} \ newler_1,r_2,.r_k \ pmod {\ prod_ {i = 1} ^ k n_i},& \ text {在$ n_1,n_2,n_2,n_k $} \ newline1 \ pmod {\ prom {i = 1} ^ k n_i},& \ text {如果$ n $是每一个$ n_1,n_2,.. n_k $} \结束{is} $$
...如果数字$ n_1,n_2,则n_k $是不同的初步。 同样,感谢这篇文章的作者如此清楚地说明这一点。 作者没有断言,除了作为候选人选择的任意整数的FIZZBUZZ-CA类问题的解决方案,没有任何实际应用。