Pick定理的几个出人意料的应用(转载自Matrix67)

2019-03-02 23:44|来源: 网路

Pick定理的几个出人意料的应用

icon2  Brain Storm |  icon4 2009-08-10 1:34|  icon331 Comments | 本文内容遵从 CC版权协议 转载请注明出自matrix67.com

   

    考虑直线x+y=n,其中n是一个素数。这条直线将恰好通过第一象限里的n-1个格点(如上图,图中所示的是n=11的情况)。将这n-1个点分别和原点相连,于是得到了n-2个灰色的三角形。仔细数数每个三角形内部的格点数,你会发现一个惊人的事实:每个三角形内部所含的格点数都是一样多。这是为什么呢?


   

    Pick定理是说,在一个平面直角坐标系内,如果一个多边形的顶点全都在格点上,那么这个图形的面积恰好就等于边界上经过的格点数的一半加上内部所含格点数再减一。例如,上图多边形的边界上有8个格点,内部含有7个格点,那么其面积就等于8/2+7-1=10。我们曾经在这里看到过一个非常神奇非常诡异的证明。这个定理有一些非常巧妙的应用。在上面的问题里,所有三角形都是等底等高的,因此它们的面积都相等。另外,注意到x与y的和是一个素数,这表明x和y是互素的(否则x+y可以提出一个公因数d,与和为素数矛盾),也就是说(x,y)和原点的连线不会经过其它格点。既然所有三角形的面积都相等,边界上的格点数也相等,由Pick定理,我们就能直接得出每个三角形内部的格点数也相等了。

    另一个有趣的问题则是,一个n*n的正方形最多可以覆盖多少个格点?把这个正方形中规中矩地放在直角坐标系上,显然能够覆盖(n+1)^2个格点。貌似这已经是最多的了,不过如何证明呢?利用Pick定理,我们能够很快说明它的最优性。注意到由于任两个格点间最近也有一个单位的间距,再考虑到正方形的周长为4n,因此该正方形的边界上最多有4n个格点。把正方形边界上的格点数记作B,内部所含格点数记为I,于是它所能覆盖的总格点数等于I+B,由于I+B = I+B/2-1 + B/2+1 ≤ n^2 + 4n/2 + 1 = (n+1)^2,结论立即得证。

    一个东西最出神入化的运用还是见于那些与它八杆子打不着的地方。Farey序列是指把在0到1之间的所有分母不超过n的分数从小到大排列起来所形成的数列,我们把它记作F_n。例如,F_5就是

0/1, 1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5, 1/1

   

    Farey序列有一个神奇的性质:前一项的分母乘以后一项的分子,一定比前一项的分子与后一项分母之积大1。用Pick定理来证明这个结论异常简单。把分母不超过n的每一个0和1之间的分数都标在平面直角坐标系上,例如0/1就对应点(1,0),1/5就对应点(5,1)。考虑一根从原点出发的射线由x轴正方向逆时针慢慢转动到y轴正方向,这根射线依次扫过的标记点恰好就是一个Farey序列(因为Farey序列相当于是给每个标记点的斜率排序)。考虑这根射线扫过的两个相邻的标记点,它们与原点所组成的三角形面积一定为1/2——由于分数都是最简分数,因此它们与原点的连线上没有格点;又因为这是射线扫过的两个相邻的标记点,因此三角形内部没有任何格点。另外注意到,由于三角形面积等于叉积的一半,因此两个点(m,n)和(p,q)与原点组成的三角形面积应该为(mq-np)/2。于是,对于Farey序列的两个相邻分数n/m和q/p,我们有(mq-np)/2 = 1/2,即mq-np=1。

来源:
http://www.cut-the-knot.org/ctk/PickApps.shtml
http://www.cut-the-knot.org/ctk/PickToFarey.shtml


转自:http://www.cnblogs.com/oucacm/articles/3286797

相关问答

更多
  • Switch不是一堆ifs。 它更类似于if {} else if {}构造,但有几个曲折 - 即break和fallthrough 。 切换执行第一种和第三种情况是不可能的 - 交换机不检查每个条件,它找到第一个匹配并执行它。 就这样。 它的主要目的是遍历可能值的列表并为每个值执行不同的代码。 实际上,在C(其中switch语句来自)中,switch表达式只能是整数类型,case case值只能是switch表达式也将被比较的常量。 仅在最近,语言开始在交换机情况下添加对字符串,布尔表达式等的支持。 至于 ...
  • 使用批量程序(* .bat)时使用%%A 尝试删除一个'%' %%A is used when you use a batch program (*.bat) try remove one '%'
  • 对不起,我对python一无所知,但在cmd你的引号有问题。 更改命令中的引号以使用双引号而不是单引号。 单引号在cmd中不被识别为有效引用,因此,命令中的字符<和>是从引用的字符串中找到的,并被视为命令的一部分,即重定向 command = r'confluence --action storePage --space "EN" --title "csoap-235" --parent "@home" --special " # ~" --content "

  • CharSequence是一个interface 。 因此,即使SomeClass不实现CharSequence ,也可以创建一个类 class SubClass extends SomeClass implements CharSequence 所以你可以写 SomeClass c = getCharSequence(); 因为推断的类型X是交叉类型SomeClass & CharSequence 。 在Integer的情况下,这是有点奇怪,因为Integer是最后的,但final在这些规则中不起任何 ...
  • static表示变量属于整个类,而不是具有该变量的类的每个实例。 final表示值是常量且无法更改。 基本上这意味着它是一个整数,对于某个类的所有实例始终是常量。 static means that instead of each instance of the class having that variable, the variable belongs to the class as a whole. final means that the values are constant and canno ...
  • 使用日历进行日期算术 Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, 2013); c.set(Calendar.MONTH, Calendar.JANUARY); c.set(Calendar.DATE, 1); c.set(Calendar.HOUR, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); c.s ...
  • 如果输入带有set/p的字符串,则不会说输入的数据不包含Spaces 。 克服这种情况的方法是"enclose the strings on both sides of the comparison operator in quotes" - 也就是说,双引号'not single quotes' IF语法是string1运算符string2的动作。 你需要 if "%possiblyemptyvariable%"=="1" goto ... If you are entering a string w ...
  • 你似乎有两个问题。 您对res / layout / view_about.xml存在权限问题。 您应该检查并更正该文件的权限。 Git有一个锁文件。 如果没有其他git进程正在运行,请按照错误消息中的说明删除锁定文件。 一旦你做了这两件事,你应该回到一个可以自由切换分支的状态。 一旦你能做到这一点,你可以使用“git reset --hard ”将分支重置为先前的提交,其中是要返回的提交的ID。 请注意,此命令具有破坏性 - 它将执行您所说的操作,并使您的工作目录看起来像提交时的状 ...
  • 用REM替换你的:: comments应该有效。 你可以使用::但是你需要知道括号中标签的两行规则 Replace your :: comments with a REM and it should work. You could use :: but then you need to know the two lines rule of Labels in parenthesis
  • 发现了问题。 对于变量必须是单字母变量。 此代码有效: for /f %P in ('dir %1 /s /b /a-d /o:gn') do echo %P Found the problem. For variable must to be one-letter variable. This code works: for /f %P in ('dir %1 /s /b /a-d /o:gn') do echo %P