home > さまざまな言語で数値計算 > 固有値・固有ベクトル >

さまざまな言語で数値計算

Only Do What Only You Can Do

反復法

反復法を使って, 最大固有値と, 対応する固有ベクトルを求める

$ n \times n $ の正方行列 $ \boldsymbol{A} $ と $ n $ 次元のベクトル $ \boldsymbol{x} $ について
$ \boldsymbol{Ax} = \lambda \boldsymbol{x} $ (ただし $ \boldsymbol{x} \neq 0 $ ) が成り立つとき
$ \lambda $ を固有値, $ \boldsymbol{x} $ を固有ベクトルという.
最初に適当なベクトル $ \boldsymbol{x}_0 $ から始めて $ \boldsymbol{x}_{k+1} = \boldsymbol{Ax}_{k} $ を反復すると
$ \boldsymbol{x}_{k} $ は行列 $ \boldsymbol{A} $ の最大固有値に対応する固有ベクトルに収束する.

固有値はレイリー(Rayleigh)商

$ \lambda = \displaystyle \frac{\boldsymbol{x}_k^T \boldsymbol{x}_{k+1}}{\boldsymbol{x}_k^T \boldsymbol{x}_k} $
により求める.

べき乗法、累乗法とも言う.

VBScript

Option Explicit

Private Const N = 3

'ベキ乗法で最大固有値を求める
Call Main

Private Sub Main()
    Dim a: a = Array(_
               Array(5.0, 4.0, 1.0, 1.0), _
               Array(4.0, 5.0, 1.0, 1.0), _
               Array(1.0, 1.0, 4.0, 2.0), _
               Array(1.0, 1.0, 2.0, 4.0))

    Dim x: x = Array(1.0 ,0.0 ,0.0 ,0.0)

    'ベキ乗法
    Dim lambda: lambda = power(a, x)

    WScript.StdOut.WriteLine
    WScript.StdOut.WriteLine "eigenvalue"
    WScript.StdOut.WriteLine Right(Space(14) & FormatNumber(lambda, 10, -1, 0, 0), 14)

    WScript.StdOut.WriteLine "eigenvector"
    Call disp_vector(x)
End Sub

'ベキ乗法
Private Function power(ByVal a, ByRef x0)
    Dim i, j, k

    Dim lambda: lambda = 0.0

    '正規化 (ベクトル x0 の長さを1にする)
    Call normarize(x0)
    Dim e0: e0 = 0.0
    For i = 0 To N
        e0 = e0 + x0(i)
    Next

    For k = 1 To 200
        '1次元配列を表示
        WScript.StdOut.Write Right(Space(3) & k, 3) & vbTab
        Call disp_vector(x0)

        '行列の積 x1 = A × x0
        Dim x1: x1 = Array(0.0, 0.0, 0.0, 0.0)
        For i = 0 To N
            For j = 0 To N
                x1(i) = x1(i) + a(i)(j) * x0(j)
            Next
        Next

        '内積
        Dim p0: p0 = 0.0
        Dim p1: p1 = 0.0
        For i = 0 To N
            p0 = p0 + x1(i) * x1(i)
            p1 = p1 + x1(i) * x0(i)
        Next
        '固有値
        lambda = p0 / p1

        '正規化 (ベクトル x1 の長さを1にする)
        Call normarize(x1)
        '収束判定
        Dim e1: e1 = 0.0
        For i = 0 To N
            e1 = e1 + x1(i)
        Next
        If Abs(e1 - e0) < 0.00000000001 Then Exit For

        x0 = x1
        e0 = e1
    Next

    power = lambda
End Function

'1次元配列を表示
Private Sub disp_vector(ByVal row)
    Dim col
    For Each col In row
        WScript.StdOut.Write Right(Space(14) & FormatNumber(col, 10, -1, 0, 0), 14) & vbTab
    Next
    WScript.StdOut.WriteLine
End Sub

'正規化 (ベクトルの長さを1にする)
Private Sub normarize(ByRef x())
    Dim s: s = 0.0

    Dim i
    For i = 0 To N
        s = s + x(i) * x(i)
    Next
    s = Sqr(s)

    For i = 0 To N
        x(i) = x(i) / s
    Next
End Sub
Z:\>cscript //nologo Z:\1101.vbs
  1   1.0000000000    0.0000000000    0.0000000000    0.0000000000
  2   0.7624928517    0.6099942813    0.1524985703    0.1524985703
  3   0.6745979924    0.6589096670    0.2353248811    0.2353248811
  4   0.6517382447    0.6501601860    0.2761602732    0.2761602732
  5   0.6421032522    0.6419452154    0.2963188771    0.2963188771
  6   0.6373267026    0.6373108932    0.3063082594    0.3063082594
  7   0.6349074765    0.6349058954    0.3112772079    0.3112772079
  8   0.6336860412    0.6336858831    0.3137548428    0.3137548428
  9   0.6330719648    0.6330719490    0.3149919005    0.3149919005
 10   0.6327640473    0.6327640457    0.3156099832    0.3156099832
省略
 26   0.6324555367    0.6324555367    0.3162277566    0.3162277566
 27   0.6324555344    0.6324555344    0.3162277613    0.3162277613
 28   0.6324555332    0.6324555332    0.3162277637    0.3162277637
 29   0.6324555326    0.6324555326    0.3162277648    0.3162277648
 30   0.6324555323    0.6324555323    0.3162277654    0.3162277654
 31   0.6324555322    0.6324555322    0.3162277657    0.3162277657
 32   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 33   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 34   0.6324555321    0.6324555321    0.3162277660    0.3162277660
 35   0.6324555320    0.6324555320    0.3162277660    0.3162277660

eigenvalue
 10.0000000000
eigenvector
  0.6324555320    0.6324555320    0.3162277660    0.3162277660

JScript

var N = 4

// ベキ乗法で最大固有値を求める
main()

function main()
{
    var a = [[5.0, 4.0, 1.0, 1.0],
             [4.0, 5.0, 1.0, 1.0],
             [1.0, 1.0, 4.0, 2.0],
             [1.0, 1.0, 2.0, 4.0]]
    var x =  [1.0 ,0.0 ,0.0 ,0.0]

    // ベキ乗法
    var lambda = power(a, x)

    WScript.StdOut.WriteLine()
    WScript.StdOut.WriteLine("eigenvalue")
    WScript.StdOut.WriteLine(("              "    + lambda.toFixed(10)).slice(-14))

    WScript.StdOut.WriteLine("eigenvector")
    disp_vector(x)
}

// ベキ乗法
function power(a, x0)
{
    var lambda = 0.0

    // 正規化 (ベクトル x0 の長さを1にする)
    normarize(x0)
    var e0 = 0.0
    for (var i = 0; i < N; i++)
        e0 += x0[i]

    for (var k = 1; k <= 200; k++)
    {
        // 1次元配列を表示
        WScript.StdOut.Write(("   "           + k).slice( -3) + "\t")
        disp_vector(x0)

        // 行列の積 x1 = A × x0
        var x1 = [0.0 ,0.0 ,0.0 ,0.0]
        for (var i = 0; i < N; i++)
            for (var j = 0; j < N; j++)
                x1[i] += a[i][j] * x0[j]

        // 内積
        var p0 = 0.0
        var p1 = 0.0
        for (var i = 0; i < N; i++)
        {
            p0 += x1[i] * x1[i]
            p1 += x1[i] * x0[i]
        }
        // 固有値
        lambda = p0 / p1

        // 正規化 (ベクトル x1 の長さを1にする)
        normarize(x1)
        // 収束判定
        var e1 = 0.0
        for (var i = 0; i < N; i++)
            e1 += x1[i]
        if (Math.abs(e0 - e1) < 0.00000000001) break

        for (var i = 0; i < N; i++)
            x0[i] = x1[i]
        e0 = e1
    }
    return lambda
}

// 1次元配列を表示
function disp_vector(row)
{
    for (var i = 0; i < N; i++)
        WScript.StdOut.Write(("              "    + row[i].toFixed(10)).slice(-14) + "\t")
    WScript.StdOut.WriteLine()
}
// 正規化 (ベクトルの長さを1にする)
function normarize(x)
{
    var s = 0.0

    for (var i = 0; i < N; i++)
        s += x[i] * x[i]
    s = Math.sqrt(s)

    for (var i = 0; i < N; i++)
        x[i] /= s
}
Z:\>cscript //nologo Z:\1101.js
  1   1.0000000000    0.0000000000    0.0000000000    0.0000000000
  2   0.7624928517    0.6099942813    0.1524985703    0.1524985703
  3   0.6745979924    0.6589096670    0.2353248811    0.2353248811
  4   0.6517382447    0.6501601860    0.2761602732    0.2761602732
  5   0.6421032522    0.6419452154    0.2963188771    0.2963188771
  6   0.6373267026    0.6373108932    0.3063082594    0.3063082594
  7   0.6349074765    0.6349058954    0.3112772079    0.3112772079
  8   0.6336860412    0.6336858831    0.3137548428    0.3137548428
  9   0.6330719648    0.6330719490    0.3149919005    0.3149919005
 10   0.6327640473    0.6327640457    0.3156099832    0.3156099832
省略
 26   0.6324555367    0.6324555367    0.3162277566    0.3162277566
 27   0.6324555344    0.6324555344    0.3162277613    0.3162277613
 28   0.6324555332    0.6324555332    0.3162277637    0.3162277637
 29   0.6324555326    0.6324555326    0.3162277648    0.3162277648
 30   0.6324555323    0.6324555323    0.3162277654    0.3162277654
 31   0.6324555322    0.6324555322    0.3162277657    0.3162277657
 32   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 33   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 34   0.6324555321    0.6324555321    0.3162277660    0.3162277660
 35   0.6324555320    0.6324555320    0.3162277660    0.3162277660

eigenvalue
 10.0000000000
eigenvector
  0.6324555320    0.6324555320    0.3162277660    0.3162277660

PowerShell

set-variable -name N -value 3 -option constant

# 1次元配列を表示
function disp_vector($row)
{
    foreach ($col in $row)
    {
        Write-Host ([String]::Format("{0,14:F10}", $col)) -nonewline
    }
    Write-Host
}
# 正規化 (ベクトルの長さを1にする)
function normarize($x)
{
    $s = 0.0

    foreach ($i in 0..$N)
    {
        $s += $x[$i] * $x[$i]
    }
    $s = [Math]::Sqrt($s)

    foreach ($i in 0..$N)
    {
        $x[$i] /= $s
    }
}

# ベキ乗法
function power($a, $x0)
{
    $lambda = 0.0

    # 正規化 (ベクトル x0 の長さを1にする)
    normarize $x0
    $e0 = 0.0
    foreach ($i in 0..$N)
    {
        $e0 += $x0[$i]
    }

    foreach ($k in 1..200)
    {
        # 1次元配列を表示
        Write-Host ([String]::Format("{0,3:D}`t", $k)) -nonewline
        disp_vector $x0

        # 行列の積 x1 = A × x0
        $x1 = (0.0, 0.0, 0.0, 0.0)
        foreach ($i in 0..$N)
        {
            foreach ($j in 0..$N)
            {
                $x1[$i] += $a[$i][$j] * $x0[$j]
            }
        }

        # 内積
        $p0 = 0.0
        $p1 = 0.0
        foreach ($i in 0..$N)
        {
            $p0 += $x1[$i] * $x1[$i]
            $p1 += $x1[$i] * $x0[$i]
        }
        # 固有値
        $lambda = $p0 / $p1

        # 正規化 (ベクトル x1 の長さを1にする)
        normarize $x1
        # 収束判定
        $e1 = 0.0
        foreach ($i in 0..$N)
        {
            $e1 += $x1[$i]
        }
        if ([Math]::Abs($e0 - $e1) -lt 0.00000000001)
        {
            break
        }
        foreach ($i in 0..$N)
        {
            $x0[$i] = $x1[$i]
        }
        $e0 = $e1
    }

    $lambda
}

# ベキ乗法で最大固有値を求める

$a = (5.0, 4.0, 1.0, 1.0),
     (4.0, 5.0, 1.0, 1.0),
     (1.0, 1.0, 4.0, 2.0),
     (1.0, 1.0, 2.0, 4.0)
$x = (1.0 ,0.0 ,0.0 ,0.0)

# ベキ乗法
$lambda = (power $a $x)

Write-Host
Write-Host "eigenvalue"
Write-Host ([String]::Format("{0,14:F10}", $lambda))

Write-Host "eigenvector"
disp_vector $x
Z:\>powershell -file Z:\1101.ps1
  1   1.0000000000  0.0000000000  0.0000000000  0.0000000000
  2   0.7624928517  0.6099942813  0.1524985703  0.1524985703
  3   0.6745979924  0.6589096670  0.2353248811  0.2353248811
  4   0.6517382447  0.6501601860  0.2761602732  0.2761602732
  5   0.6421032522  0.6419452154  0.2963188771  0.2963188771
  6   0.6373267026  0.6373108932  0.3063082594  0.3063082594
  7   0.6349074765  0.6349058954  0.3112772079  0.3112772079
  8   0.6336860412  0.6336858831  0.3137548428  0.3137548428
  9   0.6330719648  0.6330719490  0.3149919005  0.3149919005
 10   0.6327640473  0.6327640457  0.3156099832  0.3156099832
省略
 26   0.6324555367  0.6324555367  0.3162277566  0.3162277566
 27   0.6324555344  0.6324555344  0.3162277613  0.3162277613
 28   0.6324555332  0.6324555332  0.3162277637  0.3162277637
 29   0.6324555326  0.6324555326  0.3162277648  0.3162277648
 30   0.6324555323  0.6324555323  0.3162277654  0.3162277654
 31   0.6324555322  0.6324555322  0.3162277657  0.3162277657
 32   0.6324555321  0.6324555321  0.3162277659  0.3162277659
 33   0.6324555321  0.6324555321  0.3162277659  0.3162277659
 34   0.6324555321  0.6324555321  0.3162277660  0.3162277660
 35   0.6324555320  0.6324555320  0.3162277660  0.3162277660

eigenvalue
 10.0000000000
eigenvector
  0.6324555320  0.6324555320  0.3162277660  0.3162277660

Perl

use constant N => 3;

# ベキ乗法で最大固有値を求める
main();

sub main
{
    my @a = ([5.0, 4.0, 1.0, 1.0],
             [4.0, 5.0, 1.0, 1.0],
             [1.0, 1.0, 4.0, 2.0],
             [1.0, 1.0, 2.0, 4.0]);
    my @x =  (1.0, 0.0, 0.0, 0.0);

    # ベキ乗法 Power iteration
    $lambda = power(\@a, \@x);

    print "\neigenvalue\n";
    printf("%14.10f", $lambda);

    print "\neigenvector\n";
    disp_vector(\@x);
}

# ベキ乗法 Power iteration
sub power
{
    my ($a, $x0) = @_;
    my $lambda   = 0.0;

    # 正規化 (ベクトル x0 の長さを1にする)
    normarize(\@$x0);
    my $e0 = 0.0;
    for $i (0..N)
    {
        $e0 += $$x0[$i];
    }

    for $k (1..200)
    {
        # 1次元配列を表示
        printf("%3d\t", $k);
        disp_vector(\@$x0);

        # 行列の積 x1 = A × x0
        my @x1;
        for $i (0..N)
        {
            for $j (0..N)
            {
                $x1[$i] += $$a[$i][$j] * $$x0[$j];
            }
        }

        # 内積 inner product
        my $p0 = 0.0;
        my $p1 = 0.0;
        for $i (0..N)
        {
            $p0 += $x1[$i] *  $x1[$i];
            $p1 += $x1[$i] * $$x0[$i];
        }
        # 固有値 eigenvalue
        $lambda = $p0 / $p1;

        # 正規化 (ベクトル x1 の長さを1にする)
        normarize(\@x1);
        # 収束判定
        my $e1 = 0.0;
        for $i (0..N)
        {
            $e1 += $x1[$i];
        }
        last if (abs($e0 - $e1) < 0.00000000001);

        for $i (0..N)
        {
            $$x0[$i] = $x1[$i];
        }
        $e0 = $e1;
    }

    $lambda;
}

# 1次元配列を表示
sub disp_vector
{
    my ($x) = @_;
    for $i (0..N)
    {
        printf("%14.10f\t", $$x[$i]);
    }
    print "\n";
}
# 正規化 (ベクトルの長さを1にする)
sub normarize
{
    my ($x) = @_;
    my  $s  = 0.0;
    for $i (0..N)
    {
        $s += $$x[$i] * $$x[$i];
    }
    $s = sqrt($s);

    for $i (0..N)
    {
        $$x[$i] /= $s;
    }
}
Z:\>perl Z:\1101.pl
  1   1.0000000000    0.0000000000    0.0000000000    0.0000000000
  2   0.7624928517    0.6099942813    0.1524985703    0.1524985703
  3   0.6745979924    0.6589096670    0.2353248811    0.2353248811
  4   0.6517382447    0.6501601860    0.2761602732    0.2761602732
  5   0.6421032522    0.6419452154    0.2963188771    0.2963188771
  6   0.6373267026    0.6373108932    0.3063082594    0.3063082594
  7   0.6349074765    0.6349058954    0.3112772079    0.3112772079
  8   0.6336860412    0.6336858831    0.3137548428    0.3137548428
  9   0.6330719648    0.6330719490    0.3149919005    0.3149919005
 10   0.6327640473    0.6327640457    0.3156099832    0.3156099832
省略
 26   0.6324555367    0.6324555367    0.3162277566    0.3162277566
 27   0.6324555344    0.6324555344    0.3162277613    0.3162277613
 28   0.6324555332    0.6324555332    0.3162277637    0.3162277637
 29   0.6324555326    0.6324555326    0.3162277648    0.3162277648
 30   0.6324555323    0.6324555323    0.3162277654    0.3162277654
 31   0.6324555322    0.6324555322    0.3162277657    0.3162277657
 32   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 33   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 34   0.6324555321    0.6324555321    0.3162277660    0.3162277660
 35   0.6324555320    0.6324555320    0.3162277660    0.3162277660

eigenvalue
 10.0000000000
eigenvector
  0.6324555320    0.6324555320    0.3162277660    0.3162277660

PHP

<?php
define("N", 3);

# ベキ乗法で最大固有値を求める
main();

function main()
{
    $a = [[5.0, 4.0, 1.0, 1.0],
          [4.0, 5.0, 1.0, 1.0],
          [1.0, 1.0, 4.0, 2.0],
          [1.0, 1.0, 2.0, 4.0]];
    $x =  [1.0, 0.0, 0.0, 0.0];

    # ベキ乗法
    $lambda = power($a, $x);

    print "\neigenvalue\n";
    printf("%14.10f", $lambda);

    print "\neigenvector\n";
    disp_vector($x);
}

# ベキ乗法
function power(&$a, &$x0)
{
    $lambda   = 0.0;

    # 正規化 (ベクトル x0 の長さを1にする)
    normarize($x0);
    $e0 = 0.0;
    foreach (range(0, N) as $i)
    {
        $e0 += $x0[$i];
    }

    foreach (range(1, 200) as $k)
    {
        # 1次元配列を表示
        printf("%3d\t", $k);
        disp_vector($x0);

        # 行列の積 x1 = A × x0
        $x1 = [0.0, 0.0, 0.0, 0.0];
        foreach (range(0, N) as $i)
        {
            foreach (range(0, N) as $j)
            {
                $x1[$i] += $a[$i][$j] * $x0[$j];
            }
        }

        # 内積
        $p0 = 0.0;
        $p1 = 0.0;
        foreach (range(0, N) as $i)
        {
            $p0 += $x1[$i] * $x1[$i];
            $p1 += $x1[$i] * $x0[$i];
        }
        # 固有値
        $lambda = $p0 / $p1;

        # 正規化 (ベクトル x1 の長さを1にする)
        normarize($x1);
        # 収束判定
        $e1 = 0.0;
        foreach (range(0, N) as $i)
        {
            $e1 += $x1[$i];
        }
        if (abs($e0 - $e1) < 0.00000000001) break;

        foreach (range(0, N) as $i)
        {
            $x0[$i] = $x1[$i];
        }
        $e0 = $e1;
    }

    return $lambda;
}

# 1次元配列を表示
function disp_vector($row)
{
    foreach ($row as $col)
        printf("%14.10f\t", $col);
    print "\n";
}
# 正規化 (ベクトルの長さを1にする)
function normarize(&$x)
{
    $s = 0.0;
    foreach (range(0, N) as $i)
    {
        $s += $x[$i] * $x[$i];
    }
    $s = sqrt($s);

    foreach (range(0, N) as $i)
    {
        $x[$i] /= $s;
    }
}
?>
Z:\>php Z:\1101.php
  1   1.0000000000    0.0000000000    0.0000000000    0.0000000000
  2   0.7624928517    0.6099942813    0.1524985703    0.1524985703
  3   0.6745979924    0.6589096670    0.2353248811    0.2353248811
  4   0.6517382447    0.6501601860    0.2761602732    0.2761602732
  5   0.6421032522    0.6419452154    0.2963188771    0.2963188771
  6   0.6373267026    0.6373108932    0.3063082594    0.3063082594
  7   0.6349074765    0.6349058954    0.3112772079    0.3112772079
  8   0.6336860412    0.6336858831    0.3137548428    0.3137548428
  9   0.6330719648    0.6330719490    0.3149919005    0.3149919005
 10   0.6327640473    0.6327640457    0.3156099832    0.3156099832
省略
 26   0.6324555367    0.6324555367    0.3162277566    0.3162277566
 27   0.6324555344    0.6324555344    0.3162277613    0.3162277613
 28   0.6324555332    0.6324555332    0.3162277637    0.3162277637
 29   0.6324555326    0.6324555326    0.3162277648    0.3162277648
 30   0.6324555323    0.6324555323    0.3162277654    0.3162277654
 31   0.6324555322    0.6324555322    0.3162277657    0.3162277657
 32   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 33   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 34   0.6324555321    0.6324555321    0.3162277660    0.3162277660
 35   0.6324555320    0.6324555320    0.3162277660    0.3162277660

eigenvalue
 10.0000000000
eigenvector
  0.6324555320    0.6324555320    0.3162277660    0.3162277660

Python

# coding: Shift_JIS
import math

N = 4

# 1次元配列を表示
def disp_vector(row):
    for col in row:
        print "%14.10f\t" % col,
    print ""

# 正規化 (ベクトルの長さを1にする)
def normarize(x):
    s = 0.0

    for i in range(0, N, 1):
        s += x[i] * x[i]
    s = math.sqrt(s)

    for i in range(0, N, 1):
        x[i] /= s

# ベキ乗法
def power(a, x0):
    lambda0 = 0.0

    # 正規化 (ベクトル x0 の長さを1にする)
    normarize(x0)
    e0 = 0.0
    for i in range(0, N, 1):
        e0 += x0[i]

    for k in range(1, 200, 1):
        # 1次元配列を表示
        print "%3d\t" % k,
        disp_vector(x0)

        # 行列の積 x1 = A × x0
        x1 =  [ 0.0,  0.0,  0.0,  0.0]
        for i in range(0, N, 1):
            for j in range(0, N, 1):
                x1[i] += a[i][j] * x0[j]

        # 内積
        p0 = 0.0
        p1 = 0.0
        for i in range(0, N, 1):
            p0 += x1[i] * x1[i]
            p1 += x1[i] * x0[i]

        # 固有値
        lambda0 = p0 / p1

        # 正規化 (ベクトル x1 の長さを1にする)
        normarize(x1)
        # 収束判定
        e1 = 0.0
        for i in range(0, N, 1):
            e1 += x1[i]
        if (abs(e0 - e1) < 0.00000000001):
            break

        for i in range(0, N, 1):
            x0[i] = x1[i]
        e0 = e1

    return lambda0

# ベキ乗法で最大固有値を求める

a = [[5.0, 4.0, 1.0, 1.0],
     [4.0, 5.0, 1.0, 1.0],
     [1.0, 1.0, 4.0, 2.0],
     [1.0, 1.0, 2.0, 4.0]]
x =  [1.0 ,0.0 ,0.0 ,0.0]

# ベキ乗法
lambda0 = power(a, x)

print ""
print "eigenvalue"
print "%14.10f" % lambda0

print "eigenvector"
disp_vector(x)
Z:\>python Z:\1101.py
  1   1.0000000000    0.0000000000    0.0000000000    0.0000000000
  2   0.7624928517    0.6099942813    0.1524985703    0.1524985703
  3   0.6745979924    0.6589096670    0.2353248811    0.2353248811
  4   0.6517382447    0.6501601860    0.2761602732    0.2761602732
  5   0.6421032522    0.6419452154    0.2963188771    0.2963188771
  6   0.6373267026    0.6373108932    0.3063082594    0.3063082594
  7   0.6349074765    0.6349058954    0.3112772079    0.3112772079
  8   0.6336860412    0.6336858831    0.3137548428    0.3137548428
  9   0.6330719648    0.6330719490    0.3149919005    0.3149919005
 10   0.6327640473    0.6327640457    0.3156099832    0.3156099832
省略
 26   0.6324555367    0.6324555367    0.3162277566    0.3162277566
 27   0.6324555344    0.6324555344    0.3162277613    0.3162277613
 28   0.6324555332    0.6324555332    0.3162277637    0.3162277637
 29   0.6324555326    0.6324555326    0.3162277648    0.3162277648
 30   0.6324555323    0.6324555323    0.3162277654    0.3162277654
 31   0.6324555322    0.6324555322    0.3162277657    0.3162277657
 32   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 33   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 34   0.6324555321    0.6324555321    0.3162277660    0.3162277660
 35   0.6324555320    0.6324555320    0.3162277660    0.3162277660

eigenvalue
 10.0000000000
eigenvector
  0.6324555320    0.6324555320    0.3162277660    0.3162277660

Ruby

# coding: Shift_JIS

N = 3

# 1次元配列を表示
def disp_vector(row)
    row.each do |col|
        printf("%14.10f\t", col)
    end
    puts ""
end
# 正規化 (ベクトルの長さを1にする)
def normarize(x)
    s = 0.0

    (0..N).each do |i|
        s += x[i] * x[i]
    end
    s = Math.sqrt(s)

    (0..N).each do |i|
        x[i] /= s
    end
end

# ベキ乗法
def power(a, x0)
    lambda = 0.0

    # 正規化 (ベクトル x0 の長さを1にする)
    normarize(x0)
    e0 = 0.0
    (0..N).each do |i|
        e0 += x0[i]
    end

    (1..200).each do |k|
        # 1次元配列を表示
        printf("%3d\t", k)
        disp_vector(x0)

        # 行列の積 x1 = A × x0
        x1 =  [ 0.0,  0.0,  0.0,  0.0]
        (0..N).each do |i|
            (0..N).each do |j|
                x1[i] += a[i][j] * x0[j]
            end
        end

        # 内積
        p0 = 0.0
        p1 = 0.0
        (0..N).each do |i|
            p0 += x1[i] * x1[i]
            p1 += x1[i] * x0[i]
        end
        # 固有値
        lambda = p0 / p1

        # 正規化 (ベクトル x1 の長さを1にする)
        normarize(x1)
        # 収束判定
        e1 = 0.0
        (0..N).each do |i|
            e1 += x1[i]
        end
        break if ((e0 - e1).abs < 0.00000000001)

        (0..N).each do |i|
            x0[i] = x1[i]
        end
        e0 = e1
    end

    lambda
end

# ベキ乗法で最大固有値を求める

a = [[5.0, 4.0, 1.0, 1.0],
     [4.0, 5.0, 1.0, 1.0],
     [1.0, 1.0, 4.0, 2.0],
     [1.0, 1.0, 2.0, 4.0]]
x =  [1.0 ,0.0 ,0.0 ,0.0]

# ベキ乗法
lambda0 = power(a, x)

puts ""
puts "eigenvalue"
printf("%14.10f\n", lambda0)

puts "eigenvector"
disp_vector(x)
Z:\>ruby Z:\1101.rb
  1   1.0000000000    0.0000000000    0.0000000000    0.0000000000
  2   0.7624928517    0.6099942813    0.1524985703    0.1524985703
  3   0.6745979924    0.6589096670    0.2353248811    0.2353248811
  4   0.6517382447    0.6501601860    0.2761602732    0.2761602732
  5   0.6421032522    0.6419452154    0.2963188771    0.2963188771
  6   0.6373267026    0.6373108932    0.3063082594    0.3063082594
  7   0.6349074765    0.6349058954    0.3112772079    0.3112772079
  8   0.6336860412    0.6336858831    0.3137548428    0.3137548428
  9   0.6330719648    0.6330719490    0.3149919005    0.3149919005
 10   0.6327640473    0.6327640457    0.3156099832    0.3156099832
省略
 26   0.6324555367    0.6324555367    0.3162277566    0.3162277566
 27   0.6324555344    0.6324555344    0.3162277613    0.3162277613
 28   0.6324555332    0.6324555332    0.3162277637    0.3162277637
 29   0.6324555326    0.6324555326    0.3162277648    0.3162277648
 30   0.6324555323    0.6324555323    0.3162277654    0.3162277654
 31   0.6324555322    0.6324555322    0.3162277657    0.3162277657
 32   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 33   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 34   0.6324555321    0.6324555321    0.3162277660    0.3162277660
 35   0.6324555320    0.6324555320    0.3162277660    0.3162277660

eigenvalue
 10.0000000000
eigenvector
  0.6324555320    0.6324555320    0.3162277660    0.3162277660

Groovy

N = 3

// ベキ乗法で最大固有値を求める
main()

def main() {
    def a = [[5.0, 4.0, 1.0, 1.0],
             [4.0, 5.0, 1.0, 1.0],
             [1.0, 1.0, 4.0, 2.0],
             [1.0, 1.0, 2.0, 4.0]] as double[][]
    def x =  [1.0 ,0.0 ,0.0 ,0.0]  as double[]

    // ベキ乗法
    lambda = power(a, x)

    println()
    println("eigenvalue")
    printf("%14.10f\n" , lambda)

    println("eigenvector")
    disp_vector(x)
}

// ベキ乗法
def power(a, x0) {
    lambda = 0.0

    // 正規化 (ベクトル x0 の長さを1にする)
    normarize(x0)
    e0 = 0.0
    for (i in 0..N)
        e0 += x0[i]

    for (k in 1..200) {
        // 1次元配列を表示
        printf("%3d\t" , k)
        disp_vector(x0)

        // 行列の積 x1 = A × x0
        x1 = [0.0 ,0.0 ,0.0 ,0.0]
        for (i in 0..N)
            for (j in 0..N)
                x1[i] += a[i][j] * x0[j]

        // 内積
        p0 = 0.0
        p1 = 0.0
        for (i in 0..N) {
            p0 += x1[i] * x1[i]
            p1 += x1[i] * x0[i]
        }
        // 固有値
        lambda = p0 / p1

        // 正規化 (ベクトル x1 の長さを1にする)
        normarize(x1)
        // 収束判定
        e1 = 0.0
        for (i in 0..N)
            e1 += x1[i]
        if (Math.abs(e0 - e1) < 0.00000000001) break

        for (i in 0..N)
            x0[i] = x1[i]
        e0 = e1
    }
    lambda
}

// 1次元配列を表示
def disp_vector(row) {
    for (col in row) {
        printf("%14.10f\t" , col)
    }
    println()
}
// 正規化 (ベクトルの長さを1にする)
def normarize(x) {
    s = 0.0

    for (i in 0..N)
        s += x[i] * x[i]
    s = Math.sqrt(s)

    for (i in 0..N)
        x[i] /= s
}
Z:\>gvy Gvy1101.gvy
  1   1.0000000000    0.0000000000    0.0000000000    0.0000000000
  2   0.7624928517    0.6099942813    0.1524985703    0.1524985703
  3   0.6745979924    0.6589096670    0.2353248811    0.2353248811
  4   0.6517382447    0.6501601860    0.2761602732    0.2761602732
  5   0.6421032522    0.6419452154    0.2963188771    0.2963188771
  6   0.6373267026    0.6373108932    0.3063082594    0.3063082594
  7   0.6349074765    0.6349058954    0.3112772079    0.3112772079
  8   0.6336860412    0.6336858831    0.3137548428    0.3137548428
  9   0.6330719648    0.6330719490    0.3149919005    0.3149919005
 10   0.6327640473    0.6327640457    0.3156099832    0.3156099832
省略
 26   0.6324555367    0.6324555367    0.3162277566    0.3162277566
 27   0.6324555344    0.6324555344    0.3162277613    0.3162277613
 28   0.6324555332    0.6324555332    0.3162277637    0.3162277637
 29   0.6324555326    0.6324555326    0.3162277648    0.3162277648
 30   0.6324555323    0.6324555323    0.3162277654    0.3162277654
 31   0.6324555322    0.6324555322    0.3162277657    0.3162277657
 32   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 33   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 34   0.6324555321    0.6324555321    0.3162277660    0.3162277660
 35   0.6324555320    0.6324555320    0.3162277660    0.3162277660

eigenvalue
 10.0000000000
eigenvector
  0.6324555320    0.6324555320    0.3162277660    0.3162277660

Pascal

program Pas1101(arg);
{$MODE delphi}

uses
    SysUtils, Math;

const
    N = 3;

type
    TwoDimArray = array [0..N,0..N] of Double;

// 1次元配列を表示
procedure disp_vector(row:array of Double);
var
    i:Integer;
begin
    for i := Low(row) to High(row) do
        write(format('%14.10f'#9, [row[i]]));
    writeln();
end;
// 正規化 (ベクトルの長さを1にする)
procedure normarize(var x:array of Double);
var
    s:Double = 0.0;
    i:Integer;
begin
    for i := Low(x) to High(x) do
        s := s + x[i] * x[i];
    s := Sqrt(s);

    for i := Low(x) to High(x) do
        x[i] := x[i] / s;
end;

// ベキ乗法
function power(a:TwoDimArray; var x0:array of Double):Double;
var
    lambda:Double = 0.0;
    p0, p1, e0, e1:Double;
    i, j, k:Integer;
    x1:array [0..N] of Double = (0.0, 0.0, 0.0, 0.0);
 begin
    // 正規化 (ベクトル x0 の長さを1にする)
    normarize(x0);
    e0 := 0.0;
    for i := Low(x0) to High(x0) do
        e0 := e0 + x0[i];

    for k := 1 to 100 do
    begin
        // 1次元配列を表示
        write(format('%3d'#9, [k]));
        disp_vector(x0);

        // 行列の積 x1 = A × x0
        for i := Low(x1) to High(x1) do
            x1[i] := 0.0;
        for i := Low(x1) to High(x1) do
        begin
            for j := Low(x0) to High(x0) do
                x1[i] := x1[i] + a[i][j] * x0[j];
        end;

        // 内積
        p0 := 0.0;
        p1 := 0.0;
        for i := Low(x0) to High(x0) do
        begin
            p0 := p0 + x1[i] * x1[i];
            p1 := p1 + x1[i] * x0[i];
        end;
        // 固有値
        lambda := p0 / p1;

        // 正規化 (ベクトル x1 の長さを1にする)
        normarize(x1);
        // 収束判定
        e1 := 0.0;
        for i := Low(x0) to High(x0) do
            e1 := e1 + x1[i];
        if Abs(e1 - e0) < 0.00000000001 then
            break;

        for i := Low(x0) to High(x0) do
            x0[i] := x1[i];
        e0 := e1;
    end;

    power := lambda;
end;

// ベキ乗法で最大固有値を求める
var
    a :TwoDimArray = ((5.0, 4.0, 1.0, 1.0)
                     ,(4.0, 5.0, 1.0, 1.0)
                     ,(1.0, 1.0, 4.0, 2.0)
                     ,(1.0, 1.0, 2.0, 4.0));
    x :array [0..N] of Double = (1.0, 0.0, 0.0, 0.0);
    lambda:Double;
begin
    // ベキ乗法
    lambda := power(a, x);

    writeln();
    writeln('eigenvalue');
    writeln(format('%14.10f', [lambda]));

    writeln('eigenvector');
    disp_vector(x);
end.
Z:\>fpc -v0 -l- Pas1101.pp

Z:\>Pas1101
  1   1.0000000000    0.0000000000    0.0000000000    0.0000000000
  2   0.7624928517    0.6099942813    0.1524985703    0.1524985703
  3   0.6745979924    0.6589096670    0.2353248811    0.2353248811
  4   0.6517382447    0.6501601860    0.2761602732    0.2761602732
  5   0.6421032522    0.6419452154    0.2963188771    0.2963188771
  6   0.6373267026    0.6373108932    0.3063082594    0.3063082594
  7   0.6349074765    0.6349058954    0.3112772079    0.3112772079
  8   0.6336860412    0.6336858831    0.3137548428    0.3137548428
  9   0.6330719648    0.6330719490    0.3149919005    0.3149919005
 10   0.6327640473    0.6327640457    0.3156099832    0.3156099832
省略
 26   0.6324555367    0.6324555367    0.3162277566    0.3162277566
 27   0.6324555344    0.6324555344    0.3162277613    0.3162277613
 28   0.6324555332    0.6324555332    0.3162277637    0.3162277637
 29   0.6324555326    0.6324555326    0.3162277648    0.3162277648
 30   0.6324555323    0.6324555323    0.3162277654    0.3162277654
 31   0.6324555322    0.6324555322    0.3162277657    0.3162277657
 32   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 33   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 34   0.6324555321    0.6324555321    0.3162277660    0.3162277660
 35   0.6324555320    0.6324555320    0.3162277660    0.3162277660

eigenvalue
 10.0000000000
eigenvector
  0.6324555320    0.6324555320    0.3162277660    0.3162277660

Ada

with TEXT_IO, Ada.Integer_Text_IO, Ada.Long_Float_Text_IO, Ada.Numerics.Long_Elementary_Functions;
use  TEXT_IO, Ada.Integer_Text_IO, Ada.Long_Float_Text_IO, Ada.Numerics.Long_Elementary_Functions;

procedure Ada1101 is

    N : Constant Integer := 3;

    type Long_Float_Array       is array (0..N)       of Long_Float;
    type Long_Float_TwoDimArray is array (0..N, 0..N) of Long_Float;

    a:Long_Float_TwoDimArray := ((5.0, 4.0, 1.0, 1.0)
                                ,(4.0, 5.0, 1.0, 1.0)
                                ,(1.0, 1.0, 4.0, 2.0)
                                ,(1.0, 1.0, 2.0, 4.0));

    x:Long_Float_Array := (1.0, 0.0, 0.0, 0.0);

    -- 1次元配列を表示
    procedure disp_vector(row:Long_Float_Array) is
    begin
        for i in row'Range loop
            Put(row(i), Fore=>3, Aft=>10, Exp=>0);
            Put(Ascii.HT);
        end loop;
        New_Line;
    end disp_vector;

    -- 正規化 (ベクトルの長さを1にする)
    procedure normarize(x:in out Long_Float_Array) is
        s:Long_Float;
    begin
        s := 0.0;
        for i in x'Range loop
            s := s + x(i) * x(i);
        end loop;
        s := Sqrt(s);

        for i in x'Range loop
            x(i) := x(i) / s;
        end loop;
    end normarize;


    -- ベキ乗法
    procedure power(a:Long_Float_TwoDimArray; x0:in out Long_Float_Array; lambda:out Long_Float) is
        p0, p1, e0, e1:Long_Float;
        x1:Long_Float_Array := (0.0, 0.0, 0.0, 0.0);
    begin
        -- 正規化 (ベクトル x0 の長さを1にする)
        normarize(x0);
        e0 := 0.0;
        for i in x0'Range loop
            e0 := e0 + x0(i);
        end loop;

        for k in 1..100 loop
            -- 1次元配列を表示
            Put(k, Width=> 3);
            Put(Ascii.HT);
            disp_vector(x0);

            -- 行列の積 x1 = A × x0
            for i in x1'Range loop
                x1(i) := 0.0;
            end loop;
            for i in x1'Range loop
                for j in x1'Range loop
                    x1(i) := x1(i) + a(i, j) * x0(j);
                end loop;
            end loop;

            -- 内積
            p0 := 0.0;
            p1 := 0.0;
            for i in x0'Range loop
                p0 := p0 + x1(i) * x1(i);
                p1 := p1 + x1(i) * x0(i);
            end loop;
            -- 固有値
            lambda := p0 / p1;

            -- 正規化 (ベクトル x1 の長さを1にする)
            normarize(x1);
            -- 収束判定
            e1 := 0.0;
            for i in x0'Range loop
                e1 := e1 + x1(i);
            end loop;
            if Abs(e1 - e0) < 0.00000000001 then
                exit;
            end if;

            for i in x0'Range loop
                x0(i) := x1(i);
            end loop;
            e0 := e1;
        end loop;
    end power;

-- ベキ乗法で最大固有値を求める
    lambda:Long_Float := 0.0;
begin
    -- ベキ乗法
    power(a, x, lambda);

    Put_Line("");
    Put_Line("eigenvalue");
    Put(lambda, Fore=>3, Aft=>10, Exp=>0);
    New_Line;

    Put_Line("eigenvector");
    disp_vector(x);
end Ada1101;
xxxxxx@yyyyyy /Z
$ gnatmake Ada1101.adb

xxxxxx@yyyyyy /Z
$ Ada1101
  1   1.0000000000    0.0000000000    0.0000000000    0.0000000000
  2   0.7624928517    0.6099942813    0.1524985703    0.1524985703
  3   0.6745979924    0.6589096670    0.2353248811    0.2353248811
  4   0.6517382447    0.6501601860    0.2761602732    0.2761602732
  5   0.6421032522    0.6419452154    0.2963188771    0.2963188771
  6   0.6373267026    0.6373108932    0.3063082594    0.3063082594
  7   0.6349074765    0.6349058954    0.3112772079    0.3112772079
  8   0.6336860412    0.6336858831    0.3137548428    0.3137548428
  9   0.6330719648    0.6330719490    0.3149919005    0.3149919005
 10   0.6327640473    0.6327640457    0.3156099832    0.3156099832
省略
 26   0.6324555367    0.6324555367    0.3162277566    0.3162277566
 27   0.6324555344    0.6324555344    0.3162277613    0.3162277613
 28   0.6324555332    0.6324555332    0.3162277637    0.3162277637
 29   0.6324555326    0.6324555326    0.3162277648    0.3162277648
 30   0.6324555323    0.6324555323    0.3162277654    0.3162277654
 31   0.6324555322    0.6324555322    0.3162277657    0.3162277657
 32   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 33   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 34   0.6324555321    0.6324555321    0.3162277660    0.3162277660
 35   0.6324555320    0.6324555320    0.3162277660    0.3162277660

eigenvalue
 10.0000000000
eigenvector
  0.6324555320    0.6324555320    0.3162277660    0.3162277660

VB.NET

Option Explicit

Module VB1101
    Private Const N As Integer = 3

    'ベキ乗法で最大固有値を求める
    Public Sub Main()
        Dim a(,) As Double = {{5.0, 4.0, 1.0, 1.0}, _
                              {4.0, 5.0, 1.0, 1.0}, _
                              {1.0, 1.0, 4.0, 2.0}, _
                              {1.0, 1.0, 2.0, 4.0}}
        Dim x()  As Double =  {1.0 ,0.0 ,0.0 ,0.0}

        'ベキ乗法
        Dim lambda As Double = power(a, x)

        Console.WriteLine()
        Console.WriteLine("eigenvalue")
        Console.WriteLine(String.Format("{0,14:F10}", lambda))

        Console.WriteLine("eigenvector")
        disp_vector(x)
    End Sub

    'ベキ乗法
    Private Function power(ByVal a(,) As Double, ByRef x0() As Double) As Double
        Dim lambda As Double = 0.0

        '正規化 (ベクトル x0 の長さを1にする)
        normarize(x0)
        Dim e0 As Double = 0.0
        For i As Integer = 0 To N
            e0 += x0(i)
        Next

        For k As Integer = 1 To 100
            '1次元配列を表示
            Console.Write(String.Format("{0,3:D}{1}", k, vbTab))
            disp_vector(x0)

            '行列の積 x1 = A × x0
            Dim x1() As Double = {0.0, 0.0, 0.0, 0.0}
            For i As Integer = 0 To N
                For j As Integer = 0 To N
                    x1(i) += a(i, j) * x0(j)
                Next
            Next

            '内積
            Dim p0 As Double = 0.0
            Dim p1 As Double = 0.0
            For i As Integer = 0 To N
                p0 += x1(i) * x1(i)
                p1 += x1(i) * x0(i)
            Next
            '固有値
            lambda = p0 / p1

            '正規化 (ベクトル x1 の長さを1にする)
            normarize(x1)
            '収束判定
            Dim e1 As Double = 0.0
            For i As Integer = 0 To N
                e1 += x1(i)
            Next
            If Math.Abs(e1 - e0) < 0.00000000001 Then Exit For

            For i As Integer = 0 To N
                x0(i) = x1(i)
            Next
            e0 = e1
        Next

        Return lambda
    End Function

    '1次元配列を表示
    Private Sub disp_vector(ByVal row() As Double)
        For Each col As Double In row
            Console.Write(String.Format("{0,14:F10}{1}", col, vbTab))
        Next
        Console.WriteLine()
    End Sub

    '正規化 (ベクトルの長さを1にする)
    Private Sub normarize(ByRef x() As Double)
        Dim s As Double = 0.0

        For i As Integer = 0 To N
            s += x(i) * x(i)
        Next
        s = Math.Sqrt(s)

        For i As Integer = 0 To N
            x(i) /= s
        Next
    End Sub

End Module
Z:\>vbc -nologo VB1101.vb

Z:\>VB1101
  1   1.0000000000    0.0000000000    0.0000000000    0.0000000000
  2   0.7624928517    0.6099942813    0.1524985703    0.1524985703
  3   0.6745979924    0.6589096670    0.2353248811    0.2353248811
  4   0.6517382447    0.6501601860    0.2761602732    0.2761602732
  5   0.6421032522    0.6419452154    0.2963188771    0.2963188771
  6   0.6373267026    0.6373108932    0.3063082594    0.3063082594
  7   0.6349074765    0.6349058954    0.3112772079    0.3112772079
  8   0.6336860412    0.6336858831    0.3137548428    0.3137548428
  9   0.6330719648    0.6330719490    0.3149919005    0.3149919005
 10   0.6327640473    0.6327640457    0.3156099832    0.3156099832
省略
 26   0.6324555367    0.6324555367    0.3162277566    0.3162277566
 27   0.6324555344    0.6324555344    0.3162277613    0.3162277613
 28   0.6324555332    0.6324555332    0.3162277637    0.3162277637
 29   0.6324555326    0.6324555326    0.3162277648    0.3162277648
 30   0.6324555323    0.6324555323    0.3162277654    0.3162277654
 31   0.6324555322    0.6324555322    0.3162277657    0.3162277657
 32   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 33   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 34   0.6324555321    0.6324555321    0.3162277660    0.3162277660
 35   0.6324555320    0.6324555320    0.3162277660    0.3162277660

eigenvalue
 10.0000000000
eigenvector
  0.6324555320    0.6324555320    0.3162277660    0.3162277660

C#

using System;

public class CS1101
{
    private const int N = 4;

    // ベキ乗法で最大固有値を求める
    public static void Main()
    {
        double[,] a = {{5.0, 4.0, 1.0, 1.0},
                       {4.0, 5.0, 1.0, 1.0},
                       {1.0, 1.0, 4.0, 2.0},
                       {1.0, 1.0, 2.0, 4.0}};
        double[]  x  = {1.0 ,0.0 ,0.0 ,0.0};

        // ベキ乗法
        double lambda = power(a, x);

        Console.WriteLine();
        Console.WriteLine("eigenvalue");
        Console.WriteLine(string.Format("{0,14:F10}", lambda));

        Console.WriteLine("eigenvector");
        disp_vector(x);
    }

    // ベキ乗法
    private static double power(double[,] a, double[] x0)
    {
        double lambda = 0.0;

        // 正規化 (ベクトル x0 の長さを1にする)
        normarize(x0);
        double e0 = 0.0;
        for (int i = 0; i < N; i++)
            e0 += x0[i];

        for (int k = 1; k <= 200; k++)
        {
            // 1次元配列を表示
            Console.Write(string.Format("{0,3:D}\t", k));
            disp_vector(x0);

            // 行列の積 x1 = A × x0
            double[] x1 = new double[N];
            for (int i = 0; i < N; i++)
                for (int j = 0; j < N; j++)
                    x1[i] += a[i, j] * x0[j];

            // 内積
            double p0 = 0.0;
            double p1 = 0.0;
            for (int i = 0; i < N; i++)
            {
                p0 += x1[i] * x1[i];
                p1 += x1[i] * x0[i];
            }
            // 固有値
            lambda = p0 / p1;

            // 正規化 (ベクトル x1 の長さを1にする)
            normarize(x1);
            // 収束判定
            double e1 = 0.0;
            for (int i = 0; i < N; i++)
                e1 += x1[i];
            if (Math.Abs(e0 - e1) < 0.00000000001) break;

            for (int i = 0; i < N; i++)
                x0[i] = x1[i];
            e0 = e1;
        }
        return lambda;
    }

    // 1次元配列を表示
    private static void disp_vector(double[] row)
    {
        foreach (double col in row)
            Console.Write(string.Format("{0,14:F10}\t", col));
        Console.WriteLine();
    }
    // 正規化 (ベクトルの長さを1にする)
    private static void normarize(double[] x)
    {
        double s = 0.0;

        for (int i = 0; i < N; i++)
            s += x[i] * x[i];
        s = Math.Sqrt(s);

        for (int i = 0; i < N; i++)
            x[i] /= s;
    }
}
Z:\>csc -nologo CS1101.cs

Z:\>CS1101
  1   1.0000000000    0.0000000000    0.0000000000    0.0000000000
  2   0.7624928517    0.6099942813    0.1524985703    0.1524985703
  3   0.6745979924    0.6589096670    0.2353248811    0.2353248811
  4   0.6517382447    0.6501601860    0.2761602732    0.2761602732
  5   0.6421032522    0.6419452154    0.2963188771    0.2963188771
  6   0.6373267026    0.6373108932    0.3063082594    0.3063082594
  7   0.6349074765    0.6349058954    0.3112772079    0.3112772079
  8   0.6336860412    0.6336858831    0.3137548428    0.3137548428
  9   0.6330719648    0.6330719490    0.3149919005    0.3149919005
 10   0.6327640473    0.6327640457    0.3156099832    0.3156099832
省略
 26   0.6324555367    0.6324555367    0.3162277566    0.3162277566
 27   0.6324555344    0.6324555344    0.3162277613    0.3162277613
 28   0.6324555332    0.6324555332    0.3162277637    0.3162277637
 29   0.6324555326    0.6324555326    0.3162277648    0.3162277648
 30   0.6324555323    0.6324555323    0.3162277654    0.3162277654
 31   0.6324555322    0.6324555322    0.3162277657    0.3162277657
 32   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 33   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 34   0.6324555321    0.6324555321    0.3162277660    0.3162277660
 35   0.6324555320    0.6324555320    0.3162277660    0.3162277660

eigenvalue
 10.0000000000
eigenvector
  0.6324555320    0.6324555320    0.3162277660    0.3162277660

Java

import java.lang.*;

public class Java1101 {

    private static final int N = 4;

    // ベキ乗法で最大固有値を求める
    public static void main(String []args) {
        double[][] a = {{5.0, 4.0, 1.0, 1.0},
                        {4.0, 5.0, 1.0, 1.0},
                        {1.0, 1.0, 4.0, 2.0},
                        {1.0, 1.0, 2.0, 4.0}};
        double[]   x  = {1.0 ,0.0 ,0.0 ,0.0};

        // ベキ乗法
        double lambda = power(a, x);

        System.out.println();
        System.out.println("eigenvalue");
        System.out.println(String.format("%14.10f", lambda));

        System.out.println("eigenvector");
        disp_vector(x);
    }

    // ベキ乗法
    private static double power(double[][] a, double[] x0) {
        double lambda = 0.0;

        // 正規化 (ベクトル x0 の長さを1にする)
        normarize(x0);
        double e0 = 0.0;
        for (int i = 0; i < N; i++)
            e0 += x0[i];

        for (int k = 1; k <= 100; k++) {
            // 1次元配列を表示
            System.out.print(String.format("%3d\t", k));
            disp_vector(x0);

            // 行列の積 x1 = A × x0
            double[] x1 = new double[N];
            for (int i = 0; i < N; i++)
                for (int j = 0; j < N; j++)
                    x1[i] += a[i][j] * x0[j];

            // 内積
            double p0 = 0.0;
            double p1 = 0.0;
            for (int i = 0; i < N; i++) {
                p0 += x1[i] * x1[i];
                p1 += x1[i] * x0[i];
            }
            // 固有値
            lambda = p0 / p1;

            // 正規化 (ベクトル x1 の長さを1にする)
            normarize(x1);
            // 収束判定
            double e1 = 0.0;
            for (int i = 0; i < N; i++)
                e1 += x1[i];
            if (Math.abs(e0 - e1) < 0.00000000001) break;

            for (int i = 0; i < N; i++)
                x0[i] = x1[i];
            e0 = e1;
        }
        return lambda;
    }

    // 1次元配列を表示
    private static void disp_vector(double[] row) {
        for (double col: row)
            System.out.print(String.format("%14.10f\t", col));
        System.out.println();
    }
    // 正規化 (ベクトルの長さを1にする)
    private static void normarize(double[] x) {
        double s = 0.0;

        for (int i = 0; i < N; i++)
            s += x[i] * x[i];
        s = Math.sqrt(s);

        for (int i = 0; i < N; i++)
            x[i] /= s;
    }
}
Z:\>javac Java1101.java

Z:\>java Java1101
  1   1.0000000000    0.0000000000    0.0000000000    0.0000000000
  2   0.7624928517    0.6099942813    0.1524985703    0.1524985703
  3   0.6745979924    0.6589096670    0.2353248811    0.2353248811
  4   0.6517382447    0.6501601860    0.2761602732    0.2761602732
  5   0.6421032522    0.6419452154    0.2963188771    0.2963188771
  6   0.6373267026    0.6373108932    0.3063082594    0.3063082594
  7   0.6349074765    0.6349058954    0.3112772079    0.3112772079
  8   0.6336860412    0.6336858831    0.3137548428    0.3137548428
  9   0.6330719648    0.6330719490    0.3149919005    0.3149919005
 10   0.6327640473    0.6327640457    0.3156099832    0.3156099832
省略
 26   0.6324555367    0.6324555367    0.3162277566    0.3162277566
 27   0.6324555344    0.6324555344    0.3162277613    0.3162277613
 28   0.6324555332    0.6324555332    0.3162277637    0.3162277637
 29   0.6324555326    0.6324555326    0.3162277648    0.3162277648
 30   0.6324555323    0.6324555323    0.3162277654    0.3162277654
 31   0.6324555322    0.6324555322    0.3162277657    0.3162277657
 32   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 33   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 34   0.6324555321    0.6324555321    0.3162277660    0.3162277660
 35   0.6324555320    0.6324555320    0.3162277660    0.3162277660

eigenvalue
 10.0000000000
eigenvector
  0.6324555320    0.6324555320    0.3162277660    0.3162277660

C++

#include <iostream>
#include <iomanip>
#include <math.h>
#include <vector>

using namespace std;

const int N = 4;

// ベキ乗法
double power(double a[N][N], double x0[N]);
// 1次元配列を表示
void disp_vector(double row[N]);
// 正規化 (ベクトルの長さを1にする)
void normarize(double x[N]);

// ベキ乗法で最大固有値を求める
int main()
{
    double a[N][N] = {{5.0, 4.0, 1.0, 1.0},
                      {4.0, 5.0, 1.0, 1.0},
                      {1.0, 1.0, 4.0, 2.0},
                      {1.0, 1.0, 2.0, 4.0}};
    double x[N]    =  {1.0 ,0.0 ,0.0 ,0.0};

    // ベキ乗法
    double lambda = power(a, x);

    cout << endl << "eigenvalue" << endl;
    cout << setw(14) << fixed << setprecision(10) << lambda;

    cout << endl << "eigenvector" << endl;
    disp_vector(x);

    return 0;
}

// ベキ乗法
double power(double a[N][N], double x0[N])
{
    double lambda = 0.0;

    // 正規化 (ベクトル x0 の長さを1にする)
    normarize(x0);
    double e0 = 0.0;
    for (int i = 0; i < N; i++)
        e0 += x0[i];

    for (int k = 1; k <= 200; k++)
    {
        // 1次元配列を表示
        cout << setw(3) << k << "\t";
        disp_vector(x0);

        // 行列の積 x1 = A × x0
        double x1[N] = {0.0 ,0.0 ,0.0 ,0.0};
        for (int i = 0; i < N; i++)
            for (int j = 0; j < N; j++)
                x1[i] += a[i][j] * x0[j];

        // 内積
        double p0 = 0.0;
        double p1 = 0.0;
        for (int i = 0; i < N; i++)
        {
            p0 += x1[i] * x1[i];
            p1 += x1[i] * x0[i];
        }
        // 固有値
        lambda = p0 / p1;

        // 正規化 (ベクトル x1 の長さを1にする)
        normarize(x1);
        // 収束判定
        double e1 = 0.0;
        for (int i = 0; i < N; i++)
            e1 += x1[i];
        if (fabs(e0 - e1) < 0.00000000001) break;

        for (int i = 0; i < N; i++)
            x0[i] = x1[i];
        e0 = e1;
    }
    return lambda;
}
// 1次元配列を表示
void disp_vector(double row[N])
{
    for (int i = 0; i < N; i++)
        cout << setw(14) << fixed << setprecision(10) << row[i] << "\t";
    cout << endl;
}
// 正規化 (ベクトルの長さを1にする)
void normarize(double x[N])
{
    double s = 0.0;

    for (int i = 0; i < N; i++)
        s += x[i] * x[i];
    s = sqrt(s);

    for (int i = 0; i < N; i++)
        x[i] /= s;
}
Z:\>bcc32 -q CP1101.cpp
cp1101.cpp:

Z:\>CP1101
  1   1.0000000000    0.0000000000    0.0000000000    0.0000000000
  2   0.7624928517    0.6099942813    0.1524985703    0.1524985703
  3   0.6745979924    0.6589096670    0.2353248811    0.2353248811
  4   0.6517382447    0.6501601860    0.2761602732    0.2761602732
  5   0.6421032522    0.6419452154    0.2963188771    0.2963188771
  6   0.6373267026    0.6373108932    0.3063082594    0.3063082594
  7   0.6349074765    0.6349058954    0.3112772079    0.3112772079
  8   0.6336860412    0.6336858831    0.3137548428    0.3137548428
  9   0.6330719648    0.6330719490    0.3149919005    0.3149919005
 10   0.6327640473    0.6327640457    0.3156099832    0.3156099832
省略
 26   0.6324555367    0.6324555367    0.3162277566    0.3162277566
 27   0.6324555344    0.6324555344    0.3162277613    0.3162277613
 28   0.6324555332    0.6324555332    0.3162277637    0.3162277637
 29   0.6324555326    0.6324555326    0.3162277648    0.3162277648
 30   0.6324555323    0.6324555323    0.3162277654    0.3162277654
 31   0.6324555322    0.6324555322    0.3162277657    0.3162277657
 32   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 33   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 34   0.6324555321    0.6324555321    0.3162277660    0.3162277660
 35   0.6324555320    0.6324555320    0.3162277660    0.3162277660

eigenvalue
 10.0000000000
eigenvector
  0.6324555320    0.6324555320    0.3162277660    0.3162277660

Objective-C

#import <Foundation/Foundation.h>
#import <math.h>

#define N 4

// ベキ乗法
double power(double a[N][N], double x0[N]);
// 1次元配列を表示
void disp_vector(double row[N]);
// 正規化 (ベクトルの長さを1にする)
void normarize(double x[N]);

// ベキ乗法で最大固有値を求める
int main()
{
    double a[N][N] = {{5.0, 4.0, 1.0, 1.0},
                      {4.0, 5.0, 1.0, 1.0},
                      {1.0, 1.0, 4.0, 2.0},
                      {1.0, 1.0, 2.0, 4.0}};
    double x[N]    =  {1.0 ,0.0 ,0.0 ,0.0};

    // ベキ乗法
    double lambda = power(a, x);

    printf("\neigenvalue\n");
    printf("%14.10f\n", lambda);

    printf("eigenvector\n");
    disp_vector(x);

    return 0;
}

// ベキ乗法
double power(double a[N][N], double x0[N])
{
    int i, j, k;
    double lambda = 0.0;

    // 正規化 (ベクトル x0 の長さを1にする)
    normarize(x0);
    double e0 = 0.0;
    for (i = 0; i < N; i++)
        e0 += x0[i];

    for (k = 1; k <= 200; k++)
    {
        // 1次元配列を表示
        printf("%3d\t", k);
        disp_vector(x0);

        // 行列の積 x1 = A × x0
        double x1[N] = {0.0 ,0.0 ,0.0 ,0.0};
        for (i = 0; i < N; i++)
            for (j = 0; j < N; j++)
                x1[i] += a[i][j] * x0[j];

        // 内積
        double p0 = 0.0;
        double p1 = 0.0;
        for (i = 0; i < N; i++)
        {
            p0 += x1[i] * x1[i];
            p1 += x1[i] * x0[i];
        }
        // 固有値
        lambda = p0 / p1;

        // 正規化 (ベクトル x1 の長さを1にする)
        normarize(x1);
        double e1 = 0.0;
        // 収束判定
        for (i = 0; i < N; i++)
            e1 += x1[i];
        if (fabs(e0 - e1) < 0.00000000001) break;

        for (i = 0; i < N; i++)
            x0[i] = x1[i];
        e0 = e1;
    }
    return lambda;
}
// 1次元配列を表示
void disp_vector(double row[N])
{
    int i;
    for (i = 0; i < N; i++)
        printf("%14.10f\t", row[i]);
    printf("\n");
}
// 正規化 (ベクトルの長さを1にする)
void normarize(double x[N])
{
    int i;
    double s = 0.0;

    for (i = 0; i < N; i++)
        s += x[i] * x[i];
    s = sqrt(s);

    for (i = 0; i < N; i++)
        x[i] /= s;
}
xxxxxx@yyyyyy /Z
$ gcc -o OC1101 OC1101.m -lobjc -lgnustep-base -I $INCLUDE -L $LIB $CFLAGS

xxxxxx@yyyyyy /Z
$ OC1101
  1   1.0000000000    0.0000000000    0.0000000000    0.0000000000
  2   0.7624928517    0.6099942813    0.1524985703    0.1524985703
  3   0.6745979924    0.6589096670    0.2353248811    0.2353248811
  4   0.6517382447    0.6501601860    0.2761602732    0.2761602732
  5   0.6421032522    0.6419452154    0.2963188771    0.2963188771
  6   0.6373267026    0.6373108932    0.3063082594    0.3063082594
  7   0.6349074765    0.6349058954    0.3112772079    0.3112772079
  8   0.6336860412    0.6336858831    0.3137548428    0.3137548428
  9   0.6330719648    0.6330719490    0.3149919005    0.3149919005
 10   0.6327640473    0.6327640457    0.3156099832    0.3156099832
省略
 26   0.6324555367    0.6324555367    0.3162277566    0.3162277566
 27   0.6324555344    0.6324555344    0.3162277613    0.3162277613
 28   0.6324555332    0.6324555332    0.3162277637    0.3162277637
 29   0.6324555326    0.6324555326    0.3162277648    0.3162277648
 30   0.6324555323    0.6324555323    0.3162277654    0.3162277654
 31   0.6324555322    0.6324555322    0.3162277657    0.3162277657
 32   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 33   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 34   0.6324555321    0.6324555321    0.3162277660    0.3162277660
 35   0.6324555320    0.6324555320    0.3162277660    0.3162277660

eigenvalue
 10.0000000000
eigenvector
  0.6324555320    0.6324555320    0.3162277660    0.3162277660

D

import std.stdio;
import std.math;

const int N = 4;

// ベキ乗法で最大固有値を求める
void main(string[] args)
{
    double a[N][N] = [[5.0, 4.0, 1.0, 1.0],
                      [4.0, 5.0, 1.0, 1.0],
                      [1.0, 1.0, 4.0, 2.0],
                      [1.0, 1.0, 2.0, 4.0]];
    double x[N]    =  [1.0 ,0.0 ,0.0 ,0.0];

    // ベキ乗法
    double lambda = power(a, x);

    writefln("\neigenvalue");
    writefln("%14.10f", lambda);

    writefln("eigenvector");
    disp_vector(x);
}

// ベキ乗法
double power(double[N][N] a, ref double[N] x0)
{
    double lambda = 0.0;

    // 正規化 (ベクトル x0 の長さを1にする)
    normarize(x0);
    double e0 = 0.0;
    foreach (i; 0..N)
        e0 += x0[i];

    foreach (k; 1..200)
    {
        // 1次元配列を表示
        writef("%3d\t", k);
        disp_vector(x0);

        // 行列の積 x1 = A × x0
        double[N] x1 = [0.0 ,0.0 ,0.0 ,0.0];
        foreach (i; 0..N)
            foreach (j; 0..N)
                x1[i] += a[i][j] * x0[j];

        // 内積
        double p0 = 0.0;
        double p1 = 0.0;
        foreach (i; 0..N)
        {
            p0 += x1[i] * x1[i];
            p1 += x1[i] * x0[i];
        }
        // 固有値
        lambda = p0 / p1;

        // 正規化 (ベクトル x1 の長さを1にする)
        normarize(x1);
        double e1 = 0.0;
        // 収束判定
        foreach (i; 0..N)
            e1 += x1[i];
        if (fabs(e0 - e1) < 0.00000000001) break;

        foreach (i; 0..N)
            x0[i] = x1[i];
        e0 = e1;
    }
    return lambda;
}
// 1次元配列を表示
void disp_vector(double[N] row)
{
    foreach(col; row)
        writef("%14.10f\t", col);
    writefln("");
}
// 正規化 (ベクトルの長さを1にする)
void normarize(ref double[N] x)
{
    double s = 0.0;

    foreach (i; 0..N)
        s += x[i] * x[i];
    s = sqrt(s);

    foreach (i; 0..N)
        x[i] /= s;
}
Z:\>dmd D1101.d

Z:\>D1101
  1   1.0000000000    0.0000000000    0.0000000000    0.0000000000
  2   0.7624928517    0.6099942813    0.1524985703    0.1524985703
  3   0.6745979924    0.6589096670    0.2353248811    0.2353248811
  4   0.6517382447    0.6501601860    0.2761602732    0.2761602732
  5   0.6421032522    0.6419452154    0.2963188771    0.2963188771
  6   0.6373267026    0.6373108932    0.3063082594    0.3063082594
  7   0.6349074765    0.6349058954    0.3112772079    0.3112772079
  8   0.6336860412    0.6336858831    0.3137548428    0.3137548428
  9   0.6330719648    0.6330719490    0.3149919005    0.3149919005
 10   0.6327640473    0.6327640457    0.3156099832    0.3156099832
省略
 26   0.6324555367    0.6324555367    0.3162277566    0.3162277566
 27   0.6324555344    0.6324555344    0.3162277613    0.3162277613
 28   0.6324555332    0.6324555332    0.3162277637    0.3162277637
 29   0.6324555326    0.6324555326    0.3162277648    0.3162277648
 30   0.6324555323    0.6324555323    0.3162277654    0.3162277654
 31   0.6324555322    0.6324555322    0.3162277657    0.3162277657
 32   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 33   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 34   0.6324555321    0.6324555321    0.3162277660    0.3162277660
 35   0.6324555320    0.6324555320    0.3162277660    0.3162277660

eigenvalue
 10.0000000000
eigenvector
  0.6324555320    0.6324555320    0.3162277660    0.3162277660

Go

package main

import "fmt"
import "math"

const N = 4

// ベキ乗法で最大固有値を求める
func main() {
    var a [N][N]float64 = [N][N]float64{{5.0, 4.0, 1.0, 1.0},
                                        {4.0, 5.0, 1.0, 1.0},
                                        {1.0, 1.0, 4.0, 2.0},
                                        {1.0, 1.0, 2.0, 4.0}}
    var x               = []float64     {1.0 ,0.0 ,0.0 ,0.0}

    // ベキ乗法
    var lambda float64 = power(a, x)

    fmt.Println("\neigenvalue")
    fmt.Printf("%14.10f\n", lambda)

    fmt.Println("eigenvector")
    disp_vector(x)
}

// ベキ乗法
func power(a[N][N]float64, x0[]float64) float64 {
    var lambda float64 = 0.0

    // 正規化 (ベクトル x0 の長さを1にする)
    normarize(x0)
    var e0 float64 = 0.0
    for i := 0; i < N; i++ {
        e0 += x0[i]
    }

    for k := 1; k < 200; k++ {
        // 1次元配列を表示
        fmt.Printf("%3d\t", k)
        disp_vector(x0)

        // 行列の積 x1 = A × x0
        var x1 = []float64  {0.0 ,0.0 ,0.0 ,0.0}
        for i := 0; i < N; i++ {
            for j := 0; j < N; j++ {
                x1[i] += a[i][j] * x0[j]
            }
        }

        // 内積
        var p0 float64 = 0.0
        var p1 float64 = 0.0
        for i := 0; i < N; i++ {
            p0 += x1[i] * x1[i]
            p1 += x1[i] * x0[i]
        }
        // 固有値
        lambda = p0 / p1

        // 正規化 (ベクトル x1 の長さを1にする)
        normarize(x1)
        var e1 float64 = 0.0
        // 収束判定
        for i := 0; i < N; i++ {
            e1 += x1[i]
        }
        if (math.Abs(e0 - e1) < 0.00000000001) {
            break
        }

        for i := 0; i < N; i++ {
            x0[i] = x1[i]
        }
        e0 = e1
    }
    return lambda
}
// 1次元配列を表示
func disp_vector(row[]float64) {
    for _, col := range row {
        fmt.Printf("%14.10f\t", col)
    }
    fmt.Println("")
}
// 正規化 (ベクトルの長さを1にする)
func normarize(x[]float64) {
    var s float64 = 0.0

    for i := 0; i < N; i++ {
        s += x[i] * x[i]
    }
    s = math.Sqrt(s)

    for i := 0; i < N; i++ {
        x[i] /= s
    }
}
Z:\>go run GO1101.go
  1   1.0000000000    0.0000000000    0.0000000000    0.0000000000
  2   0.7624928517    0.6099942813    0.1524985703    0.1524985703
  3   0.6745979924    0.6589096670    0.2353248811    0.2353248811
  4   0.6517382447    0.6501601860    0.2761602732    0.2761602732
  5   0.6421032522    0.6419452154    0.2963188771    0.2963188771
  6   0.6373267026    0.6373108932    0.3063082594    0.3063082594
  7   0.6349074765    0.6349058954    0.3112772079    0.3112772079
  8   0.6336860412    0.6336858831    0.3137548428    0.3137548428
  9   0.6330719648    0.6330719490    0.3149919005    0.3149919005
 10   0.6327640473    0.6327640457    0.3156099832    0.3156099832
省略
 26   0.6324555367    0.6324555367    0.3162277566    0.3162277566
 27   0.6324555344    0.6324555344    0.3162277613    0.3162277613
 28   0.6324555332    0.6324555332    0.3162277637    0.3162277637
 29   0.6324555326    0.6324555326    0.3162277648    0.3162277648
 30   0.6324555323    0.6324555323    0.3162277654    0.3162277654
 31   0.6324555322    0.6324555322    0.3162277657    0.3162277657
 32   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 33   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 34   0.6324555321    0.6324555321    0.3162277660    0.3162277660
 35   0.6324555320    0.6324555320    0.3162277660    0.3162277660

eigenvalue
 10.0000000000
eigenvector
  0.6324555320    0.6324555320    0.3162277660    0.3162277660

Scala

object Scala1101 {
    val N = 3

    // ベキ乗法で最大固有値を求める
    def main(args: Array[String]) {
        var a:Array[Array[Double]] = Array(Array(5.0, 4.0, 1.0, 1.0)
                                          ,Array(4.0, 5.0, 1.0, 1.0)
                                          ,Array(1.0, 1.0, 4.0, 2.0)
                                          ,Array(1.0, 1.0, 2.0, 4.0))

        var x:Array[Double] =              Array(1.0 ,0.0 ,0.0 ,0.0)

        // ベキ乗法
        val (lambda, x1) = power(a, x)

        println()
        println("eigenvalue")
        println("%14.10f".format(lambda))

        println("eigenvector")
        disp_vector(x1)
    }

    // ベキ乗法
    def power(a:Array[Array[Double]], x:Array[Double]): (Double, Array[Double]) = {
        var x0:Array[Double] = normarize(x)
        var x1:Array[Double] = Array(0.0 ,0.0 ,0.0 ,0.0)
        var lambda:Double    = 0.0
        var e:Double         = 0.0
        var k = 1
        do {
            e  = x0.sum
            // 1次元配列を表示
            print("%3d\t".format(k))
            disp_vector(x0)
            k += 1

            // 行列の積 x1 = A × x0
            x1 = Array(0.0 ,0.0 ,0.0 ,0.0)
            for (i <- 0 to N)
                for (j <- 0 to N)
                    x1(i) += a(i)(j) * x0(j)

            // 内積
            var (t1, t2) = (x0 zip x1).map(t => t match {case (f, s) => (s * s, s * f)}).unzip
            // 固有値
            lambda = t1.sum / t2.sum

            // 正規化 (ベクトル x1 の長さを1にする)
            x1 = normarize(x1)
            x0 = x1.clone
        } while (k <= 100 && Math.abs(e - x1.sum) >= 0.00000000001)

        return (lambda, x0)
    }

    // 1次元配列を表示
    def disp_vector(row:Array[Double]) = {
        row.foreach { col =>
            print("%14.10f\t".format(col))
        }
        println()
    }
    // 正規化 (ベクトルの長さを1にする)
    def normarize(x:Array[Double]):Array[Double] = {
        var s:Double = x.map(n => n * n).sum
        s = Math.sqrt(s)
        x.map(n => n / s)
    }
}
Z:\>scala Scala1101.scala
  1   1.0000000000    0.0000000000    0.0000000000    0.0000000000
  2   0.7624928517    0.6099942813    0.1524985703    0.1524985703
  3   0.6745979924    0.6589096670    0.2353248811    0.2353248811
  4   0.6517382447    0.6501601860    0.2761602732    0.2761602732
  5   0.6421032522    0.6419452154    0.2963188771    0.2963188771
  6   0.6373267026    0.6373108932    0.3063082594    0.3063082594
  7   0.6349074765    0.6349058954    0.3112772079    0.3112772079
  8   0.6336860412    0.6336858831    0.3137548428    0.3137548428
  9   0.6330719648    0.6330719490    0.3149919005    0.3149919005
 10   0.6327640473    0.6327640457    0.3156099832    0.3156099832
省略
 26   0.6324555367    0.6324555367    0.3162277566    0.3162277566
 27   0.6324555344    0.6324555344    0.3162277613    0.3162277613
 28   0.6324555332    0.6324555332    0.3162277637    0.3162277637
 29   0.6324555326    0.6324555326    0.3162277648    0.3162277648
 30   0.6324555323    0.6324555323    0.3162277654    0.3162277654
 31   0.6324555322    0.6324555322    0.3162277657    0.3162277657
 32   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 33   0.6324555321    0.6324555321    0.3162277659    0.3162277659
 34   0.6324555321    0.6324555321    0.3162277660    0.3162277660
 35   0.6324555320    0.6324555320    0.3162277660    0.3162277660

eigenvalue
 10.0000000000
eigenvector
  0.6324555320    0.6324555320    0.3162277660    0.3162277660

F#

module Fs1101

open System

let N = 3

// 1次元配列を表示
let disp_vector (row:float[]) =
    row |> Array.iter (fun x -> printf "%14.10f" x)
    printfn ""

// 正規化 (ベクトルの長さを1にする)
let normarize(x:float[]):float[] =
    let s = x |> Array.map (fun n -> n * n) |> Array.sum

    x |> Array.map(fun n -> n / Math.Sqrt(s))

// ベキ乗法
let power (a:float[][]) (x:float[]) : float * float[] =
    let mutable x0:float[] = normarize x
    let mutable x1:float[] = [|0.0 ;0.0 ;0.0 ;0.0|]

    let mutable lambda = 0.0
    let mutable e      = 0.0
    let mutable k      = 1
    let mutable sw     = true
    while sw || (k <= 100 && Math.Abs(e - (x1 |> Array.sum)) >= 0.00000000001) do
        if sw then sw <- false

        e <- x0 |> Array.sum
        // 1次元配列を表示
        printf "%3d\t" k
        disp_vector x0
        k <- k + 1

        // 行列の積 x1 = A × x0
        x1 <- [|0.0 ;0.0 ;0.0 ;0.0|]
        for i in [0..N] do
            for j in [0..N] do
                x1.[i] <- x1.[i] + a.[i].[j] * x0.[j]

        // 内積
        let t1, t2 = Array.zip x0 x1
                    |> Array.map(fun t -> match t with | (f, s) -> (s * s, s * f))
                    |> Array.unzip

        // 固有値
        lambda <- (t2 |> Array.sum) / (t1 |> Array.sum)

        // 正規化 (ベクトル x1 の長さを1にする)
        x1 <- normarize x1
        x0 <-  Array.copy x1

    (lambda, x0)

// ベキ乗法で最大固有値を求める

let mutable a:float[][] = [| [|5.0; 4.0; 1.0; 1.0|];
                             [|4.0; 5.0; 1.0; 1.0|];
                             [|1.0; 1.0; 4.0; 2.0|];
                             [|1.0; 1.0; 2.0; 4.0|] |]
let mutable x:float[]   =    [|1.0 ;0.0 ;0.0 ;0.0|]

// ベキ乗法
let (lambda, x1) = power a x

printfn ""
printfn "eigenvalue"
printfn "%14.10f" lambda

printfn "eigenvector"
disp_vector x1

exit 0
Z:\>fsi  --nologo --quiet Fs1101.fs
  1   1.0000000000  0.0000000000  0.0000000000  0.0000000000
  2   0.7624928517  0.6099942813  0.1524985703  0.1524985703
  3   0.6745979924  0.6589096670  0.2353248811  0.2353248811
  4   0.6517382447  0.6501601860  0.2761602732  0.2761602732
  5   0.6421032522  0.6419452154  0.2963188771  0.2963188771
  6   0.6373267026  0.6373108932  0.3063082594  0.3063082594
  7   0.6349074765  0.6349058954  0.3112772079  0.3112772079
  8   0.6336860412  0.6336858831  0.3137548428  0.3137548428
  9   0.6330719648  0.6330719490  0.3149919005  0.3149919005
 10   0.6327640473  0.6327640457  0.3156099832  0.3156099832
省略
 26   0.6324555367  0.6324555367  0.3162277566  0.3162277566
 27   0.6324555344  0.6324555344  0.3162277613  0.3162277613
 28   0.6324555332  0.6324555332  0.3162277637  0.3162277637
 29   0.6324555326  0.6324555326  0.3162277648  0.3162277648
 30   0.6324555323  0.6324555323  0.3162277654  0.3162277654
 31   0.6324555322  0.6324555322  0.3162277657  0.3162277657
 32   0.6324555321  0.6324555321  0.3162277659  0.3162277659
 33   0.6324555321  0.6324555321  0.3162277659  0.3162277659
 34   0.6324555321  0.6324555321  0.3162277660  0.3162277660
 35   0.6324555320  0.6324555320  0.3162277660  0.3162277660

eigenvalue
  0.1000000000
eigenvector
  0.6324555320  0.6324555320  0.3162277660  0.3162277660

Clojure

Haskell

inserted by FC2 system