Files
rappaurio-sae501_502/app/node_modules/cejs/_documents/JsDoc/symbols/src/D__USB_cgi-bin_lib_JS_math.origin.js.html
2023-09-25 13:27:24 +02:00

732 lines
152 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<html><head><meta http-equiv="content-type" content="text/html; charset=UTF-8"> <style>
.KEYW {color: #933;}
.COMM {color: #bbb; font-style: italic;}
.NUMB {color: #393;}
.STRN {color: #393;}
.REGX {color: #339;}
.line {border-right: 1px dotted #666; color: #666; font-style: normal;}
</style></head><body><pre><span class='line'> 1</span> <span class="TOKN"></span><span class="WHIT">
<span class='line'> 2</span> </span><span class="COMM">/**
<span class='line'> 3</span> * @name CeL function for math
<span class='line'> 4</span> * @fileoverview
<span class='line'> 5</span> * 本檔案包含了數學相關的 functions。
<span class='line'> 6</span> * @since
<span class='line'> 7</span> */</span><span class="WHIT">
<span class='line'> 8</span>
<span class='line'> 9</span> </span><span class="COMM">/*
<span class='line'> 10</span> TODO:
<span class='line'> 11</span> 大數計算
<span class='line'> 12</span> 方程式圖形顯示 by SVG
<span class='line'> 13</span> */</span><span class="WHIT">
<span class='line'> 14</span>
<span class='line'> 15</span>
<span class='line'> 16</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">CeL</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'function'</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'> 17</span>
<span class='line'> 18</span> </span><span class="COMM">/**
<span class='line'> 19</span> * 本 module 之 name(id)&lt;span style="text-decoration:line-through;">不設定時會從呼叫時之 path 取得&lt;/span>。
<span class='line'> 20</span> * @type String
<span class='line'> 21</span> * @constant
<span class='line'> 22</span> * @inner
<span class='line'> 23</span> * @ignore
<span class='line'> 24</span> */</span><span class="WHIT">
<span class='line'> 25</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">module_name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="STRN">'math'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'> 26</span>
<span class='line'> 27</span> </span><span class="COMM">//===================================================</span><span class="WHIT">
<span class='line'> 28</span> </span><span class="COMM">/**
<span class='line'> 29</span> * 若欲 include 整個 module 時,需囊括之 code。
<span class='line'> 30</span> * @type Function
<span class='line'> 31</span> * @param {Function} library_namespace namespace of library
<span class='line'> 32</span> * @param load_arguments 呼叫時之 argument(s)
<span class='line'> 33</span> * @return
<span class='line'> 34</span> * @name CeL.math
<span class='line'> 35</span> * @constant
<span class='line'> 36</span> * @inner
<span class='line'> 37</span> * @ignore
<span class='line'> 38</span> */</span><span class="WHIT">
<span class='line'> 39</span> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">code_for_including</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">library_namespace</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">load_arguments</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'> 40</span>
<span class='line'> 41</span> </span><span class="COMM">// requires</span><span class="WHIT">
<span class='line'> 42</span> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">eval</span><span class="PUNC">(</span><span class="NAME">library_namespace.use_function</span><span class="PUNC">(</span><span class="WHIT">
<span class='line'> 43</span> </span><span class="WHIT"> </span><span class="STRN">'data.split_String_to_Object'</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'> 44</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'> 45</span>
<span class='line'> 46</span>
<span class='line'> 47</span> </span><span class="COMM">/**
<span class='line'> 48</span> * null module constructor
<span class='line'> 49</span> * @class 數學相關的 functions
<span class='line'> 50</span> */</span><span class="WHIT">
<span class='line'> 51</span> </span><span class="NAME">CeL.math</span><span class="WHIT">
<span class='line'> 52</span> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'> 53</span> </span><span class="WHIT"> </span><span class="COMM">// null module constructor</span><span class="WHIT">
<span class='line'> 54</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'> 55</span>
<span class='line'> 56</span> </span><span class="COMM">/**
<span class='line'> 57</span> * for JSDT: 有 prototype 才會將之當作 Class
<span class='line'> 58</span> */</span><span class="WHIT">
<span class='line'> 59</span> </span><span class="NAME">CeL.math</span><span class="WHIT">
<span class='line'> 60</span> </span><span class="PUNC">.</span><span class="NAME">prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'> 61</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'> 62</span>
<span class='line'> 63</span>
<span class='line'> 64</span>
<span class='line'> 65</span>
<span class='line'> 66</span>
<span class='line'> 67</span> </span><span class="COMM">/*
<span class='line'> 68</span> Math ---------------------------------------------------------------
<span class='line'> 69</span> */</span><span class="WHIT">
<span class='line'> 70</span>
<span class='line'> 71</span> </span><span class="COMM">/*
<span class='line'> 72</span> //{var v=Math.LN2,d=mutual_division(v),q=to_rational_number(v);alert('值 '+v+'\n序列 '+d+'\n近似值 '+q[0]+' / '+q[1]+'\n約 '+(q=q[0]/q[1])+'\n值-近似 '+(q-=v)+'\n差'+(Math.abs(q=10000*q/v)>1?'萬分之'+q.to_fixed(2)+' ( '+q+' / 10000 )':'億分之'+(q*=10000).to_fixed(2)+' ( '+q+' / 100000000 )'),0,'近似值 '+v);}
<span class='line'> 73</span>
<span class='line'> 74</span> //{var d=new Date,a=.142857,b=1000000,i=0,c;for(i=0;i&lt;10000;i++)c=mutual_division(a);alert(c+'\n'+gDate(new Date-d));}
<span class='line'> 75</span> */</span><span class="WHIT">
<span class='line'> 76</span>
<span class='line'> 77</span> </span><span class="NAME">CeL.math</span><span class="WHIT">
<span class='line'> 78</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'> 79</span> </span><span class="COMM">/**
<span class='line'> 80</span> * 輾轉相除 n1/n2 或 小數 n1/1 轉成 整數/整數
<span class='line'> 81</span> * @param {Number} n1 number 1
<span class='line'> 82</span> * @param {Number} [n2] number 2
<span class='line'> 83</span> * @param {Number} times max 次數, 1,2,..
<span class='line'> 84</span> * @return {Array} 連分數序列 ** 負數視 _.mutual_division.done 而定!
<span class='line'> 85</span> */</span><span class="WHIT">
<span class='line'> 86</span> </span><span class="NAME">mutual_division</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">mutual_division</span><span class="PUNC">(</span><span class="NAME">n1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">n2</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">times</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'> 87</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">q</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'> 88</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">isNaN</span><span class="PUNC">(</span><span class="NAME">times</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">times</span><span class="WHIT"> </span><span class="PUNC">&lt;=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'> 89</span> </span><span class="WHIT"> </span><span class="NAME">times</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">80</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'> 90</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">n2</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">isNaN</span><span class="PUNC">(</span><span class="NAME">n2</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'> 91</span> </span><span class="WHIT"> </span><span class="NAME">n2</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'> 92</span>
<span class='line'> 93</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">n1</span><span class="WHIT"> </span><span class="PUNC">!=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">n1</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'> 94</span> </span><span class="WHIT"> </span><span class="NAME">c</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">n1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'> 95</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">9</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">f</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">n2</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'> 96</span> </span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="PUNC">--</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'> 97</span> </span><span class="WHIT"> </span><span class="COMM">// 以整數運算比較快這樣會造成整數多4%浮點數多1/3倍的時間但仍值得。</span><span class="WHIT">
<span class='line'> 98</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">f</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">10</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">c</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">10</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">c</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">c</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'> 99</span> </span><span class="WHIT"> </span><span class="NAME">n1</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">n2</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">f</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>100</span> </span><span class="WHIT"> </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>101</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>102</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>103</span>
<span class='line'>104</span> </span><span class="WHIT"> </span><span class="COMM">// 連分數負數之處理。更沒問題的: (n1 &lt; 0?1:0) ^ (n2 &lt; 0?1:0)</span><span class="WHIT">
<span class='line'>105</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">_.mutual_division.mode</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">n1</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">^</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">n2</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>106</span> </span><span class="WHIT"> </span><span class="COMM">// 使兩數皆為正</span><span class="WHIT">
<span class='line'>107</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">n2</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>108</span> </span><span class="WHIT"> </span><span class="NAME">n2</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NAME">n2</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>109</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>110</span> </span><span class="WHIT"> </span><span class="NAME">n1</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NAME">n1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>111</span>
<span class='line'>112</span> </span><span class="WHIT"> </span><span class="NAME">q.push</span><span class="PUNC">(</span><span class="PUNC">-</span><span class="PUNC">(</span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">n1</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">c</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">n1</span><span class="WHIT"> </span><span class="PUNC">%</span><span class="WHIT"> </span><span class="NAME">n2</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">n2</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>113</span> </span><span class="WHIT"> </span><span class="NAME">n1</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">n2</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">n2</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>114</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>115</span>
<span class='line'>116</span> </span><span class="WHIT"> </span><span class="COMM">/* old:
<span class='line'>117</span> while(b&&n--)
<span class='line'>118</span> d.push((a-(c=a%b))/b),a=b,b=c; // 2.08s@10000 可能因為少設定(=一次c所以較快。但若輸入不為整數不確保d為整數用Math.floor((a-(c=a%b))/b)可確保,速度與下式一樣快。
<span class='line'>119</span> //d.push(c=Math.floor(a/b)),c=a-b*c,a=b,b=c; // 2.14s@10000:mutual_division(.142857)
<span class='line'>120</span> //d.push(Math.floor(a/b)),b=a%(c=b),a=c; // 2.2s@10000
<span class='line'>121</span> //if(n)d.push(0);
<span class='line'>122</span> */</span><span class="WHIT">
<span class='line'>123</span>
<span class='line'>124</span> </span><span class="WHIT"> </span><span class="COMM">// 2.4s@10000 可能因為少設定(=一次c所以較快。但若輸入不為整數不確保d為整數用Math.floor((a-(c=a%b))/b)可確保,速度與下式一樣快。</span><span class="WHIT">
<span class='line'>125</span> </span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">times</span><span class="PUNC">--</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>126</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">n2</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>127</span> </span><span class="WHIT"> </span><span class="NAME">q.push</span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">n1</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">c</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">n1</span><span class="WHIT"> </span><span class="PUNC">%</span><span class="WHIT"> </span><span class="NAME">n2</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">n2</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">n1</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">n2</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">n2</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">c</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>128</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>129</span> </span><span class="WHIT"> </span><span class="COMM">// [ .. , done mark, (最後非零的餘數。若原 n1, n2 皆為整數,則此值為 GCD。但請注意:這邊是已經經過前面為了以整數運算,增加倍率過的數值!!) ]</span><span class="WHIT">
<span class='line'>130</span> </span><span class="WHIT"> </span><span class="NAME">q.push</span><span class="PUNC">(</span><span class="NAME">_.mutual_division.done</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">n1</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>131</span> </span><span class="WHIT"> </span><span class="COMM">//library_namespace.debug('done: ' + q);</span><span class="WHIT">
<span class='line'>132</span> </span><span class="WHIT"> </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>133</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>134</span>
<span class='line'>135</span> </span><span class="WHIT"> </span><span class="COMM">// 2.26s@10000</span><span class="WHIT">
<span class='line'>136</span> </span><span class="WHIT"> </span><span class="COMM">//while(b&&n--)if(d.push((a-(c=a%b))/b),a=b,!(b=c)){d.push(0);break;}</span><span class="WHIT">
<span class='line'>137</span>
<span class='line'>138</span> </span><span class="WHIT"> </span><span class="COMM">//var m=1;c=1;while(m&&n--)d.push(m=++c%2?b?(a-(a%=b))/b:0:a?(b-(b%=a))/a:0);//bug</span><span class="WHIT">
<span class='line'>139</span>
<span class='line'>140</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">q</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>141</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>142</span> </span><span class="NAME">CeL.math</span><span class="WHIT">
<span class='line'>143</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>144</span> </span><span class="NAME">mutual_division.done</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">7</span><span class="PUNC">;</span><span class="COMM">//''</span><span class="WHIT">
<span class='line'>145</span>
<span class='line'>146</span> </span><span class="NAME">CeL.math</span><span class="WHIT">
<span class='line'>147</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>148</span> </span><span class="COMM">/**
<span class='line'>149</span> * !!mode:連分數處理,對負數僅有最初一數為負。
<span class='line'>150</span> */</span><span class="WHIT">
<span class='line'>151</span> </span><span class="NAME">mutual_division.mode</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>152</span>
<span class='line'>153</span> </span><span class="NAME">CeL.math</span><span class="WHIT">
<span class='line'>154</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>155</span> </span><span class="COMM">/**
<span class='line'>156</span> * 取得連分數序列的數值
<span class='line'>157</span> * @param {Array} sequence 序列
<span class='line'>158</span> * @param {Number} [max_no] 取至第 max_no 個
<span class='line'>159</span> * @requires mutual_division.done
<span class='line'>160</span> * @return
<span class='line'>161</span> * @see
<span class='line'>162</span> * var a=continued_fraction([1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]);
<span class='line'>163</span> * alert(a+'\n'+a[0]/a[1]+'\n'+Math.SQRT2+'\n'+(Math.SQRT2-a[0]/a[1])+'\n'+mutual_division(a[0],a[1]));
<span class='line'>164</span> */</span><span class="WHIT">
<span class='line'>165</span> </span><span class="NAME">continued_fraction</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">sequence</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">max_no</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>166</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">library_namespace.is_Array</span><span class="PUNC">(</span><span class="NAME">sequence</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">sequence.length</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>167</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">sequence</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>168</span>
<span class='line'>169</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">sequence</span><span class="PUNC">[</span><span class="NAME">sequence.length</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">_.mutual_division.done</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>170</span> </span><span class="WHIT"> </span><span class="NAME">sequence.length</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>171</span>
<span class='line'>172</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">sequence.length</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>173</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">sequence</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>174</span>
<span class='line'>175</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">max_no</span><span class="COMM">/* ||max_no&lt;2 */</span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">max_no</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NAME">sequence.length</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>176</span> </span><span class="WHIT"> </span><span class="NAME">max_no</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">sequence.length</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>177</span>
<span class='line'>178</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">b</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>179</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">max_no</span><span class="WHIT"> </span><span class="PUNC">%</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>180</span> </span><span class="WHIT"> </span><span class="NAME">b</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>181</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>182</span> </span><span class="WHIT"> </span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">b</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>183</span> </span><span class="WHIT"> </span><span class="COMM">//sequence[max_no++]=1;if(--max_no%2)b=sequence[max_no],a=s[--max_no];else a=sequence[max_no],b=sequence[--max_no];</span><span class="WHIT">
<span class='line'>184</span>
<span class='line'>185</span> </span><span class="WHIT"> </span><span class="COMM">//library_namespace.debug('a=' + a + ', b=' + b + ', max_no=' + max_no);</span><span class="WHIT">
<span class='line'>186</span> </span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">max_no</span><span class="PUNC">--</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>187</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">max_no</span><span class="WHIT"> </span><span class="PUNC">%</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>188</span> </span><span class="WHIT"> </span><span class="NAME">b</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">sequence</span><span class="PUNC">[</span><span class="NAME">max_no</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>189</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>190</span> </span><span class="WHIT"> </span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">b</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">sequence</span><span class="PUNC">[</span><span class="NAME">max_no</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>191</span> </span><span class="WHIT"> </span><span class="COMM">//library_namespace.debug('a=' + a + ', b=' + b);</span><span class="WHIT">
<span class='line'>192</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">b</span><span class="WHIT"> </span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>193</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>194</span>
<span class='line'>195</span>
<span class='line'>196</span> </span><span class="NAME">CeL.math</span><span class="WHIT">
<span class='line'>197</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>198</span> </span><span class="COMM">/**
<span class='line'>199</span> * The best rational approximation. 取得值最接近之有理數 (use 連分數 continued fraction), 取近似值.
<span class='line'>200</span> * c.f., 調日法
<span class='line'>201</span> * 在分子或分母小於下一個漸進分數的分數中,其值是最接近精確值的近似值。
<span class='line'>202</span> * @example
<span class='line'>203</span> * to_rational_number(4088/783)
<span class='line'>204</span> * @param {Number} number number
<span class='line'>205</span> * @param {Number} [rate] 比例在 rate 以上
<span class='line'>206</span> * @param {Number} [max_no] 最多取至序列第 max_no 個
<span class='line'>207</span> * TODO : 並小於 l: limit
<span class='line'>208</span> * @return [分子, 分母, 誤差]
<span class='line'>209</span> * @requires mutual_division,continued_fraction
<span class='line'>210</span> * @see
<span class='line'>211</span> * http://en.wikipedia.org/wiki/Continued_fraction#Best_to_rational_numbers
<span class='line'>212</span> */</span><span class="WHIT">
<span class='line'>213</span> </span><span class="NAME">to_rational_number</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">number</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">rate</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">max_no</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>214</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">rate</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>215</span> </span><span class="WHIT"> </span><span class="COMM">// This is a magic number: 我們無法準確得知其界限為何。</span><span class="WHIT">
<span class='line'>216</span> </span><span class="WHIT"> </span><span class="NAME">rate</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">65536</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>217</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.mutual_division</span><span class="PUNC">(</span><span class="NAME">number</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">max_no</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">max_no</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">0</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">max_no</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">20</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>218</span> </span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">b</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">done</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.mutual_division.done</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>219</span>
<span class='line'>220</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">b</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>221</span> </span><span class="WHIT"> </span><span class="NAME">b</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">[</span><span class="PUNC">++</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>222</span> </span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">++</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">d.length</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="NAME">done</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>223</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">b</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">rate</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>224</span> </span><span class="WHIT"> </span><span class="NAME">b</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>225</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>226</span> </span><span class="WHIT"> </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>227</span>
<span class='line'>228</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>229</span> </span><span class="WHIT"> </span><span class="NAME">library_namespace.debug</span><span class="PUNC">(</span><span class="WHIT">
<span class='line'>230</span> </span><span class="WHIT"> </span><span class="NAME">number</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">' '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT">
<span class='line'>231</span> </span><span class="WHIT"> </span><span class="COMM">// 連分數表示</span><span class="WHIT">
<span class='line'>232</span> </span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">d.length</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">[</span><span class="NAME">d.length</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">_.mutual_division.done</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT">
<span class='line'>233</span> </span><span class="WHIT"> </span><span class="STRN">'='</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">' [&lt;em>'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">';'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">d.slice</span><span class="PUNC">(</span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">join</span><span class="PUNC">(</span><span class="STRN">', '</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'&lt;/em>'</span><span class="WHIT">
<span class='line'>234</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">d.length</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">', '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">d.slice</span><span class="PUNC">(</span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">2</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">join</span><span class="PUNC">(</span><span class="STRN">', '</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>235</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'] .. '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">d.slice</span><span class="PUNC">(</span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT">
<span class='line'>236</span> </span><span class="WHIT"> </span><span class="COMM">// 約等於的符號是≈或≒,不等於的符號是≠。</span><span class="WHIT">
<span class='line'>237</span> </span><span class="WHIT"> </span><span class="COMM">// http://zh.wikipedia.org/wiki/%E7%AD%89%E4%BA%8E</span><span class="WHIT">
<span class='line'>238</span> </span><span class="WHIT"> </span><span class="STRN">'≈'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">' [&lt;em>'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">';'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">d.slice</span><span class="PUNC">(</span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">join</span><span class="PUNC">(</span><span class="STRN">', '</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'&lt;/em>'</span><span class="WHIT">
<span class='line'>239</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">d.length</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">', '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">d.slice</span><span class="PUNC">(</span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">join</span><span class="PUNC">(</span><span class="STRN">', '</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">']: '</span><span class="WHIT">
<span class='line'>240</span> </span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">d.length</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">','</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">','</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="WHIT">
<span class='line'>241</span> </span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>242</span> </span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>243</span> </span><span class="WHIT"> </span><span class="NAME">d</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.continued_fraction</span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>244</span> </span><span class="WHIT"> </span><span class="COMM">//library_namespace.debug('→ ' + d[0] + '/' + d[1]);</span><span class="WHIT">
<span class='line'>245</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">d</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>246</span> </span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NAME">d</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NAME">d</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>247</span>
<span class='line'>248</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">number</span><span class="WHIT"> </span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>249</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>250</span>
<span class='line'>251</span>
<span class='line'>252</span> </span><span class="COMM">/* 最大公因數/公約數 Greatest Common Divisor
<span class='line'>253</span>
<span class='line'>254</span> usage:
<span class='line'>255</span> gcd(6,9)
<span class='line'>256</span> GCD([5,3,8,2,6,9])
<span class='line'>257</span> */</span><span class="WHIT">
<span class='line'>258</span> </span><span class="COMM">//_gcd[generateCode.dLK]='mutual_division,mutual_division_done';</span><span class="WHIT">
<span class='line'>259</span> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">_gcd</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>260</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">isNaN</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">)</span><span class="PUNC">||</span><span class="NAME">isNaN</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>261</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">isNaN</span><span class="PUNC">(</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">?</span><span class="NAME">a</span><span class="PUNC">:</span><span class="NAME">b</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>262</span>
<span class='line'>263</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">d</span><span class="PUNC">=</span><span class="NAME">_.mutual_division</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>264</span> </span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">=</span><span class="NAME">d.pop</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>265</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">d.pop</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">===</span><span class="NAME">_.mutual_division.done</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>266</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>267</span> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>268</span>
<span class='line'>269</span> </span><span class="NAME">CeL.math</span><span class="WHIT">
<span class='line'>270</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>271</span> </span><span class="COMM">/**
<span class='line'>272</span> * Get GCD of 2 numbers
<span class='line'>273</span> * @param n1 number 1
<span class='line'>274</span> * @param n2 number 2
<span class='line'>275</span> * @return GCD of the 2 numbers
<span class='line'>276</span> */</span><span class="WHIT">
<span class='line'>277</span> </span><span class="NAME">gcd</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">n1</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">n2</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>278</span> </span><span class="WHIT"> </span><span class="COMM">/*
<span class='line'>279</span> if (isNaN(a))
<span class='line'>280</span> return b;
<span class='line'>281</span> */</span><span class="WHIT">
<span class='line'>282</span> </span><span class="WHIT"> </span><span class="COMM">// 必要!</span><span class="WHIT">
<span class='line'>283</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">n2</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">isNaN</span><span class="PUNC">(</span><span class="NAME">n2</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>284</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">n1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>285</span>
<span class='line'>286</span> </span><span class="WHIT"> </span><span class="COMM">// 也可最後再 Math.abs</span><span class="WHIT">
<span class='line'>287</span> </span><span class="WHIT"> </span><span class="COMM">/*
<span class='line'>288</span> if (a &lt; 0)
<span class='line'>289</span> a = -a;
<span class='line'>290</span> if (b &lt; 0)
<span class='line'>291</span> b = -b;
<span class='line'>292</span> */</span><span class="WHIT">
<span class='line'>293</span>
<span class='line'>294</span> </span><span class="WHIT"> </span><span class="COMM">// Euclidean algorithm</span><span class="WHIT">
<span class='line'>295</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">r</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>296</span> </span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">r</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">n1</span><span class="WHIT"> </span><span class="PUNC">%</span><span class="WHIT"> </span><span class="NAME">n2</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>297</span> </span><span class="WHIT"> </span><span class="NAME">n1</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">n2</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">n2</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">r</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>298</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">n2</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NAME">n2</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">n2</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>299</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>300</span>
<span class='line'>301</span> </span><span class="COMM">//GCD[generateCode.dLK]='gcd';</span><span class="WHIT">
<span class='line'>302</span> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">GCD</span><span class="PUNC">(</span><span class="NAME">numA</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>303</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">=</span><span class="NAME">numA</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>304</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="PUNC">;</span><span class="NAME">i</span><span class="PUNC">&lt;</span><span class="NAME">numA.length</span><span class="PUNC">;</span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>305</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">isNaN</span><span class="PUNC">(</span><span class="NAME">numA</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>306</span> </span><span class="WHIT"> </span><span class="NAME">g</span><span class="PUNC">=</span><span class="NAME">gcd</span><span class="PUNC">(</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">numA</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>307</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">g</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>308</span> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>309</span> </span><span class="COMM">/* 最小公倍數 Least Common Multiple
<span class='line'>310</span>
<span class='line'>311</span> usage:
<span class='line'>312</span> lcm(6,9)
<span class='line'>313</span> lcm([5,3,8,2,6,9])
<span class='line'>314</span>
<span class='line'>315</span> TODO:
<span class='line'>316</span> 更快的方法:
<span class='line'>317</span> 短除法
<span class='line'>318</span> 一次算出 GCD, LCM
<span class='line'>319</span> */</span><span class="WHIT">
<span class='line'>320</span> </span><span class="COMM">//lcm[generateCode.dLK]='gcd';</span><span class="WHIT">
<span class='line'>321</span> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">lcm</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>322</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">,</span><span class="NAME">i</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>323</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">==</span><span class="STRN">'object'</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">isNaN</span><span class="PUNC">(</span><span class="NAME">l</span><span class="PUNC">=</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>324</span> </span><span class="WHIT"> </span><span class="KEYW">while</span><span class="PUNC">(</span><span class="NAME">i</span><span class="PUNC">&lt;</span><span class="NAME">a.length</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>325</span> </span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">=</span><span class="NAME">lcm</span><span class="PUNC">(</span><span class="NAME">l</span><span class="PUNC">,</span><span class="NAME">a</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>326</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>327</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>328</span>
<span class='line'>329</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">g</span><span class="PUNC">=</span><span class="NAME">gcd</span><span class="PUNC">(</span><span class="NAME">a</span><span class="PUNC">,</span><span class="NAME">b</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">isNaN</span><span class="PUNC">(</span><span class="NAME">g</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>330</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">/</span><span class="NAME">g</span><span class="PUNC">*</span><span class="NAME">b</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>331</span> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>332</span>
<span class='line'>333</span>
<span class='line'>334</span> </span><span class="COMM">/*
<span class='line'>335</span> http://www.math.umbc.edu/~campbell/NumbThy/Class/Programming/JavaScript.html
<span class='line'>336</span> http://aoki2.si.gunma-u.ac.jp/JavaScript/
<span class='line'>337</span> */</span><span class="WHIT">
<span class='line'>338</span>
<span class='line'>339</span> </span><span class="NAME">CeL.math</span><span class="WHIT">
<span class='line'>340</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>341</span> </span><span class="COMM">/**
<span class='line'>342</span> * 得到平方數,相當於 Math.floor(Math.sqrt(number)).
<span class='line'>343</span> * get integer square root
<span class='line'>344</span> * @param {Number} positive number
<span class='line'>345</span> * @return r, r^2 &lt;= number &lt; (r+1)^2
<span class='line'>346</span> * @example
<span class='line'>347</span> * var p = 20374345, q = CeL.math.floor_sqrt(p = p * p - 1); CeL.log(q + '&lt;br/>' + (q * q) + '&lt;br/>' + p + '&lt;br/>' + (++q * q));
<span class='line'>348</span> * @see
<span class='line'>349</span> * &lt;a href="http://www.azillionmonkeys.com/qed/sqroot.html" accessdate="2010/3/11 18:37">Paul Hsieh's Square Root page&lt;/a>
<span class='line'>350</span> * &lt;a href="http://www.embeddedrelated.com/usenet/embedded/show/114789-1.php" accessdate="2010/3/11 18:34">Suitable Integer Square Root Algorithm for 32-64-Bit Integers on Inexpensive Microcontroller? | Comp.Arch.Embedded | EmbeddedRelated.com&lt;/a>
<span class='line'>351</span> */</span><span class="WHIT">
<span class='line'>352</span> </span><span class="NAME">floor_sqrt</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">number</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>353</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">isNaN</span><span class="PUNC">(</span><span class="NAME">number</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">number</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>354</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>355</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">g</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">v</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">h</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">t</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>356</span> </span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">t</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">g</span><span class="WHIT"> </span><span class="PUNC">&lt;&lt;</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">v</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">number</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">g</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">g</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>357</span> </span><span class="WHIT"> </span><span class="COMM">//library_namespace.debug(t + ', ' + v);</span><span class="WHIT">
<span class='line'>358</span> </span><span class="WHIT"> </span><span class="NAME">h</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>359</span> </span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">h</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">h</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">t</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&lt;=</span><span class="WHIT"> </span><span class="NAME">v</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>360</span> </span><span class="WHIT"> </span><span class="COMM">// 因為型別轉關係,還是保留 &lt;&lt; 而不用 *2</span><span class="WHIT">
<span class='line'>361</span> </span><span class="WHIT"> </span><span class="NAME">h</span><span class="WHIT"> </span><span class="PUNC">&lt;&lt;</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="COMM">//h *= 2;</span><span class="WHIT">
<span class='line'>362</span> </span><span class="WHIT"> </span><span class="NAME">g</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">h</span><span class="WHIT"> </span><span class="PUNC">>></span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="COMM">//h / 2;//</span><span class="WHIT">
<span class='line'>363</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>364</span> </span><span class="WHIT"> </span><span class="COMM">//library_namespace.debug('end: ' + t + ', ' + v);</span><span class="WHIT">
<span class='line'>365</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">g</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>366</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>367</span>
<span class='line'>368</span>
<span class='line'>369</span> </span><span class="NAME">CeL.math</span><span class="WHIT">
<span class='line'>370</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>371</span> </span><span class="COMM">/**
<span class='line'>372</span> * 取得某數的質因數,因式分解/素因子分解, factorization, get floor factor.
<span class='line'>373</span> * 唯一分解定理(The Unique Factorization Theorem)告訴我們素因子分解是唯一的,這即是稱為算術基本定理 (The Fundamental Theorem of Arithmeric) 的數學金科玉律。
<span class='line'>374</span> * @param {Number} number
<span class='line'>375</span> * @return {Array} [prime1,power1,prime2,power2,..]
<span class='line'>376</span> * @see
<span class='line'>377</span> * &lt;a href="http://homepage2.nifty.com/m_kamada/math/10001.htm" accessdate="2010/3/11 18:7">Factorizations of 100...001&lt;/a>
<span class='line'>378</span> * @requires floor_sqrt
<span class='line'>379</span> */</span><span class="WHIT">
<span class='line'>380</span> </span><span class="NAME">factorization</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">number</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>381</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">f</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">r</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>382</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">isNaN</span><span class="PUNC">(</span><span class="NAME">number</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">number</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">number</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT">
<span class='line'>383</span> </span><span class="WHIT"> </span><span class="COMM">/*
<span class='line'>384</span> * javascript 可以表示的最大整數值
<span class='line'>385</span> * 10^21-2^16-1 = 999999999999999934463
<span class='line'>386</span> * @see
<span class='line'>387</span> * http://www.highdots.com/forums/javascript/how-js-numbers-represented-internally-166538-4.html
<span class='line'>388</span> */</span><span class="WHIT">
<span class='line'>389</span> </span><span class="WHIT"> </span><span class="NUMB">999999999999999934469</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>390</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>391</span> </span><span class="WHIT"> </span><span class="NAME">number</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">number</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>392</span>
<span class='line'>393</span> </span><span class="WHIT"> </span><span class="COMM">// 2,3</span><span class="WHIT">
<span class='line'>394</span> </span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">number</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>395</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">number</span><span class="WHIT"> </span><span class="PUNC">%</span><span class="WHIT"> </span><span class="NAME">f</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>396</span> </span><span class="WHIT"> </span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>397</span> </span><span class="WHIT"> </span><span class="KEYW">do</span><span class="WHIT">
<span class='line'>398</span> </span><span class="WHIT"> </span><span class="NAME">number</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">f</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">++</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>399</span> </span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">number</span><span class="WHIT"> </span><span class="PUNC">%</span><span class="WHIT"> </span><span class="NAME">f</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// do{n/=f,p++;}while(n%f==0);</span><span class="WHIT">
<span class='line'>400</span> </span><span class="WHIT"> </span><span class="NAME">r.push</span><span class="PUNC">(</span><span class="NAME">f</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>401</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>402</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">++</span><span class="NAME">f</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">3</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>403</span> </span><span class="WHIT"> </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>404</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>405</span>
<span class='line'>406</span> </span><span class="WHIT"> </span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">4</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">f</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">5</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.floor_sqrt</span><span class="PUNC">(</span><span class="NAME">number</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// 5-初始化</span><span class="WHIT">
<span class='line'>407</span> </span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">number</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>408</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">f</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>409</span> </span><span class="WHIT"> </span><span class="NAME">r.push</span><span class="PUNC">(</span><span class="NAME">number</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>410</span> </span><span class="WHIT"> </span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>411</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>412</span> </span><span class="WHIT"> </span><span class="COMM">// document.write('&lt;br/>'+f+','+n);</span><span class="WHIT">
<span class='line'>413</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">number</span><span class="WHIT"> </span><span class="PUNC">%</span><span class="WHIT"> </span><span class="NAME">f</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>414</span> </span><span class="WHIT"> </span><span class="NAME">p</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>415</span> </span><span class="WHIT"> </span><span class="KEYW">do</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>416</span> </span><span class="WHIT"> </span><span class="NAME">number</span><span class="WHIT"> </span><span class="PUNC">/</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">f</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">++</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>417</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT"> </span><span class="KEYW">while</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">number</span><span class="WHIT"> </span><span class="PUNC">%</span><span class="WHIT"> </span><span class="NAME">f</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>418</span> </span><span class="WHIT"> </span><span class="NAME">l</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.floor_sqrt</span><span class="PUNC">(</span><span class="NAME">number</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">r.push</span><span class="PUNC">(</span><span class="NAME">f</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>419</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>420</span> </span><span class="WHIT"> </span><span class="NAME">f</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NUMB">4</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>421</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>422</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">r</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>423</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>424</span>
<span class='line'>425</span> </span><span class="COMM">/* test
<span class='line'>426</span> function count(n){
<span class='line'>427</span> var a=factorization(n),s='',v=1;
<span class='line'>428</span> if(a){
<span class='line'>429</span> for(var i=0;i&lt;a.length;i+=2){s+='*'+a[i]+(a[i+1]>1?'^'+a[i+1]:'');v*=Math.pow(a[i],a[i+1]);}
<span class='line'>430</span> s=s.substr(1)+'='+v+'='+n;
<span class='line'>431</span> }else s='error! '+n;
<span class='line'>432</span> document.getElementById('result').value+=s+'\n-------------------------------------------\n';
<span class='line'>433</span> }
<span class='line'>434</span> */</span><span class="WHIT">
<span class='line'>435</span>
<span class='line'>436</span>
<span class='line'>437</span> </span><span class="COMM">/* 猜測一個數可能的次方數。 2005/2/18 19:20未完成
<span class='line'>438</span> type=0:整數,1:有理數
<span class='line'>439</span> return [base分子,base分母,exponent分子,exponent分母]
<span class='line'>440</span> */</span><span class="WHIT">
<span class='line'>441</span> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">to_exponent</span><span class="PUNC">(</span><span class="NAME">num</span><span class="PUNC">,</span><span class="NAME">type</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>442</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">bn</span><span class="PUNC">,</span><span class="NAME">bd</span><span class="PUNC">,</span><span class="NAME">en</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">,</span><span class="NAME">ed</span><span class="PUNC">,</span><span class="NAME">sq</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">,</span><span class="NAME">num</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">t</span><span class="PUNC">,</span><span class="NAME">q</span><span class="PUNC">,</span><span class="NAME">error</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="NAME">e</span><span class="PUNC">-</span><span class="NUMB">9</span><span class="PUNC">,</span><span class="NAME">g</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">n</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="NAME">q</span><span class="PUNC">=</span><span class="NAME">_.to_rational_number</span><span class="PUNC">(</span><span class="NAME">n</span><span class="PUNC">,</span><span class="NUMB">99999</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">type</span><span class="PUNC">||</span><span class="NAME">q</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">==</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">&&</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">q</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">></span><span class="NUMB">99999</span><span class="PUNC">&&</span><span class="NAME">q</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">></span><span class="NUMB">99999</span><span class="PUNC">)</span><span class="PUNC">&&</span><span class="NAME">q</span><span class="PUNC">[</span><span class="NUMB">2</span><span class="PUNC">]</span><span class="PUNC">/</span><span class="NAME">n</span><span class="PUNC">&lt;</span><span class="NAME">error</span><span class="PUNC">)</span><span class="NAME">bn</span><span class="PUNC">=</span><span class="NAME">q</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">bd</span><span class="PUNC">=</span><span class="NAME">q</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">ed</span><span class="PUNC">=</span><span class="NAME">t</span><span class="PUNC">;</span><span class="PUNC">}</span><span class="PUNC">;</span><span class="COMM">//error:誤差</span><span class="WHIT">
<span class='line'>443</span>
<span class='line'>444</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">ed</span><span class="PUNC">)</span><span class="NAME">g</span><span class="PUNC">(</span><span class="NAME">sq</span><span class="PUNC">[</span><span class="NAME">t</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>445</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">ed</span><span class="PUNC">)</span><span class="NAME">g</span><span class="PUNC">(</span><span class="NAME">sq</span><span class="PUNC">[</span><span class="NAME">t</span><span class="PUNC">=</span><span class="NUMB">2</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">sq</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">*</span><span class="NAME">sq</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>446</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">ed</span><span class="PUNC">)</span><span class="NAME">g</span><span class="PUNC">(</span><span class="NAME">sq</span><span class="PUNC">[</span><span class="NAME">t</span><span class="PUNC">=</span><span class="NUMB">3</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">sq</span><span class="PUNC">[</span><span class="NUMB">1</span><span class="PUNC">]</span><span class="PUNC">*</span><span class="NAME">sq</span><span class="PUNC">[</span><span class="NUMB">2</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>447</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">ed</span><span class="PUNC">)</span><span class="NAME">g</span><span class="PUNC">(</span><span class="NAME">sq</span><span class="PUNC">[</span><span class="NAME">t</span><span class="PUNC">=</span><span class="NUMB">4</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">sq</span><span class="PUNC">[</span><span class="NUMB">2</span><span class="PUNC">]</span><span class="PUNC">*</span><span class="NAME">sq</span><span class="PUNC">[</span><span class="NUMB">2</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>448</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">ed</span><span class="PUNC">)</span><span class="NAME">g</span><span class="PUNC">(</span><span class="NAME">sq</span><span class="PUNC">[</span><span class="NAME">t</span><span class="PUNC">=</span><span class="NUMB">5</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NAME">sq</span><span class="PUNC">[</span><span class="NUMB">2</span><span class="PUNC">]</span><span class="PUNC">*</span><span class="NAME">sq</span><span class="PUNC">[</span><span class="NUMB">3</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>449</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">ed</span><span class="PUNC">)</span><span class="NAME">bn</span><span class="PUNC">=</span><span class="NAME">num</span><span class="PUNC">,</span><span class="NAME">bd</span><span class="PUNC">=</span><span class="NAME">ed</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>450</span>
<span class='line'>451</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="NAME">bn</span><span class="PUNC">,</span><span class="NAME">bd</span><span class="PUNC">,</span><span class="NAME">en</span><span class="PUNC">,</span><span class="NAME">ed</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>452</span> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>453</span> </span><span class="COMM">//var t=to_exponent(Math.pow(2/3,1/1));alert(t[0]+'/'+t[1]+'^'+t[2]+'/'+t[3]);</span><span class="WHIT">
<span class='line'>454</span>
<span class='line'>455</span>
<span class='line'>456</span>
<span class='line'>457</span>
<span class='line'>458</span> </span><span class="COMM">/*
<span class='line'>459</span> for 出題
<span class='line'>460</span>
<span class='line'>461</span> runCode.setR=0;
<span class='line'>462</span> for(var i=0,j,t,s,n_e;i&lt;10;){
<span class='line'>463</span> t=2000+8000*Math.random();
<span class='line'>464</span> s=get_random_prime.get_different_number_set(3,t,t/8);
<span class='line'>465</span> if(s.LCM>9999)continue;
<span class='line'>466</span> n_e=[];
<span class='line'>467</span> n_e[s.GCD]=1;
<span class='line'>468</span> for(j=0;j&lt;s.length;j++)
<span class='line'>469</span> if(n_e[s[j]])continue;
<span class='line'>470</span> else n_e[s[j]]=1;
<span class='line'>471</span> sl([s.GCD,s.LCM]+'&lt;b style="color:#c4a">;&lt;/b> '+s);i++;
<span class='line'>472</span> }
<span class='line'>473</span>
<span class='line'>474</span> */</span><span class="WHIT">
<span class='line'>475</span>
<span class='line'>476</span> </span><span class="COMM">// 求乘積</span><span class="WHIT">
<span class='line'>477</span> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">get_product</span><span class="PUNC">(</span><span class="NAME">nums</span><span class="PUNC">,</span><span class="NAME">till</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">// num array, 乘到比till小就回傳</span><span class="WHIT">
<span class='line'>478</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">,</span><span class="NAME">i</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NAME">l</span><span class="PUNC">=</span><span class="NAME">nums.length</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>479</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="PUNC">;</span><span class="NAME">i</span><span class="PUNC">&lt;</span><span class="NAME">l</span><span class="PUNC">;</span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>480</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">till</span><span class="PUNC">&&</span><span class="NAME">p</span><span class="PUNC">*</span><span class="NAME">nums</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">></span><span class="NAME">till</span><span class="PUNC">)</span><span class="KEYW">break</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>481</span> </span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">*</span><span class="PUNC">=</span><span class="NAME">nums</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>482</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>483</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">p</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>484</span> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>485</span>
<span class='line'>486</span>
<span class='line'>487</span> </span><span class="COMM">// 2009/10/21 11:57:47</span><span class="WHIT">
<span class='line'>488</span> </span><span class="COMM">//get_random_prime[generateCode.dLK]='get_product';</span><span class="WHIT">
<span class='line'>489</span> </span><span class="NAME">get_random_prime.primes</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="NUMB">2</span><span class="PUNC">,</span><span class="NUMB">3</span><span class="PUNC">,</span><span class="NUMB">5</span><span class="PUNC">,</span><span class="NUMB">7</span><span class="PUNC">,</span><span class="NUMB">11</span><span class="PUNC">,</span><span class="NUMB">13</span><span class="PUNC">,</span><span class="NUMB">17</span><span class="PUNC">,</span><span class="NUMB">19</span><span class="PUNC">,</span><span class="NUMB">23</span><span class="PUNC">,</span><span class="NUMB">29</span><span class="PUNC">,</span><span class="NUMB">31</span><span class="PUNC">,</span><span class="NUMB">37</span><span class="PUNC">,</span><span class="NUMB">41</span><span class="PUNC">,</span><span class="NUMB">43</span><span class="PUNC">,</span><span class="NUMB">47</span><span class="PUNC">,</span><span class="NUMB">53</span><span class="PUNC">,</span><span class="NUMB">59</span><span class="PUNC">,</span><span class="NUMB">61</span><span class="PUNC">,</span><span class="NUMB">67</span><span class="PUNC">,</span><span class="NUMB">71</span><span class="PUNC">,</span><span class="NUMB">73</span><span class="PUNC">,</span><span class="NUMB">79</span><span class="PUNC">,</span><span class="NUMB">83</span><span class="PUNC">,</span><span class="NUMB">89</span><span class="PUNC">,</span><span class="NUMB">97</span><span class="PUNC">,</span><span class="NUMB">101</span><span class="PUNC">,</span><span class="NUMB">103</span><span class="PUNC">,</span><span class="NUMB">107</span><span class="PUNC">,</span><span class="NUMB">109</span><span class="PUNC">,</span><span class="NUMB">113</span><span class="PUNC">,</span><span class="NUMB">127</span><span class="PUNC">,</span><span class="NUMB">131</span><span class="PUNC">,</span><span class="NUMB">137</span><span class="PUNC">,</span><span class="NUMB">139</span><span class="PUNC">,</span><span class="NUMB">149</span><span class="PUNC">,</span><span class="NUMB">151</span><span class="PUNC">,</span><span class="NUMB">157</span><span class="PUNC">,</span><span class="NUMB">163</span><span class="PUNC">,</span><span class="NUMB">167</span><span class="PUNC">,</span><span class="NUMB">173</span><span class="PUNC">,</span><span class="NUMB">179</span><span class="PUNC">,</span><span class="NUMB">181</span><span class="PUNC">,</span><span class="NUMB">191</span><span class="PUNC">,</span><span class="NUMB">193</span><span class="PUNC">,</span><span class="NUMB">197</span><span class="PUNC">,</span><span class="NUMB">199</span><span class="PUNC">,</span><span class="NUMB">211</span><span class="PUNC">,</span><span class="NUMB">223</span><span class="PUNC">,</span><span class="NUMB">227</span><span class="PUNC">,</span><span class="NUMB">229</span><span class="PUNC">,</span><span class="NUMB">233</span><span class="PUNC">,</span><span class="NUMB">239</span><span class="PUNC">,</span><span class="NUMB">241</span><span class="PUNC">,</span><span class="NUMB">251</span><span class="PUNC">,</span><span class="NUMB">257</span><span class="PUNC">,</span><span class="NUMB">263</span><span class="PUNC">,</span><span class="NUMB">269</span><span class="PUNC">,</span><span class="NUMB">271</span><span class="PUNC">,</span><span class="NUMB">277</span><span class="PUNC">,</span><span class="NUMB">281</span><span class="PUNC">,</span><span class="NUMB">283</span><span class="PUNC">,</span><span class="NUMB">293</span><span class="PUNC">,</span><span class="NUMB">307</span><span class="PUNC">,</span><span class="NUMB">311</span><span class="PUNC">,</span><span class="NUMB">313</span><span class="PUNC">,</span><span class="NUMB">317</span><span class="PUNC">,</span><span class="NUMB">331</span><span class="PUNC">,</span><span class="NUMB">337</span><span class="PUNC">,</span><span class="NUMB">347</span><span class="PUNC">,</span><span class="NUMB">349</span><span class="PUNC">,</span><span class="NUMB">353</span><span class="PUNC">,</span><span class="NUMB">359</span><span class="PUNC">,</span><span class="NUMB">367</span><span class="PUNC">,</span><span class="NUMB">373</span><span class="PUNC">,</span><span class="NUMB">379</span><span class="PUNC">,</span><span class="NUMB">383</span><span class="PUNC">,</span><span class="NUMB">389</span><span class="PUNC">,</span><span class="NUMB">397</span><span class="PUNC">,</span><span class="NUMB">401</span><span class="PUNC">,</span><span class="NUMB">409</span><span class="PUNC">,</span><span class="NUMB">419</span><span class="PUNC">,</span><span class="NUMB">421</span><span class="PUNC">,</span><span class="NUMB">431</span><span class="PUNC">,</span><span class="NUMB">433</span><span class="PUNC">,</span><span class="NUMB">439</span><span class="PUNC">,</span><span class="NUMB">443</span><span class="PUNC">,</span><span class="NUMB">449</span><span class="PUNC">,</span><span class="NUMB">457</span><span class="PUNC">,</span><span class="NUMB">461</span><span class="PUNC">,</span><span class="NUMB">463</span><span class="PUNC">,</span><span class="NUMB">467</span><span class="PUNC">,</span><span class="NUMB">479</span><span class="PUNC">,</span><span class="NUMB">487</span><span class="PUNC">,</span><span class="NUMB">491</span><span class="PUNC">,</span><span class="NUMB">499</span><span class="PUNC">,</span><span class="NUMB">503</span><span class="PUNC">,</span><span class="NUMB">509</span><span class="PUNC">,</span><span class="NUMB">521</span><span class="PUNC">,</span><span class="NUMB">523</span><span class="PUNC">,</span><span class="NUMB">541</span><span class="PUNC">,</span><span class="NUMB">547</span><span class="PUNC">,</span><span class="NUMB">557</span><span class="PUNC">,</span><span class="NUMB">563</span><span class="PUNC">,</span><span class="NUMB">569</span><span class="PUNC">,</span><span class="NUMB">571</span><span class="PUNC">,</span><span class="NUMB">577</span><span class="PUNC">,</span><span class="NUMB">587</span><span class="PUNC">,</span><span class="NUMB">593</span><span class="PUNC">,</span><span class="NUMB">599</span><span class="PUNC">,</span><span class="NUMB">601</span><span class="PUNC">,</span><span class="NUMB">607</span><span class="PUNC">,</span><span class="NUMB">613</span><span class="PUNC">,</span><span class="NUMB">617</span><span class="PUNC">,</span><span class="NUMB">619</span><span class="PUNC">,</span><span class="NUMB">631</span><span class="PUNC">,</span><span class="NUMB">641</span><span class="PUNC">,</span><span class="NUMB">643</span><span class="PUNC">,</span><span class="NUMB">647</span><span class="PUNC">,</span><span class="NUMB">653</span><span class="PUNC">,</span><span class="NUMB">659</span><span class="PUNC">,</span><span class="NUMB">661</span><span class="PUNC">,</span><span class="NUMB">673</span><span class="PUNC">,</span><span class="NUMB">677</span><span class="PUNC">,</span><span class="NUMB">683</span><span class="PUNC">,</span><span class="NUMB">691</span><span class="PUNC">,</span><span class="NUMB">701</span><span class="PUNC">,</span><span class="NUMB">709</span><span class="PUNC">,</span><span class="NUMB">719</span><span class="PUNC">,</span><span class="NUMB">727</span><span class="PUNC">,</span><span class="NUMB">733</span><span class="PUNC">,</span><span class="NUMB">739</span><span class="PUNC">,</span><span class="NUMB">743</span><span class="PUNC">,</span><span class="NUMB">751</span><span class="PUNC">,</span><span class="NUMB">757</span><span class="PUNC">,</span><span class="NUMB">761</span><span class="PUNC">,</span><span class="NUMB">769</span><span class="PUNC">,</span><span class="NUMB">773</span><span class="PUNC">,</span><span class="NUMB">787</span><span class="PUNC">,</span><span class="NUMB">797</span><span class="PUNC">,</span><span class="NUMB">809</span><span class="PUNC">,</span><span class="NUMB">811</span><span class="PUNC">,</span><span class="NUMB">821</span><span class="PUNC">,</span><span class="NUMB">823</span><span class="PUNC">,</span><span class="NUMB">827</span><span class="PUNC">,</span><span class="NUMB">829</span><span class="PUNC">,</span><span class="NUMB">839</span><span class="PUNC">,</span><span class="NUMB">853</span><span class="PUNC">,</span><span class="NUMB">857</span><span class="PUNC">,</span><span class="NUMB">859</span><span class="PUNC">,</span><span class="NUMB">863</span><span class="PUNC">,</span><span class="NUMB">877</span><span class="PUNC">,</span><span class="NUMB">881</span><span class="PUNC">,</span><span class="NUMB">883</span><span class="PUNC">,</span><span class="NUMB">887</span><span class="PUNC">,</span><span class="NUMB">907</span><span class="PUNC">,</span><span class="NUMB">911</span><span class="PUNC">,</span><span class="NUMB">919</span><span class="PUNC">,</span><span class="NUMB">929</span><span class="PUNC">,</span><span class="NUMB">937</span><span class="PUNC">,</span><span class="NUMB">941</span><span class="PUNC">,</span><span class="NUMB">947</span><span class="PUNC">,</span><span class="NUMB">953</span><span class="PUNC">,</span><span class="NUMB">967</span><span class="PUNC">,</span><span class="NUMB">971</span><span class="PUNC">,</span><span class="NUMB">977</span><span class="PUNC">,</span><span class="NUMB">983</span><span class="PUNC">,</span><span class="NUMB">991</span><span class="PUNC">,</span><span class="NUMB">997</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>490</span> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">get_random_prime</span><span class="PUNC">(</span><span class="NAME">count</span><span class="PUNC">,</span><span class="NAME">exclude</span><span class="PUNC">,</span><span class="NAME">all_different</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT"> </span><span class="COMM">// 個數, 排除</span><span class="WHIT">
<span class='line'>491</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">_f</span><span class="PUNC">=</span><span class="NAME">arguments.callee</span><span class="PUNC">,</span><span class="NAME">i</span><span class="PUNC">,</span><span class="NAME">j</span><span class="PUNC">,</span><span class="NAME">p</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">l</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>492</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">count</span><span class="PUNC">||</span><span class="NAME">count</span><span class="PUNC">&lt;</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="NAME">count</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>493</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">_f.excluded</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>494</span> </span><span class="WHIT"> </span><span class="NAME">_f.excluded</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>495</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">exclude</span><span class="PUNC">)</span><span class="NAME">exclude</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>496</span>
<span class='line'>497</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">j</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">&lt;</span><span class="NAME">count</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>498</span> </span><span class="WHIT"> </span><span class="NAME">l</span><span class="PUNC">=</span><span class="NUMB">80</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// timeout</span><span class="WHIT">
<span class='line'>499</span> </span><span class="WHIT"> </span><span class="KEYW">do</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>500</span> </span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">=</span><span class="NAME">Math.round</span><span class="PUNC">(</span><span class="NUMB">10</span><span class="PUNC">*</span><span class="NAME">Math.tan</span><span class="PUNC">(</span><span class="NAME">Math.random</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">*</span><span class="NUMB">1.5</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>501</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="PUNC">--</span><span class="NAME">l</span><span class="PUNC">)</span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// timeout</span><span class="WHIT">
<span class='line'>502</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="KEYW">while</span><span class="PUNC">(</span><span class="NAME">_f.excluded</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>503</span> </span><span class="WHIT"> </span><span class="NAME">p.push</span><span class="PUNC">(</span><span class="NAME">_f.primes</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>504</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">exclude</span><span class="PUNC">)</span><span class="NAME">exclude.push</span><span class="PUNC">(</span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>505</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>506</span>
<span class='line'>507</span> </span><span class="WHIT"> </span><span class="COMM">// 選完才排除本次選的</span><span class="WHIT">
<span class='line'>508</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">exclude</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>509</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="NAME">j</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NAME">l</span><span class="PUNC">=</span><span class="NAME">exclude.length</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">&lt;</span><span class="NAME">l</span><span class="PUNC">;</span><span class="NAME">j</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>510</span> </span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">=</span><span class="NAME">exclude</span><span class="PUNC">[</span><span class="NAME">j</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>511</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="NAME">_f.excluded</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="NAME">_f.excluded</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">++</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>512</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="NAME">_f.excluded</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>513</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>514</span>
<span class='line'>515</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">count</span><span class="PUNC">==</span><span class="NUMB">1</span><span class="PUNC">?</span><span class="NAME">p</span><span class="PUNC">[</span><span class="NUMB">0</span><span class="PUNC">]</span><span class="PUNC">:</span><span class="NAME">p</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>516</span> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>517</span>
<span class='line'>518</span> </span><span class="COMM">// return [GCD, n1, n2, ..]</span><span class="WHIT">
<span class='line'>519</span> </span><span class="NAME">get_random_prime.get_different_number_set</span><span class="PUNC">=</span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">count</span><span class="PUNC">,</span><span class="NAME">till</span><span class="PUNC">,</span><span class="NAME">GCD_till</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>520</span> </span><span class="WHIT"> </span><span class="KEYW">delete</span><span class="WHIT"> </span><span class="NAME">this.excluded</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>521</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">GCD_till</span><span class="PUNC">)</span><span class="NAME">GCD_till</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="NAME">e5</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>522</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="PUNC">!</span><span class="NAME">till</span><span class="PUNC">)</span><span class="NAME">till</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="NAME">e5</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>523</span>
<span class='line'>524</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">GCD</span><span class="PUNC">=</span><span class="NAME">get_product</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">(</span><span class="NUMB">20</span><span class="PUNC">,</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">GCD_till</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="NAME">na</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">n_e</span><span class="PUNC">=</span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">,</span><span class="NAME">n</span><span class="PUNC">,</span><span class="NAME">i</span><span class="PUNC">=</span><span class="NUMB">0</span><span class="PUNC">,</span><span class="NAME">out</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>525</span> </span><span class="WHIT"> </span><span class="NAME">n_e</span><span class="PUNC">[</span><span class="NAME">GCD</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>526</span>
<span class='line'>527</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="PUNC">(</span><span class="PUNC">;</span><span class="NAME">i</span><span class="PUNC">&lt;</span><span class="NAME">count</span><span class="PUNC">;</span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>528</span> </span><span class="WHIT"> </span><span class="NAME">out</span><span class="PUNC">=</span><span class="NUMB">80</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="COMM">// timeout</span><span class="WHIT">
<span class='line'>529</span> </span><span class="WHIT"> </span><span class="KEYW">do</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>530</span> </span><span class="WHIT"> </span><span class="NAME">n</span><span class="PUNC">=</span><span class="KEYW">this</span><span class="PUNC">(</span><span class="NUMB">20</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>531</span> </span><span class="WHIT"> </span><span class="NAME">n.unshift</span><span class="PUNC">(</span><span class="NAME">GCD</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>532</span> </span><span class="WHIT"> </span><span class="NAME">n</span><span class="PUNC">=</span><span class="NAME">get_product</span><span class="PUNC">(</span><span class="NAME">n</span><span class="PUNC">,</span><span class="NAME">till</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>533</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="KEYW">while</span><span class="PUNC">(</span><span class="NAME">n_e</span><span class="PUNC">[</span><span class="NAME">n</span><span class="PUNC">]</span><span class="PUNC">&&</span><span class="PUNC">--</span><span class="NAME">out</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>534</span> </span><span class="WHIT"> </span><span class="NAME">n_e</span><span class="PUNC">[</span><span class="NAME">n</span><span class="PUNC">]</span><span class="PUNC">=</span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>535</span> </span><span class="WHIT"> </span><span class="NAME">na.push</span><span class="PUNC">(</span><span class="NAME">n</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>536</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>537</span>
<span class='line'>538</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">lcm</span><span class="PUNC">==</span><span class="STRN">'function'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>539</span> </span><span class="WHIT"> </span><span class="NAME">na.LCM</span><span class="PUNC">=</span><span class="NAME">lcm</span><span class="PUNC">(</span><span class="NAME">na</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>540</span> </span><span class="WHIT"> </span><span class="NAME">na.GCD</span><span class="PUNC">=</span><span class="NAME">GCD</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>541</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">na</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>542</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>543</span>
<span class='line'>544</span>
<span class='line'>545</span>
<span class='line'>546</span> </span><span class="NAME">CeL.math</span><span class="WHIT">
<span class='line'>547</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>548</span> </span><span class="COMM">/**
<span class='line'>549</span> * VBScript has a Hex() function but JScript does not.
<span class='line'>550</span> * @param {Number} number
<span class='line'>551</span> * @return {String} number in hex
<span class='line'>552</span> * @example
<span class='line'>553</span> * alert('0x'+CeL.hex(16725))
<span class='line'>554</span> */</span><span class="WHIT">
<span class='line'>555</span> </span><span class="NAME">hex</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">number</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>556</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">number</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NAME">number</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NUMB">0x100000000</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">number</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">toString</span><span class="PUNC">(</span><span class="NUMB">16</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>557</span> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>558</span>
<span class='line'>559</span> </span><span class="NAME">CeL.math</span><span class="WHIT">
<span class='line'>560</span> </span><span class="PUNC">.</span><span class="WHIT">
<span class='line'>561</span> </span><span class="COMM">/**
<span class='line'>562</span> * 補數計算。
<span class='line'>563</span> * 正數的補數即為自身。若要求得互補之後的數字,請設成負數。
<span class='line'>564</span> * @param {Number} number
<span class='line'>565</span> * @return {Number} base 1: 1's Complement, 2: 2's Complement, (TODO: 3, 4, ..)
<span class='line'>566</span> * @example
<span class='line'>567</span> * alert(complement())
<span class='line'>568</span> * @see
<span class='line'>569</span> * http://www.tomzap.com/notes/DigitalSystemsEngEE316/1sAnd2sComplement.pdf
<span class='line'>570</span> * http://en.wikipedia.org/wiki/Method_of_complements
<span class='line'>571</span> * http://en.wikipedia.org/wiki/Signed_number_representations
<span class='line'>572</span> * @since 2010/3/12 23:47:52
<span class='line'>573</span> */</span><span class="WHIT">
<span class='line'>574</span> </span><span class="NAME">complement</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>575</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.from.apply</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">arguments</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>576</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>577</span>
<span class='line'>578</span> </span><span class="NAME">_.complement.prototype</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>579</span>
<span class='line'>580</span> </span><span class="NAME">base</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>581</span>
<span class='line'>582</span> </span><span class="COMM">// 1,2,..</span><span class="WHIT">
<span class='line'>583</span> </span><span class="NAME">bits</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">8</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>584</span>
<span class='line'>585</span> </span><span class="COMM">// radix complement or diminished radix complement.</span><span class="WHIT">
<span class='line'>586</span> </span><span class="COMM">// http://en.wikipedia.org/wiki/Method_of_complements</span><span class="WHIT">
<span class='line'>587</span> </span><span class="NAME">diminished</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>588</span>
<span class='line'>589</span> </span><span class="COMM">/**
<span class='line'>590</span> * 正負符號.
<span class='line'>591</span> * 正: 0/false,
<span class='line'>592</span> * 負 negative value:!=0 / true
<span class='line'>593</span> */</span><span class="WHIT">
<span class='line'>594</span> </span><span class="NAME">sign</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>595</span>
<span class='line'>596</span> </span><span class="COMM">// get the value</span><span class="WHIT">
<span class='line'>597</span> </span><span class="NAME">valueOf</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>598</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">this.sign</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NAME">this.value</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NAME">this.value</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>599</span> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>600</span>
<span class='line'>601</span> </span><span class="COMM">/**
<span class='line'>602</span> * set value
<span class='line'>603</span> */</span><span class="WHIT">
<span class='line'>604</span> </span><span class="NAME">set</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">value</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>605</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Number</span><span class="PUNC">(</span><span class="NAME">value</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.abs</span><span class="PUNC">(</span><span class="NAME">m</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>606</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">isNaN</span><span class="PUNC">(</span><span class="NAME">m</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="NAME">e</span><span class="PUNC">-</span><span class="NUMB">8</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">a</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">1</span><span class="NAME">e12</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>607</span> </span><span class="WHIT"> </span><span class="NAME">library_namespace.debug</span><span class="PUNC">(</span><span class="STRN">'complement.set: error number: '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">value</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>608</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>609</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>610</span>
<span class='line'>611</span> </span><span class="WHIT"> </span><span class="NAME">this.sign</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">m</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>612</span> </span><span class="WHIT"> </span><span class="COMM">// this.value 僅有正值</span><span class="WHIT">
<span class='line'>613</span> </span><span class="WHIT"> </span><span class="NAME">this.value</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">a</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>614</span>
<span class='line'>615</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>616</span> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>617</span>
<span class='line'>618</span>
<span class='line'>619</span> </span><span class="COMM">/**
<span class='line'>620</span> * input
<span class='line'>621</span> */</span><span class="WHIT">
<span class='line'>622</span> </span><span class="NAME">from</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">number</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">base</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">diminished</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>623</span> </span><span class="WHIT"> </span><span class="COMM">// 正規化</span><span class="WHIT">
<span class='line'>624</span> </span><span class="WHIT"> </span><span class="NAME">number</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="STRN">''</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">number</span><span class="PUNC">||</span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">.</span><span class="NAME">replace</span><span class="PUNC">(</span><span class="REGX">/\s+$|^[\s0]+/g</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="STRN">''</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="STRN">'0'</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>625</span> </span><span class="WHIT"> </span><span class="COMM">//library_namespace.debug(number + ':' + number.length + ',' + this.bits);</span><span class="WHIT">
<span class='line'>626</span>
<span class='line'>627</span> </span><span class="WHIT"> </span><span class="COMM">// 整數部分位數</span><span class="WHIT">
<span class='line'>628</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">number.indexOf</span><span class="PUNC">(</span><span class="STRN">'.'</span><span class="PUNC">)</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">tmp</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>629</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>630</span> </span><span class="WHIT"> </span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">number.length</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>631</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: not good</span><span class="WHIT">
<span class='line'>632</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NAME">this.bits</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>633</span> </span><span class="WHIT"> </span><span class="COMM">//throw 'overflow';</span><span class="WHIT">
<span class='line'>634</span> </span><span class="WHIT"> </span><span class="NAME">library_namespace.err</span><span class="PUNC">(</span><span class="STRN">'complement.from: overflow: '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">value</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>635</span>
<span class='line'>636</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">diminished</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'undefined'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>637</span> </span><span class="WHIT"> </span><span class="COMM">// illegal setup</span><span class="WHIT">
<span class='line'>638</span> </span><span class="WHIT"> </span><span class="NAME">diminished</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.diminished</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>639</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>640</span> </span><span class="WHIT"> </span><span class="NAME">this.diminished</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">diminished</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>641</span>
<span class='line'>642</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">(</span><span class="NAME">base</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">base</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="NAME">base</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>643</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">base</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>644</span> </span><span class="WHIT"> </span><span class="NAME">base</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.diminished</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>645</span> </span><span class="WHIT"> </span><span class="NAME">this.base</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">base</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>646</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>647</span> </span><span class="WHIT"> </span><span class="COMM">// illegal base</span><span class="WHIT">
<span class='line'>648</span> </span><span class="WHIT"> </span><span class="NAME">base</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.base</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>649</span> </span><span class="WHIT"> </span><span class="COMM">//library_namespace.debug(base + "'s Complement");</span><span class="WHIT">
<span class='line'>650</span>
<span class='line'>651</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: 僅對 integer 有效</span><span class="WHIT">
<span class='line'>652</span> </span><span class="WHIT"> </span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">parseInt</span><span class="PUNC">(</span><span class="NAME">number</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">base</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>653</span> </span><span class="WHIT"> </span><span class="NAME">tmp</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.pow</span><span class="PUNC">(</span><span class="NAME">base</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.bits</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>654</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">>=</span><span class="WHIT"> </span><span class="NAME">tmp</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">base</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>655</span> </span><span class="WHIT"> </span><span class="COMM">//throw 'overflow';</span><span class="WHIT">
<span class='line'>656</span> </span><span class="WHIT"> </span><span class="NAME">library_namespace.err</span><span class="PUNC">(</span><span class="STRN">'complement.from: overflow: '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">value</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>657</span>
<span class='line'>658</span> </span><span class="WHIT"> </span><span class="COMM">//library_namespace.debug('compare ' + value + ',' + tmp);</span><span class="WHIT">
<span class='line'>659</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">tmp</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>660</span> </span><span class="WHIT"> </span><span class="NAME">this.sign</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>661</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT">
<span class='line'>662</span> </span><span class="WHIT"> </span><span class="COMM">//library_namespace.debug('負數 ' + (tmp * base - (diminished ? 1 : 0)) + '-'+ value+'='+(tmp * base - (diminished ? 1 : 0) - value)),</span><span class="WHIT">
<span class='line'>663</span> </span><span class="WHIT"> </span><span class="NAME">this.sign</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>664</span> </span><span class="WHIT"> </span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">tmp</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="WHIT"> </span><span class="NAME">base</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">diminished</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">value</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>665</span>
<span class='line'>666</span> </span><span class="WHIT"> </span><span class="NAME">this.value</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">value</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>667</span> </span><span class="WHIT"> </span><span class="COMM">//library_namespace.debug(number + ' → '+this.valueOf());</span><span class="WHIT">
<span class='line'>668</span>
<span class='line'>669</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>670</span> </span><span class="PUNC">}</span><span class="PUNC">,</span><span class="WHIT">
<span class='line'>671</span>
<span class='line'>672</span> </span><span class="COMM">/**
<span class='line'>673</span> * output
<span class='line'>674</span> */</span><span class="WHIT">
<span class='line'>675</span> </span><span class="NAME">to</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">base</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">diminished</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>676</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="PUNC">!</span><span class="PUNC">(</span><span class="NAME">base</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.floor</span><span class="PUNC">(</span><span class="NAME">base</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">base</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>677</span> </span><span class="WHIT"> </span><span class="NAME">base</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.base</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>678</span> </span><span class="WHIT"> </span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">base</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>679</span> </span><span class="WHIT"> </span><span class="NAME">base</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">2</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">diminished</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>680</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="WHIT"> </span><span class="NAME">diminished</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'undefined'</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>681</span> </span><span class="WHIT"> </span><span class="NAME">diminished</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.diminished</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>682</span>
<span class='line'>683</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.value</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">tmp</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">Math.pow</span><span class="PUNC">(</span><span class="NAME">base</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.bits</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NUMB">1</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>684</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">></span><span class="WHIT"> </span><span class="NAME">tmp</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">tmp</span><span class="WHIT"> </span><span class="PUNC">&&</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">diminished</span><span class="WHIT"> </span><span class="PUNC">||</span><span class="WHIT"> </span><span class="PUNC">!</span><span class="NAME">this.sign</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>685</span> </span><span class="WHIT"> </span><span class="COMM">//throw 'overflow';</span><span class="WHIT">
<span class='line'>686</span> </span><span class="WHIT"> </span><span class="NAME">library_namespace.err</span><span class="PUNC">(</span><span class="STRN">'complement.to: overflow: '</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.sign</span><span class="WHIT"> </span><span class="PUNC">?</span><span class="WHIT"> </span><span class="STRN">'-'</span><span class="WHIT"> </span><span class="PUNC">:</span><span class="WHIT"> </span><span class="STRN">'+'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">value</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>687</span>
<span class='line'>688</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.sign</span><span class="PUNC">)</span><span class="PUNC">{</span><span class="WHIT">
<span class='line'>689</span> </span><span class="WHIT"> </span><span class="NAME">tmp</span><span class="WHIT"> </span><span class="PUNC">*</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">base</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>690</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">diminished</span><span class="PUNC">)</span><span class="WHIT">
<span class='line'>691</span> </span><span class="WHIT"> </span><span class="COMM">// TODO: 僅對 integer 有效</span><span class="WHIT">
<span class='line'>692</span> </span><span class="WHIT"> </span><span class="NAME">tmp</span><span class="PUNC">--</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>693</span> </span><span class="WHIT"> </span><span class="COMM">//library_namespace.debug('負數 ' + value + 'sum=' + tmp);</span><span class="WHIT">
<span class='line'>694</span> </span><span class="WHIT"> </span><span class="COMM">// 負數,添上兩補數之和</span><span class="WHIT">
<span class='line'>695</span> </span><span class="WHIT"> </span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">tmp</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="WHIT"> </span><span class="NAME">value</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>696</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>697</span>
<span class='line'>698</span> </span><span class="WHIT"> </span><span class="COMM">//library_namespace.debug('value: ' + (this.sign ? '-' : '+') + value);</span><span class="WHIT">
<span class='line'>699</span>
<span class='line'>700</span> </span><span class="WHIT"> </span><span class="NAME">value</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">value.toString</span><span class="PUNC">(</span><span class="NAME">Math.max</span><span class="PUNC">(</span><span class="NUMB">2</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">this.base</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>701</span>
<span class='line'>702</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">value</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>703</span> </span><span class="PUNC">}</span><span class="WHIT">
<span class='line'>704</span>
<span class='line'>705</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>706</span>
<span class='line'>707</span> </span><span class="NAME">_.complement.prototype.toString</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">_.complement.prototype.to</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>708</span>
<span class='line'>709</span>
<span class='line'>710</span> </span><span class="COMM">/*
<span class='line'>711</span> ↑Math ---------------------------------------------------------------
<span class='line'>712</span> */</span><span class="WHIT">
<span class='line'>713</span>
<span class='line'>714</span>
<span class='line'>715</span> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="WHIT">
<span class='line'>716</span> </span><span class="WHIT"> </span><span class="NAME">CeL.math</span><span class="WHIT">
<span class='line'>717</span> </span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>718</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>719</span>
<span class='line'>720</span> </span><span class="COMM">//============================================================================</span><span class="WHIT">
<span class='line'>721</span>
<span class='line'>722</span> </span><span class="NAME">CeL.setup_module</span><span class="PUNC">(</span><span class="NAME">module_name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">code_for_including</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>723</span>
<span class='line'>724</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
<span class='line'>725</span> </span></pre></body></html>