模組:BigNumber/doc

这是Module:BigNumber的文档页面

以百萬进制運作的大數運算系統(或稱高精度计算)。當中也包含了大數運算进制轉換系統。目前支援加法、減法、乘法、除法與整數冪次

使用方法

Lua

.bigint("bignumber", base)
以一個指定底數的字串初始化一個大數。底數預設值為10。底數可接受的值與.convertBase函數相同。
參數:
  • bignumber(大數):要初始化的大數。若未輸入則默認為0。
  • base(輸入的底數):輸入值的進位制,默認為10。(參見.convertBase函數的from參數)
例如:
local bigint = require('Module:BigNumber')
print(bigint.bigint("425731578351266") * bigint.bigint("948700000017358"))
輸出:403891548389235902937021275228
這個函數會返回一個bigint物件。每個bigint都可以互相進行加法、減法、乘法、除法和乘冪運算(乘冪運算的指數不能是bigint物件)
每個bigint物件有以下成員函數可供使用:
bigint物件:equal(other)
比較兩個bigint物件的值是否相等
參數:
  • other:要和自身比較的另一個數,可以是數字或其他bigint物件
bigint物件:less(other)
比較bigint物件的值是否小於other的值
參數:
  • other:要和自身比較的另一個數,可以是數字或其他bigint物件
bigint物件:lessequal(other)
比較bigint物件的值是否小於等於other的值
參數:
  • other:要和自身比較的另一個數,可以是數字或其他bigint物件
bigint物件:clone()
製作bigint物件的副本
bigint物件:divsmall(other)
計算bigint物件與一般數字相除的商
參數:
  • other:被除數。只能是數字,不可以是bigint物件
bigint物件:inverse(precision)
計算bigint物件所代表的值之倒數
參數:
  • precision:運算精度
bigint物件:length()
取得這個bigint物件的位數(含非整數部分)。可用於計算倒數時的精度位數
bigint物件:intlength()
取得這個bigint物件整數部分的位數
.bigintmath
提供支援bigint物件的math函數庫
使用方法
使用.bigintmath前須先呼叫.bigintmath.init()初始化方能使用當中的各項函數
例如:
local bigint = require('Module:BigNumber')
local mymath = bigint.bigintmath.init()
print(mymath.abs("-12345"))
輸出:12345
成員函數
init(base):初始化bigint的math函數庫
三角函sincostancotsinhcoshtanhcothasinacosatanatan2acotasinhacoshatanhacoth
這些函數是取同界角後(避免經度丟失)直接調用math函數庫的函數。單位是弧度。
deg(x):弧度轉角度
rad(x):角度轉弧度
e:數學常數e
pi:數學常數圓周率
huge無窮大
abs(x):取絕對值
sgn(x):取符號函
floor(x):取向下取整
ceil(x):取向上取整
div(x,y):除法,x / y
inverse(x):取倒數,小數點16位精度
digits(x):取得整數的位數
sqrt(x):使用牛頓法以大數運算計算平方根,過大的數字可能會需要較長的計算時間
modf(x):將一數拆成整數部分與小數部分
fmod(x,y):計算x除以y的餘數,商向零取整
exp(x):計算 
frexp(x):將x表達為 ,回傳m和e
ldexp(m, e):計算 
pow(x,y):計算 
log(x):計算 (直接調用math函數庫的函數)
log(a,x):計算 (直接調用math函數庫的函數)
log10(x):計算 
factorial(x):計算 
max(x0,x1,x2,...):取得一系列數字的最大值
min(x0,x1,x2,...):取得一系列數字的最小值
random(a,b):取[a,b]之間的亂數。若b未輸入則取[1,a]之間的亂數。若皆未輸入則取[0,1)之間的亂數
.convertBase("number", base, from, width, precision, sub)
將特定進位制的數字轉成以另一個進位制表示。在本模組中用於大數輸入輸出。本函數可模板调用。
參數:
  • number(數字):(必填)須轉換的數字,以字符串形式輸入。十进制的數字可直接以數字形式輸入,但需注意過大的數字若以數字的形式輸入可能會丟失精度,應視情況換用字串輸入。
  • base(目標底數):目標進位制,可取任意絕對值介於1到9007199254740900之間的所有實數(含負數)、純虛數高斯整數接受非整數的底數,如 进制。支持特殊进制:「!」表示阶乘进制、「fibcode」表示斐波那契編碼。默認為10。
  • from(原始底數):輸入值的進位制,可取絕對值小於9007199254740900的任意複數,默認為10(如果輸入的數字以「0x」開頭,則默認為16)。
  • width(位數補齊):小數點前至少顯示的位數,達不到時會加「0」。
  • precision(小數計算最大位數):小數點後的位數,達不到時會加「0」。不填該項會顯示所有位數,但不超過20位數。
  • sub(輸出模式):見Template:進制/doc#sub的值
  • prefix:加在輸出值前的維基代碼。number為空時則不加。例如在轉換到十六进制後在前面加上0x
  • suffix:加在輸出值後的維基代碼。number為空時則不加。例如在轉換到八进制後在後面加上<sub>8</sub>
例如:
local bigint = require('Module:BigNumber')
print(bigint.convertBase({n = 3.14159265358979, base = 3}))
輸出:10.010211012222010(OEIS數列A004602
由於模組本身是大數運算系統,因此若數字過大失去精度的話可以考慮改成以字串輸入:
bigint.convertBase(123456789123456789)→123456789123460000
bigint.convertBase("123456789123456789")→123456789123456789
._FFT(re, im, length, ifft)
執行快速傅里叶变换。在本模組中用於大數乘法。
參數:

模板

搭配{{計算}}使用,僅需將|number class=參數指定為Module:BigNumber.bigintmath即可调用大數運算相關函數。

{{計算| 2^64 | number class=Module:BigNumber.bigintmath}}
→18446744073709551616
對比{{計算| 2^64 }}→1.844674407371e+19
以及{{#expr:2^64 }}→1.844674407371E+19
{{計算| 425731578351266 * 948700000017358 | number class=Module:BigNumber.bigintmath}}
→403891548389235902937021275228
對比{{計算| 425731578351266 * 948700000017358 }}→4.0389154838924e+29
以及{{#expr:425731578351266 * 948700000017358 }}→4.0389154838924E+29
{{計算| factorial(70) | number class=Module:BigNumber.bigintmath}}
→11978571669969891796072783721689098736458938142546425857555362864628009582789845319680000000000000000
對比{{計算| factorial(70) }}→1.197857166997e+100

注意事項

雖然大數運算系統(或稱高精度计算)理論上無計算上的上限,但考慮到維基百科伺服器有限制腳本運作時間為10秒(見WP:模板限制)因此也不能運算過大的數;此外冪次的運算是使用傳統的一次一次相乘的方法,因此過大的指數也可能導致超過模板運算上限。雖然目前乘法演算法已使用傅里叶变换進行加速,但使用此模組時仍應留意效能。

此外,本模組主要是設計給整數的大數運算(Big Integer),但有保留小數運算的能力,尤其是運算除法不整除時,多次的除法會導致小數位數的增長,因而導致計算時間增加,因此若需要做多次除法建議取整,可使用number:setpoint(0).bigintmath.floor(number)(搭配{{計算}}時使用floor(number))來清除小數。

參見