﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-f(sixleaves) = sixleaves-随笔分类-Math</title><link>http://www.cppblog.com/sixleaves/category/20957.html</link><description>重剑无锋 大巧不工</description><language>zh-cn</language><lastBuildDate>Wed, 03 Sep 2014 16:06:04 GMT</lastBuildDate><pubDate>Wed, 03 Sep 2014 16:06:04 GMT</pubDate><ttl>60</ttl><item><title>整值函数的研究和在程序中的应用</title><link>http://www.cppblog.com/sixleaves/archive/2014/09/03/208217.html</link><dc:creator>swp</dc:creator><author>swp</author><pubDate>Wed, 03 Sep 2014 07:06:00 GMT</pubDate><guid>http://www.cppblog.com/sixleaves/archive/2014/09/03/208217.html</guid><wfw:comment>http://www.cppblog.com/sixleaves/comments/208217.html</wfw:comment><comments>http://www.cppblog.com/sixleaves/archive/2014/09/03/208217.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sixleaves/comments/commentRss/208217.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sixleaves/services/trackbacks/208217.html</trackback:ping><description><![CDATA[<p><font size="3"><strong>最近写程序的时候、碰到一个问题。其实就是将celing函数用C++默认的除法运算（向下取整）表示出来。所以我打算总结下整值函数。</strong></font></p> <p><font size="3"><strong><font color="#ff0000">Firth</font>.首先我们要熟悉顶函数和底函数，最好的方式就是了解他们的图形。</strong></font></p> <p><font size="3"><strong>由于数学符号在这里不好写出来，我们用floor来表示底，celing表示顶。</strong></font></p> <p><font size="3"><strong>图形其实就是以f（x） = x 为分界线，这边就不画出来了。向下取整组成的坐标点就是（x, floor(x)）</strong></font></p> <p><font size="3"><strong>这些刚好就是在f（x） = x下方的，而向上取整则是在上方的。</strong></font></p> <p><font size="3"><strong>Tips：</strong></font></p> <p><font size="3"><strong>所以从图像中我们可以发现一下两个等式（位移、奇函数）</strong></font></p> <p><font size="3"><strong>1.x &#8211; 1 &lt; floor(x) &lt;= x &lt;= celing(x) &lt; x + 1 (可以通过位移图像来得出该不等式)</strong></font></p> <p><font size="3"><strong>2.floor(-x) = &#8211; celing(x) 或者 celing(-x) = &#8211; floor(x) （这个其实可以简单记为奇函数）</strong></font></p> <p><strong><font size="3"></font>&nbsp;</strong></p> <p><font size="3"><strong><font color="#ff0000">Second</font>.两条法则（你要细分成4条我也不反对）</strong></font></p> <p><font style="background-color: #ffffff" color="#0000ff" size="3"><strong>1.floor(x) = n 等价于 n &lt;= x &lt; n + 1 等价于 x &#8211; 1 &lt; n &lt;= x</strong></font></p> <p><font style="background-color: #ffffff" color="#0000ff" size="3"><strong>2.celing(x) = n 等价于 n - 1 &lt; x &lt;= n 等价于 x &lt;= n &lt; x + 1</strong></font></p> <p><font style="background-color: #ffffff" color="#0000ff" size="3"><strong>Tips：</strong></font></p> <p><font style="background-color: #ffffff" color="#0000ff" size="3"><strong>1.其中n是整数，x是实数</strong></font></p> <p><font style="background-color: #ffffff" color="#ff0000" size="3"><strong>2.floor（x + n） = floor（x） + n （因为有上面法则有 floor(x) + n &lt;= x + n &lt; floor(x) + n + 1）.</strong></font></p> <p><font color="#0000ff" size="3"><strong>3.但floor(nx) != n*floor(x)</strong></font></p> <p><strong><font color="#0000ff" size="3"></font>&nbsp;</strong></p> <p><font color="#000000" size="3"><strong><font color="#ff0000">Third</font>.实数和整数之间的关系，其实都等价于一个顶或底函数于整数的关系。</strong></font></p> <p><font size="3"><strong>1.x &lt; n 等价于 floor(x) &lt; n</strong></font></p> <p><font size="3"><strong>2.n &lt; x 等价于 n &lt; celing(x)</strong></font></p> <p><font size="3"><strong>3.x &lt;= n 等价于 celing(x) &lt;= n</strong></font></p> <p><font size="3"><strong>4.n &lt;= x 等价于 n &lt;= floor(x)</strong></font></p> <p><font size="3"><strong>Tips</strong></font></p> <p><font size="3"><strong>1.celing相当于扩大、floor相当于缩小</strong></font></p> <p><font size="3"><strong>2.取到n，则看能取到最大或者最小，最大取celing、最小floor。</strong></font></p> <p><font size="3"><strong>&nbsp;&nbsp; 不达n，则缩小或扩大x等式不变。</strong></font></p> <p><font size="3"><strong>3.floor(x + y) 等于 floor(x) + floor(y) 或者是 floor(x) + floor(y) + 1</strong></font></p> <p><font size="3"><strong>&nbsp;&nbsp; x = floor(x) + {x}, y = floor(y) + {y},then </strong></font></p> <p><font size="3"><strong>&nbsp;&nbsp; x + y = floor(x) + floor(y) + {x} + {y},then</strong></font></p> <p><font size="3"><strong>&nbsp;&nbsp; floor(x + y) = floor(x) + floor(y) + floor( {x} + {y}) </strong></font></p> <p><font size="3"><strong>&nbsp;&nbsp; and because&nbsp; 0&lt;={x} &lt; 1 and so do {y},so </strong></font></p> <p><font size="3"><strong>&nbsp; 0&lt;={x} + {y} &lt;2,so floor({x} + {y}) = 0 or 1</strong></font></p> <p><strong><font size="3"></font>&nbsp;</strong></p> <p><font size="3"><strong style="color: #ff0000;">应用：</strong></font></p> <p><font size="3"><strong>&nbsp;&nbsp; 在程序中应用之前，我先说下一个等式的证明</strong></font></p> <p><font size="3"><strong>&nbsp;&nbsp; celing（n / m） = floor( (n + m &#8211; 1) / m) </strong></font></p> <p><font size="3"><strong>&nbsp;&nbsp; 这里n 、m都是整数，而且m是正整数。</strong></font></p> <p><font size="3"><strong>证明：</strong></font></p> <p><font size="3"><strong>&nbsp;&nbsp;&nbsp; 因为celing(n /m) &#8211; floor(n /m) = celing（n / m &#8211; floor(n / m)）</strong></font></p> <p><font size="3"><strong>&nbsp;&nbsp;&nbsp; = celing(1/m * ( n &#8211; m*floor(n / m))) = celing((n mod m) / m)-------------(1)利用了上面两条法则中Tips的第二点</strong></font></p> <p><font size="3"><strong>&nbsp;&nbsp;&nbsp;&nbsp; 同理可以得出floor((n + m &#8211;1) /m) = floor((n mod m + m &#8211; 1) / m)---------- (2)</strong></font></p> <p><font size="3"><strong>&nbsp;&nbsp; 由(1)可以得到celing((n mod m )/ m) = 1</strong></font></p> <p><font size="3"><strong>&nbsp;&nbsp; 由(2)可以得到floor((n mod m + m &#8211; 1) / m) = 1 (因为n mod m + m &#8211; 1 &lt; 2 *m &#8211;1)</strong></font></p> <p><font size="3"><strong>&nbsp;&nbsp; 所以可以一步步向上反推得到上面的公式。（其实这是一种分而自治的证明思想）<br /></strong></font></p> <p><font size="3"><strong> 具体在程序中的应用例如：</strong></font></p> <p><font size="3"><strong> 当你要在C++中写如下代码时候，而且n 、m都是整数。</strong></font></p> <p><font size="3"><strong> 则celing(n * 1.0 / m) = floor( (n &#8211; 1) / m) + 1</strong></font></p> <p><font size="3"><strong> </strong><strong style="color: #0000ff;">由于C++中除运算就是向下取整，所以</strong></font></p> <p><font size="3"><strong style="color: #0000ff;">celing(n * 1.0 / m) = (n - 1) / m + 1<br />那么什么地方用得到，比如你在做大数运算时侯，要进行，分组，要8位一组<br />然后算出一个可以分成几组。可以直接利用这个原理，而不用再其进行函数的<br />调用，比如你在阅读人家的代码时候、有时候就会这样写。<br /></strong></font></p> <p><font size="3"><strong>下次你碰到这种代码就会知道什么意思，和为什么能表示成这样了。</strong></font></p><img src ="http://www.cppblog.com/sixleaves/aggbug/208217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sixleaves/" target="_blank">swp</a> 2014-09-03 15:06 <a href="http://www.cppblog.com/sixleaves/archive/2014/09/03/208217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>映射的概念</title><link>http://www.cppblog.com/sixleaves/archive/2014/08/29/208182.html</link><dc:creator>swp</dc:creator><author>swp</author><pubDate>Fri, 29 Aug 2014 15:44:00 GMT</pubDate><guid>http://www.cppblog.com/sixleaves/archive/2014/08/29/208182.html</guid><wfw:comment>http://www.cppblog.com/sixleaves/comments/208182.html</wfw:comment><comments>http://www.cppblog.com/sixleaves/archive/2014/08/29/208182.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sixleaves/comments/commentRss/208182.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sixleaves/services/trackbacks/208182.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt;">由于是数学，所以要严谨。我们对于映射的概念直接摘抄来自同济大学的高数课本。</span><br /><span style="color: red; font-size: 12pt;"><strong>映射的概念：</strong></span><br /><span style="font-size: 12pt;">设X和Y是两个</span><span style="color: #008000; font-size: 12pt;">非空的</span><span style="font-size: 12pt;">集合。存在一个法则T，使得X中的每个元素x按照法则T，在Y中都有一个唯一元素y与之对应。</span><br /><span style="font-size: 12pt;">那么T就称为X到Y的映射。记为T：X--&gt;Y</span><span style="color: #339966; font-size: 12pt;">.<br /></span><span style="font-size: 12pt;">（1）X称为T的定义域、Y称为T的值域。而且y称为x的像，x称为原像。<br /></span><span style="font-size: 12pt;">（2）函数、算子、都是映射的别名。<br /></span><span style="color: #ff0000; font-size: 12pt;"><strong>Tips：</strong></span><span><br /></span><strong><span style="color: #008000; font-size: 12pt;">为了更好的理解、其实学过图论，就很好理解、可以把X看成起始点集合、Y看成终点集合、那么映射就是从起始点出发、都只有一条路径可以到对应的达终点（也就是说如果存在从某个起始点有两条路径可以到达不同的两个终点，就不叫映射）。<br /></span><span style="color: #008000; font-size: 12pt;">所以<span style="color: #008000; font-size: 12pt;">所谓的</span></span><span style="color: #008000; font-size: 12pt;">像<span style="color: #008000; font-size: 12pt;">就是终点、原像就是起始点。<br /></span></span></strong><span style="color: #339966;"><br /></span><span style="color: #ff0000; font-size: 12pt;"><strong>满射、单射、一一映射：<br /></strong></span><span style="color: #008000; font-size: 12pt;"><strong>满射：在映射的概念下，不存在孤立的终点。(就相当于很多小岛，分为左右两半。左边的每个小岛都只有一座桥到达右边的一个小岛，不存在其它桥可以在去其它小岛，然后右边的小岛都有桥连接，这就叫满射)。<br />单射：单射就是不存在两个左边的小岛可以和右边的同一座小岛建立了桥。</strong></span><span style="color: #339966;"></span><span style="color: #339966;"><br /></span><strong style="color: #008000; font-size: 12pt;">一一映射：同时满足以上两个</strong><br style="font-size: 12pt;" /><span style="font-size: 12pt;">严谨的数学定义：<br /></span><span style="color: #000000; font-size: 12pt;">设T是集合X到Y的映射，诺T(X)=Y，即Y中任一元素均是X中某元素的像，则陈T为X到Y上的满射。<br /></span><span style="color: #000000; font-size: 12pt;">对任意x1、x2属于X，x1 &lt;&gt;x2,必定有T（x1）&lt;&gt;T（x2），</span><span style="color: #000000; font-size: 12pt;">则陈T为X到Y上的单射。<br />一一映射：满足以上两个。<br /><br /></span><span style="color: #ff0000; font-size: 12pt;"><strong>逆映射、复合映射：<br /></strong></span><span style="color: #000000; font-size: 12pt;">这两个的数学定义就不讲了、去翻翻高数课本。主要总结下从离散化的图来理解的角度。<br /></span><strong style="color: #008000; font-size: 12pt;">逆映射：也就是在一一映射的基础下，反客为主。把起始点变成终点、终点变成起始点。<br />复合映射：复合映射说的是在映射的基础下、对于第三方岛屿、右边的岛屿都有建桥到第三方的岛屿（右映射到第三方，但第三方可能存在孤岛）。则我们就可以把右边看作中间点、左边的岛屿也都有到第三方岛屿的路径。（左边映射到第三方</strong><strong style="color: #008000; font-size: 12pt;">，但第三方可能存在孤岛</strong><br style="font-size: 12pt;" /><strong style="color: #008000; font-size: 12pt;">）<br /></strong><span style="font-size: 12pt;">数学记号：</span><br style="font-size: 12pt;" /><span style="font-size: 12pt;">映射T的逆映射记为T(-1)(y) = x.</span><br style="font-size: 12pt;" /><span style="font-size: 12pt;">T1、T2两个映射复合映射记为：T2 。T1</span><br style="font-size: 12pt;" /><span style="font-size: 12pt;">上面句号是在正中间. </span><img src ="http://www.cppblog.com/sixleaves/aggbug/208182.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sixleaves/" target="_blank">swp</a> 2014-08-29 23:44 <a href="http://www.cppblog.com/sixleaves/archive/2014/08/29/208182.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>