How to resolve the algorithm Conjugate transpose step by step in the Raku programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm Conjugate transpose step by step in the Raku programming language

Table of Contents

Problem Statement

Suppose that a matrix

M

{\displaystyle M}

contains complex numbers. Then the conjugate transpose of

M

{\displaystyle M}

is a matrix

M

H

{\displaystyle M^{H}}

containing the complex conjugates of the matrix transposition of

M

{\displaystyle M}

.

This means that row

j

{\displaystyle j}

, column

i

{\displaystyle i}

of the conjugate transpose equals the complex conjugate of row

i

{\displaystyle i}

, column

j

{\displaystyle j}

of the original matrix.

In the next list,

M

{\displaystyle M}

must also be a square matrix.

Given some matrix of complex numbers, find its conjugate transpose. Also determine if the matrix is a:

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Conjugate transpose step by step in the Raku programming language

Source code in the raku programming language

for [ # Test Matrices
       [   1, 1+i, 2i],
       [ 1-i,   5, -3],
       [0-2i,  -3,  0]
    ],
    [
       [1, 1, 0],
       [0, 1, 1],
       [1, 0, 1]
    ],
    [
       [0.707 ,    0.707,  0],
       [0.707i, 0-0.707i,  0],
       [0     ,        0,  i]
    ]
    -> @m {
        say "\nMatrix:";
        @m.&say-it;
        my @t = @m».conj.&mat-trans;
        say "\nTranspose:";
        @t.&say-it;
        say "Is Hermitian?\t{is-Hermitian(@m, @t)}";
        say "Is Normal?\t{is-Normal(@m, @t)}";
        say "Is Unitary?\t{is-Unitary(@m, @t)}";
    }

sub is-Hermitian (@m, @t, --> Bool) {
    so @m».Complex eqv @t».Complex
 }

sub is-Normal (@m, @t, --> Bool) {
    so mat-mult(@m, @t)».Complex eqv mat-mult(@t, @m)».Complex
}

sub is-Unitary (@m, @t, --> Bool) {
    so mat-mult(@m, @t, 1e-3)».Complex eqv mat-ident(+@m)».Complex;
}

sub mat-trans (@m) { map { [ @m[*;$_] ] }, ^@m[0] }

sub mat-ident ($n) { [ map { [ flat 0 xx $_, 1, 0 xx $n - 1 - $_ ] }, ^$n ] }

sub mat-mult (@a, @b, \ε = 1e-15) {
    my @p;
    for ^@a X ^@b[0] -> ($r, $c) {
        @p[$r][$c] += @a[$r][$_] * @b[$_][$c] for ^@b;
        @p[$r][$c].=round(ε); # avoid floating point math errors
    }
    @p
}

sub say-it (@array) { $_».fmt("%9s").say for @array }


  

You may also check:How to resolve the algorithm Loops/Break step by step in the Lua programming language
You may also check:How to resolve the algorithm Largest proper divisor of n step by step in the Mathematica / Wolfram Language programming language
You may also check:How to resolve the algorithm Associative array/Iteration step by step in the Go programming language
You may also check:How to resolve the algorithm Pathological floating point problems step by step in the 360 Assembly programming language
You may also check:How to resolve the algorithm Y combinator step by step in the MANOOL programming language