回忆一下初中数学,才发现自己并学到的东西很有限,初中的很多东西只是简单的涉及。最近又回到了初中的知识上,总结了一些在数学上自己发现和简单推理的东西。
一、勾股定理
很多人都知道勾股定理,也能够顺利的证明出来,毕竟课本上提供了很多用四边形证明的方法,不过如果给出一个圆和一个直角三角形,能证明吗?答案是肯定的,这个相信很多人在初中的时候就已经发现了(我是在学圆的时候偶然发现的)。
在这个三角形中,我们设圆的半径为r,即EO=DO=FO=r,AC=a,BC=b,AB=c。
我们都知道r可以用a、b、c表示出来,用面积法可以轻易得出r=ab/(a+b+c);利用圆的切线的性质可以轻易得出r=(a+b-c)/2。
将这两个式子相等,可以推出a^2+b^2=c^2。并且在证明过程中没有用到与勾股定理有关的推论或者它本身,所以我们就可以把这个当做是一个正确的证明方法了。
二、抛物线
(1)、 不知道有多少人和我一样,在初中的学习中一直没有弄明白抛物线的定义,便开始使用了。到了高中,还是新华词典告诉我什么是抛物线:到定点和定直线的距离相等的点的集合。
对于一条对称轴垂直于x轴的抛物线,我们可以进行一些下面简单的推论。
我们先从反面进行验算:
再把情况放的特殊点,设抛物线解析式y=ax^2+c(a<>0),那么我们就可以把定直线看做x轴,定点坐标为 M(0,2c)。设抛物线上的点坐标为P(t,at^2+c),s1为点P到x轴的距离,s2为线段PM的长度。s1=at^2+c,
s2=(t^2+(2c-at^2-c)^2)^(1/2),中间的化简过程就不在写出了。s1^2=a^2t^4+c^2+2act^2,s2^2=(1-2ac)t^2+a^2t^4+c^2,比较s1和s2我们可以看到(1-2ac)t^2=2act^2 ∴c=1/(4a)
所以y=ax^2+(1/(4a)),所以定点的坐标就是(0,1/(2a)),定直线就是x轴。
把这条抛物线平移,就可以的得到任意一条抛物线y=ax^2+bx+c(a<>0)所对应的定点(-b/(2a),(4ac-b^2+1)/(4a)),定直线的解析式为y=((4ac-b^2-1)/(4a))。
我们回到原来的定义,对于一个定点(p,q)和定直线y=t(在这里,我们为了简化,就只看定直线平行于x轴的情况),我们可以的到抛物线的解析式为y=(1/(2q-2t))x^2+(p/(t-q))x+((p^2+q^2-t^2)/(2q-2t))。
这样,对于对称轴垂直于y轴的情况也可以将x、y互换得到,当然也可以将坐标轴中y轴与抛物线的对称轴平行建立,然后进行一些旋转就可以了,虽然y不再是x的函数,但是x、y之间的关系也可以表示出来。
对于一条抛物线,经过焦点(也就是之前所说的定点)的光线(数学中的直线)经抛物线反射后一定是与对称轴平行的。
(2)、应用:最后,我们来看一个神奇的物理学上抛物线的应用。
我们都知道,自行车灯用互相垂直的两个平面镜,就能将入射光平行射出。对于一些车灯,它们的灯罩显然不是两个互相垂直的平面镜这么简单,有的是一个抛物线绕着对称轴旋转而成的空间图形,我们这里利用以上的性质就可以发现,这样的灯光散射的少,也就能使光更加的明亮集中。
证明如下:在抛物线y=ax^2+(1/(4a))(a<>0)中,取点P(t,at^2+(1/(4a))),我们从这点向x轴做垂直,垂足为C,抛物线焦点M(0,1/(2a)),P点处抛物线的切线与y轴的交点为D,则这条切线的解析式y=2atx+1/(4a)-at^2(这条直线解析式的k值就是抛物线在P点处的斜率),那么D点坐标就是(0,1/(4a)-at^2),MD=MP=PC,且MD∥PC,所以四边形MDCP就是一个菱形,从而过M点的反射时法线的平行线(也就是过M点的切线的垂线)平分角DMP,从而反射光线和入射光线之间的夹角的大小就等于角DMP,从而证明了反射光线与y轴平行。
三、pick定理
(1)内容:对于一个顶点都在格点上的多边形,I表示多边形内的格点个数,B表示多边形边上的格点个数,那么这个多边形的面积s=I+B/2-1。
(2)证明:(我们的证明分为两部分)
①我们首先证明在该定理成立的条件下,合并两个简单多边形是否成立。设两个多边形为a、b,边界上有格点c。
Sa=Ia+Ba/2-1,Sb=Ib+Bb/2-1。
Sab=Sa+Sb=Ia+Ib+(Ba+Bb)/2-2;(上两式相加即可)
Sab=(Ia+Ib+(c-2))+(Ba+Bb-2*(c-2)-2)/2-1=Ia+Ib+(Ba+Bb)/2-2;(套用该定理)
对多边形进行分割的证明也是成立的。
②严格来说,这里才是该定理的证明部分:我们先证明边平行于轴的矩形、再证明对角线分开的三角形、再推广到普通的三角形。
对于边平行于轴的矩形:设边上的格点为m、n个。S=(m-1)(n-1)=mn-n-m+1=(m-2)(n-2)+(2(m+n)-4)/2-1,最后一个式子正好就是pick定理的内 容,因此该部分证毕;
对于对角线分开的三角形:设对角线上有格点c个。S=(m-1)(n-1)/2=mn/2-n/2-m/2+1/2=((m-2)(n-2)-(c-2))/2+(m+n+c-3)/2-1,同上,该部分证毕。
对于普通的三角形,我们可以用前两种情况分割得到,根据①中的证明,我们可以进行这样的分割和合并。
有了普通三角形的成立,我们就可以推广到普通多边形了(每一个多边形都可以划分为多个三角形)。
(3)应用:①在平面直角坐标系中,我们作直线x+y=q(q是质数),这条直线穿过第一象限的q-1个格点,连接这q-1个格点和原点,得到q-2个三角形,这些三角形内的格点是一样的。这么神奇的事实怎么证明呢?这些三角形的面积S相等,同时因为x+y=q,所以x,y互质(如果不互质就有公约数d(d>1)),q就不是素数了),所以边上都只有三个顶点,根据pick定理,就有内部的点数相等了。
②对于一个n*m的矩形,最多能覆盖多少个格点(包括边上的)。B<=2(m+n),I+B=I+B/2-1+B/2+1<=n*m+2(m+n)/2+1=(m+1)(n+1),所以最多就是矩形边和轴平行时,覆盖(m+1)(n+1)。
仅考虑边上的点的话,很明显有0<=B<=2(m+n)。
如果不包括边上的,0=>-B>=-2(m+n),I=I+B/2-1-B/2+1>=n*m-(m+n)+1=(m-1)*(n-1),且<=mn+1。所以当多边形与轴平行的时候,内部的点最少,(m-1)(n-1);当边界上没有点的时候(平行的左右上下抖动一下),内部的点最多,为mn+1个。
③下面介绍一个非常神奇的定理证明:Farey数列中,前一项分母*后一项分子-后一项分母*前一项分子=1。
首先,我们了解一下什么叫Farey数列。我们将0~1中分母不大于k的最简分数从小到大列在一起,记做F_k。
如F_5:0/1,1/5,1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5, 1/1
下面我们考虑用pick定理证明这个定理。
我们把这些分数放到平面直角坐标系中,如m/n记做(n,m)。我们考虑相邻两个分数对应的点,这两个点与原点的连线上一定没有别的点(因为最简分数的要求),那么这个阴影部分三角形的面积S=0+3/2-1=1/2,设这两个点分别是(n,m)(q,p)(沿斜率增大方向),根据叉积=np-mq=2S可以知道,np-mq=1,正好就是我们的定理。
(以上应用内容引用自http://www.matrix67.com/blog/archives/2199)
(4)既然说到了格点上的问题,我们来点有趣的小实验。
在一张白纸上给出面积小于1的一块图形(可能不规则,十分不规则),能否做出一些格点,使这个图形不经过格点。
不防做一些图形感受一下。其实做法很简单:我们随便做一些格,把他们沿格线撕开,叠到一起,把纸当做透明的,从上面看下去,一定会有一点没有图形(因为总面积小于1),所以我们可以用个针从这一点扎下去,然后将图形复原,以这些针孔为格点做一些格,就会发现这个图形并没有经过格点。
(5)和oi有点联系:(a,b)(m,n)两点连线段上整点数有gcd(m-a,n-b)+1(m>=a,n>=b)。证明方法如下:如果(m-a,n-b)=1,那么就是0个;如果(m-a,n-b)!=1就把它缩小gcd(m-a,n-b)到互质,这时候线段上只有两个点,然后相应的放大gcd(m-a,n-b),就有如上的个数了。
练习:poj2954&&poj1265
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cmath> #define maxnode 3 using namespace std; struct use{ int xi,yi; }p[5]={0}; int cross(int i) { return ((p[i].xi-p[1].xi)*(p[i+1].yi-p[1].yi)-(p[i].yi-p[1].yi)*(p[i+1].xi-p[1].xi)); } double area() { int i,j,aa; aa=abs((double)cross(2)); return (double)aa*1.0/2; } int gcd(int a,int b) { if (!b) return a; else return gcd(b,a%b); } int main() { int i,j; double s,b; while(scanf("%d%d%d%d%d%d",&p[1].xi,&p[1].yi,&p[2].xi,&p[2].yi,&p[3].xi,&p[3].yi)==6) { j=0; for (i=1;i<=3;++i) { if (p[i].xi==0) ++j; if (p[i].yi==0) ++j; } if (j==6) break; s=area(); b=gcd((int)abs((double)p[1].xi-p[2].xi),(int)abs((double)p[1].yi-p[2].yi))+ gcd((int)abs((double)p[2].xi-p[3].xi),(int)abs((double)p[2].yi-p[3].yi))+ gcd((int)abs((double)p[1].xi-p[3].xi),(int)abs((double)p[1].yi-p[3].yi)); i=(int)(s+1-b*1.0/2); printf("%d ",i); } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cmath> #define maxnode 500 using namespace std; struct use{ int xi,yi; }p[maxnode]={0}; int corss(int i) { return ((p[i].xi-p[1].xi)*(p[i+1].yi-p[1].yi)-(p[i].yi-p[1].yi)*(p[i+1].xi-p[1].xi)); } double area(int n) { int i,a=0; for (i=2;i<n;++i) a+=corss(i); return a*1.0/2.0; } int gcd(int a,int b) { if (!b) return a; else return gcd(b,a%b); } int main() { int t,n,i,j,I,B; double S; scanf("%d",&t); for (j=1;j<=t;++j) { S=0.0;B=I=0; scanf("%d",&n); for (i=1;i<=n;++i) { scanf("%d%d",&p[i].xi,&p[i].yi); B+=gcd((int)abs((double)p[i].xi),(int)abs((double)p[i].yi)); if (i>1) { p[i].xi+=p[i-1].xi;p[i].yi+=p[i-1].yi; } } S=area(n);if (S<0) S=-S; I=(int)(S-B*1.0/2+1); printf("Scenario #%d: %d %d %0.1f ",j,I,B,S); } }