Windows PowerShellでProject Euler(32)

Problem 25

この問題はlogを求めてもよいですが、正確に求めてみました。
38秒かかりました。

filter next() {
    $_
    $a = 0
    1 / $a
}

filter enumerate($init = 0) {
    ,($init, $_)
    $init += 1
}

function izip_longest($a, $b, $default) {
    $n1 = $a.length
    $n2 = $b.length
    foreach($k in 0..(([math]::max($n1, $n2) - 1))) {
        if($k -lt $n1) {
            if($k -lt $n2) {
                ,($a[$k], $b[$k])
            }
            else {
                ,($a[$k], $default)
            }
        }
        else {
            ,($default, $b[$k])
        }
    }
}

function add_long($a, $b) {
    $c = 0
    foreach($x in (izip_longest $a $b 0)) {
        ($p, $q) = $x
        $s = $p + $q + $c
        if($s -lt 10) {
            $s
            $c = 0
        }
        else {
            $s - 10
            $c = 1
        }
    }
    if($c -eq 1) { $c }
}

function Fibonacci() {
    $a, $b = @(@(1, 0), @(1, 0))
    ,$a
    while($true) {
        ,$b
        $a, $b = $b, (add_long $a $b)
    }
}

$watch = New-Object System.Diagnostics.Stopwatch
$watch.Start();
$n = 1000
Fibonacci | enumerate 1 | foreach { ,($_[0], ($_[1] -join "")) } |
            where { $_[1].length -eq $n } | foreach { $_[0] } | next
$watch.Stop();
$watch.Elapsed.TotalMilliSeconds / 1000
trap { continue }