我需要一個可以存盤 128 位無符號整數的變數。然而,Powershell 識別的最大型別是 UInt64。是否可以定義 UInt128 甚至 UInt256 變數?
對于背景關系,我使用的是 Powershell 7.2.0。
uj5u.com熱心網友回復:
從你的評論:
我想在斐波那契數列中找到素數,這就是為什么我需要這么大的整數
為此,[bigint](型別的型別加速器System.Numerics.BigInteger)就是您想要的 - 它沒有任何上限,并且專門用于處理大值的整數算術 - 正是您在尋找素數時需要的那種東西!
[...] 大多數 Powershell 函式,尤其是 [Math] 中的函式,不是為 BigInteger 設計的。
好訊息是[bigint]自帶!
以下是如何實作一個簡單(且緩慢)的遞回斐波那契生成器[bigint]:
function Get-FibonacciTerm {
param(
[Parameter(Mandatory = $true, ValueFromPipeline = $true)]
[int]$N
)
process {
if($N -lt 1){ return [bigint]::Zero }
if($N -lt 3){ return [bigint]::One }
return (Get-FibonacciTerm -N ($N-1)) (Get-FibonacciTerm -N ($N-2))
}
}
PS ~> 1..12 |Get-FibonacciTerm
1
1
2
3
5
8
13
21
34
55
89
144
正如您可能已經注意到的,基本算術運算子 like 被多載[bigint],因此完全按照您期望的“開箱即用”作業。
此外,[bigint]還提供了一組靜態輔助方法來為大多數靜態[math]函式提供同源詞。這是一個使用其中一些的簡單(同樣,相當慢/低效)Prime 生成器/測驗器:
function Get-PrimeNumber {
param(
[bigint]$Below = 1000
)
for($i = [bigint]::Zero; $i -lt $Below; $i = [bigint]::Add($i, [bigint]::One)){
if($i -le 1){ continue }
if([bigint]::Remainder($i, 2) -eq 0){
if($i -eq 2){ $i }
continue
}
$foundFactor = $false
for($j = 3; $j -lt $i; $j = [bigint]::Add($j, 2)){
if([bigint]::Remainder($i, $j) -eq 0){
$foundFactor = $true
break
}
}
if(-not $foundFactor){ $i }
}
}
PS ~> Get-PrimeNumber -Below 100
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
現在,您可能想要在此處進行的第一個優化是僅搜索到$i內部回圈中的根。這就是[bigint]開始不同的地方[math]- 沒有內置Sqrt()函式!
幸運的是,您可以推出自己的:)
綜上所述:
- 對于大整數運算,
[bigint]絕對是你的朋友 - 它與內置整數型別沒有完全相同的特性,但支持基本的算術運算
我現在看到腳本語言可能不是這樣的用例的最佳選擇
我不會這么快就否定“腳本語言”的整個??類別——PowerShell不一定適合這個用例,因為大整數數學的優化從來都不是 PowerShell 和 .NET 的主要優先事項——但是還有其他更適合的語言,因為它們已經針對它進行了優化。
Python (>=3.x) 本身支持無界數字,并且通常比 PowerShell 進行算術運算快得多。JavaScript 還支持BigInt類似于[bigint]for numbers >2^53 的型別,速度也非常快。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/366202.html
標籤:电源外壳
上一篇:匹配并檢查2個值是否相等
