Kronecker product based fractals: Difference between revisions

From Rosetta Code
Content added Content deleted
m (→‎{{header|Factor}}: update for new matrix vocabulary)
(Added FreeBASIC)
 
(29 intermediate revisions by 13 users not shown)
Line 54: Line 54:
See implementations and results below in JavaScript, PARI/GP and R languages. They have additional samples of "H", "+" and checkerboard fractals.
See implementations and results below in JavaScript, PARI/GP and R languages. They have additional samples of "H", "+" and checkerboard fractals.
<br><br>
<br><br>

=={{header|11l}}==
{{trans|Nim}}

<syntaxhighlight lang="11l">F kroneckerProduct(a, b)
V m = a.len
V n = a[0].len
V p = b.len
V q = b[0].len
V result = [[0] * (n * q)] * (m * p)
L(i) 0 .< m
L(j) 0 .< n
L(k) 0 .< p
L(l) 0 .< q
result[i * p + k][j * q + l] = a[i][j] * b[k][l]
R result

F kroneckerPower(m, n)
V result = m
L 2..n
result = kroneckerProduct(result, m)
R result

F to_str(m)
V result = ‘’
L(row) m
L(val) row
result ‘’= I val == 0 {‘ ’} E ‘ *’
result ‘’= "\n"
R result

V a1 = [[0, 1, 0], [1, 1, 1], [0, 1, 0]]
print(‘Vicsek fractal:’)
print(to_str(kroneckerPower(a1, 4)))
print()
V a2 = [[1, 1, 1], [1, 0, 1], [1, 1, 1]]
print(‘Sierpinski carpet fractal:’)
print(to_str(kroneckerPower(a2, 4)))</syntaxhighlight>

{{out}}
The same as in Nim solution.

=={{header|Action!}}==
The user must type in the monitor the following command after compilation and before running the program!<pre>SET EndProg=*</pre>
{{libheader|Action! Tool Kit}}
<syntaxhighlight lang="action!">CARD EndProg ;required for ALLOCATE.ACT

INCLUDE "D2:ALLOCATE.ACT" ;from the Action! Tool Kit. You must type 'SET EndProg=*' from the monitor after compiling, but before running this program!

DEFINE PTR="CARD"
DEFINE MATRIX_SIZE="4"
TYPE Matrix=[
BYTE width,height
PTR data]

PTR FUNC CreateEmpty(BYTE w,h)
Matrix POINTER m

m=Alloc(MATRIX_SIZE)
m.width=w
m.height=h
m.data=Alloc(w*h)
RETURN (m)

PTR FUNC Create(BYTE w,h BYTE ARRAY a)
Matrix POINTER m

m=CreateEmpty(w,h)
MoveBlock(m.data,a,w*h)
RETURN (m)

PROC Destroy(Matrix POINTER m)
Free(m.data,m.width*m.height)
Free(m,MATRIX_SIZE)
RETURN

PTR FUNC Product(Matrix POINTER m1,m2)
Matrix POINTER m
BYTE x1,x2,y1,y2
INT i1,i2,i
BYTE ARRAY a1,a2,a

m=CreateEmpty(m1.width*m2.width,m1.height*m2.height)
a1=m1.data
a2=m2.data
a=m.data
i=0
FOR y1=0 TO m1.height-1
DO
FOR y2=0 TO m2.height-1
DO
FOR x1=0 TO m1.width-1
DO
FOR x2=0 TO m2.width-1
DO
i1=y1*m1.width+x1
i2=y2*m2.width+x2
a(i)=a1(i1)*a2(i2)
i==+1
OD
OD
OD
OD
RETURN (m)

PROC DrawMatrix(Matrix POINTER m INT x,y)
INT i,j
BYTE ARRAY d

d=m.data
FOR j=0 TO m.height-1
DO
FOR i=0 TO m.width-1
DO
IF d(j*m.width+i) THEN
Plot(x+i,y+j)
FI
OD
OD
RETURN

PROC DrawFractal(BYTE ARRAY a BYTE w,h INT x,y BYTE n)
Matrix POINTER m1,m2,m3
BYTE i
m1=Create(w,h,a)
m2=Create(w,h,a)
FOR i=1 TO n
DO
m3=Product(m1,m2)
IF i<n THEN
Destroy(m1)
m1=m3 m3=0
FI
OD

DrawMatrix(m3,x,y)

Destroy(m1)
Destroy(m2)
Destroy(m3)
RETURN

PROC Main()
BYTE CH=$02FC,COLOR1=$02C5,COLOR2=$02C6
BYTE ARRAY a=[0 1 0 1 1 1 0 1 0],
b=[1 1 1 1 0 1 1 1 1],
c=[1 0 1 0 1 0 1 0 1]

Graphics(8+16)
AllocInit(0)
Color=1
COLOR1=$0C
COLOR2=$02

DrawFractal(a,3,3,12,55,3)
DrawFractal(b,3,3,120,55,3)
DrawFractal(c,3,3,226,55,3)

DO UNTIL CH#$FF OD
CH=$FF
RETURN</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Kronecker_product_based_fractals.png Screenshot from Atari 8-bit computer]


=={{header|Ada}}==
=={{header|Ada}}==
{{libheader|SDLAda}} Using multiplication function from Kronecker product.
{{libheader|SDLAda}} Using multiplication function from Kronecker product.
<lang Ada>with SDL.Video.Windows.Makers;
<syntaxhighlight lang="ada">with SDL.Video.Windows.Makers;
with SDL.Video.Renderers.Makers;
with SDL.Video.Renderers.Makers;
with SDL.Events.Events;
with SDL.Events.Events;
Line 170: Line 334:
Window.Finalize;
Window.Finalize;
SDL.Finalise;
SDL.Finalise;
end Kronecker_Fractals;</lang>
end Kronecker_Fractals;</syntaxhighlight>

=={{header|ALGOL 68}}==
<syntaxhighlight lang="algol68">
BEGIN # Kronecker product based fractals - translated from the Kotlin sample #

MODE MATRIX = FLEX[ 1 : 0, 1 : 0 ]INT;

PROC kronecker product = ( MATRIX a in, b in )MATRIX:
BEGIN
MATRIX a = a in[ AT 0, AT 0 ], b = b in[ AT 0, AT 0 ];
INT m = 1 UPB a + 1, n = 2 UPB a + 1;
INT p = 1 UPB b + 1, q = 2 UPB b + 1;
INT rtn = m * p, ctn = n * q;
[ 0 : rtn - 1, 0 : ctn - 1 ]INT r;
FOR i FROM 0 TO rtn - 1 DO FOR j FROM 0 TO ctn - 1 DO r[ i, j ] := 0 OD OD;
FOR i FROM 0 TO m - 1 DO
FOR j FROM 0 TO n - 1 DO
FOR k FROM 0 TO p - 1 DO
FOR l FROM 0 TO q - 1 DO
r[ p * i + k, q * j + l ] := a[ i, j ] * b[ k, l ]
OD
OD
OD
OD;
r
END # kronecker product # ;

PROC kronecker power = ( MATRIX a, INT n )MATRIX:
BEGIN
MATRIX pow := a;
FOR i TO n - 1 DO pow := kronecker product( pow, a ) OD;
pow
END # kronecker power # ;

PROC print matrix = ( STRING text, MATRIX m )VOID:
BEGIN
print( ( text, " fractal :", newline ) );
FOR i FROM 1 LWB m TO 1 UPB m DO
FOR j FROM 2 LWB m TO 2 UPB m DO
print( ( IF m[ i, j ] = 1 THEN "*" ELSE " " FI ) )
OD;
print( ( newline ) )
OD;
print( ( newline ) )
END # print matrix # ;

MATRIX a := MATRIX( ( 0, 1, 0 )
, ( 1, 1, 1 )
, ( 0, 1, 0 )
);
print matrix( "Vicsek", kronecker power( a, 4 ) );

a := MATRIX( ( 1, 1, 1 )
, ( 1, 0, 1 )
, ( 1, 1, 1 )
);
print matrix( "Sierpinski carpet", kronecker power( a, 4 ) )
END
</syntaxhighlight>
{{out}}
Same as the Kotlin sample.


=={{header|C}}==
=={{header|C}}==
Line 178: Line 403:


Thus this implementation treats the initial matrix as a [https://en.wikipedia.org/wiki/Sparse_matrix Sparse matrix]. Doing so cuts down drastically on the required storage and number of operations. The graphical part needs the [http://www.cs.colorado.edu/~main/bgi/cs1300/ WinBGIm] library.
Thus this implementation treats the initial matrix as a [https://en.wikipedia.org/wiki/Sparse_matrix Sparse matrix]. Doing so cuts down drastically on the required storage and number of operations. The graphical part needs the [http://www.cs.colorado.edu/~main/bgi/cs1300/ WinBGIm] library.
<syntaxhighlight lang="c">
<lang C>
#include<graphics.h>
#include<graphics.h>
#include<stdlib.h>
#include<stdlib.h>
Line 184: Line 409:


typedef struct{
typedef struct{
int row, col;
int row, col;
}cell;
}cell;


Line 190: Line 415:


unsigned long raiseTo(int base,int power){
unsigned long raiseTo(int base,int power){
if(power==0)
if(power==0)
return 1;
return 1;
else
else
return base*raiseTo(base,power-1);
return base*raiseTo(base,power-1);
}
}


cell* kroneckerProduct(char* inputFile,int power){
cell* kroneckerProduct(char* inputFile,int power){
FILE* fp = fopen(inputFile,"r");
FILE* fp = fopen(inputFile,"r");
int i,j,k,l;
int i,j,k,l;
unsigned long prod;
unsigned long prod;
int** matrix;
int** matrix;
cell *coreList,*tempList,*resultList;
cell *coreList,*tempList,*resultList;
fscanf(fp,"%d%d",&ROW,&COL);
fscanf(fp,"%d%d",&ROW,&COL);
matrix = (int**)malloc(ROW*sizeof(int*));
matrix = (int**)malloc(ROW*sizeof(int*));
for(i=0;i<ROW;i++){
for(i=0;i<ROW;i++){
matrix[i] = (int*)malloc(COL*sizeof(int));
matrix[i] = (int*)malloc(COL*sizeof(int));
for(j=0;j<COL;j++){
for(j=0;j<COL;j++){
fscanf(fp,"%d",&matrix[i][j]);
fscanf(fp,"%d",&matrix[i][j]);
if(matrix[i][j]==1)
if(matrix[i][j]==1)
SUM++;
SUM++;
}
}
}
}
coreList = (cell*)malloc(SUM*sizeof(cell));
coreList = (cell*)malloc(SUM*sizeof(cell));
resultList = (cell*)malloc(SUM*sizeof(cell));
resultList = (cell*)malloc(SUM*sizeof(cell));
k = 0;
k = 0;
for(i=0;i<ROW;i++){
for(i=0;i<ROW;i++){
for(j=0;j<COL;j++){
for(j=0;j<COL;j++){
if(matrix[i][j]==1){
if(matrix[i][j]==1){
coreList[k].row = i+1;
coreList[k].row = i+1;
coreList[k].col = j+1;
coreList[k].col = j+1;
resultList[k].row = i+1;
resultList[k].row = i+1;
resultList[k].col = j+1;
resultList[k].col = j+1;
k++;
k++;
}
}
}
}
}
}
prod = k;
prod = k;
for(i=2;i<=power;i++){
for(i=2;i<=power;i++){
tempList = (cell*)malloc(prod*k*sizeof(cell));
tempList = (cell*)malloc(prod*k*sizeof(cell));
l = 0;
l = 0;
for(j=0;j<prod;j++){
for(j=0;j<prod;j++){
for(k=0;k<SUM;k++){
for(k=0;k<SUM;k++){
tempList[l].row = (resultList[j].row-1)*ROW + coreList[k].row;
tempList[l].row = (resultList[j].row-1)*ROW + coreList[k].row;
tempList[l].col = (resultList[j].col-1)*COL + coreList[k].col;
tempList[l].col = (resultList[j].col-1)*COL + coreList[k].col;
l++;
l++;
}
}
}
}
free(resultList);
free(resultList);
prod *= k;
prod *= k;
resultList = (cell*)malloc(prod*sizeof(cell));
resultList = (cell*)malloc(prod*sizeof(cell));
for(j=0;j<prod;j++){
for(j=0;j<prod;j++){
resultList[j].row = tempList[j].row;
resultList[j].row = tempList[j].row;
resultList[j].col = tempList[j].col;
resultList[j].col = tempList[j].col;
}
}
free(tempList);
free(tempList);
}
}
return resultList;
return resultList;
}
}


int main(){
int main(){
char fileName[100];
char fileName[100];
int power,i,length;
int power,i,length;
cell* resultList;
cell* resultList;
printf("Enter input file name : ");
printf("Enter input file name : ");
scanf("%s",fileName);
scanf("%s",fileName);
printf("Enter power : ");
printf("Enter power : ");
scanf("%d",&power);
scanf("%d",&power);
resultList = kroneckerProduct(fileName,power);
resultList = kroneckerProduct(fileName,power);
initwindow(raiseTo(ROW,power),raiseTo(COL,power),"Kronecker Product Fractal");
initwindow(raiseTo(ROW,power),raiseTo(COL,power),"Kronecker Product Fractal");
length = raiseTo(SUM,power);
length = raiseTo(SUM,power);


for(i=0;i<length;i++){
for(i=0;i<length;i++){
putpixel(resultList[i].row,resultList[i].col,15);
putpixel(resultList[i].row,resultList[i].col,15);
}
}
getch();
getch();
closegraph();
closegraph();
return 0;
return 0;
}
}
</syntaxhighlight>
</lang>

=={{header|C++}}==
{{libheader|Qt}}
This program produces image files in PNG format. The C++ code from [[Kronecker product| Kronecker product]] is reused here.
<syntaxhighlight lang="cpp">#include <cassert>
#include <vector>

#include <QImage>

template <typename scalar_type> class matrix {
public:
matrix(size_t rows, size_t columns)
: rows_(rows), columns_(columns), elements_(rows * columns) {}
matrix(size_t rows, size_t columns,
const std::initializer_list<std::initializer_list<scalar_type>>& values)
: rows_(rows), columns_(columns), elements_(rows * columns) {
assert(values.size() <= rows_);
size_t i = 0;
for (const auto& row : values) {
assert(row.size() <= columns_);
std::copy(begin(row), end(row), &elements_[i]);
i += columns_;
}
}
size_t rows() const { return rows_; }
size_t columns() const { return columns_; }

const scalar_type& operator()(size_t row, size_t column) const {
assert(row < rows_);
assert(column < columns_);
return elements_[row * columns_ + column];
}
scalar_type& operator()(size_t row, size_t column) {
assert(row < rows_);
assert(column < columns_);
return elements_[row * columns_ + column];
}
private:
size_t rows_;
size_t columns_;
std::vector<scalar_type> elements_;
};

// See https://en.wikipedia.org/wiki/Kronecker_product
template <typename scalar_type>
matrix<scalar_type> kronecker_product(const matrix<scalar_type>& a,
const matrix<scalar_type>& b) {
size_t arows = a.rows();
size_t acolumns = a.columns();
size_t brows = b.rows();
size_t bcolumns = b.columns();
matrix<scalar_type> c(arows * brows, acolumns * bcolumns);
for (size_t i = 0; i < arows; ++i)
for (size_t j = 0; j < acolumns; ++j)
for (size_t k = 0; k < brows; ++k)
for (size_t l = 0; l < bcolumns; ++l)
c(i*brows + k, j*bcolumns + l) = a(i, j) * b(k, l);
return c;
}

bool kronecker_fractal(const char* fileName, const matrix<unsigned char>& m, int order) {
matrix<unsigned char> result = m;
for (int i = 0; i < order; ++i)
result = kronecker_product(result, m);

size_t height = result.rows();
size_t width = result.columns();
size_t bytesPerLine = 4 * ((width + 3)/4);
std::vector<uchar> imageData(bytesPerLine * height);

for (size_t i = 0; i < height; ++i)
for (size_t j = 0; j < width; ++j)
imageData[i * bytesPerLine + j] = result(i, j);

QImage image(&imageData[0], width, height, bytesPerLine, QImage::Format_Indexed8);
QVector<QRgb> colours(2);
colours[0] = qRgb(0, 0, 0);
colours[1] = qRgb(255, 255, 255);
image.setColorTable(colours);
return image.save(fileName);
}

int main() {
matrix<unsigned char> matrix1(3, 3, {{0,1,0}, {1,1,1}, {0,1,0}});
matrix<unsigned char> matrix2(3, 3, {{1,1,1}, {1,0,1}, {1,1,1}});
matrix<unsigned char> matrix3(2, 2, {{1,1}, {0,1}});
kronecker_fractal("vicsek.png", matrix1, 5);
kronecker_fractal("sierpinski_carpet.png", matrix2, 5);
kronecker_fractal("sierpinski_triangle.png", matrix3, 8);
return 0;
}</syntaxhighlight>

{{out}}
[[Media:Kronecker fractals sierpinski carpet.png]]<br>
[[Media:Kronecker fractals sierpinski triangle.png]]<br>
[[Media:Kronecker fractals vicsek.png]]


=={{header|Factor}}==
=={{header|Factor}}==
{{works with|Factor|0.99 2020-01-23}}
{{works with|Factor|0.99 2020-01-23}}
<lang factor>USING: io kernel math math.matrices.extras sequences ;
<syntaxhighlight lang="factor">USING: io kernel math math.matrices.extras sequences ;


: mat-kron-pow ( m n -- m' )
: mat-kron-pow ( m n -- m' )
Line 308: Line 629:
{ { 1 1 1 } { 1 0 1 } { 1 1 1 } }
{ { 1 1 1 } { 1 0 1 } { 1 1 1 } }
{ { 0 1 1 } { 0 1 0 } { 1 1 0 } }
{ { 0 1 1 } { 0 1 0 } { 1 1 0 } }
[ 3 mat-kron-pow print-fractal ] tri@</lang>
[ 3 mat-kron-pow print-fractal ] tri@</syntaxhighlight>
Output shown at order 4 and 25% font size.
Output shown at order 4 and 25% font size.
{{out}}
{{out}}
Line 559: Line 880:
=={{header|Fortran}}==
=={{header|Fortran}}==
A Fortran 90 implementation. Uses dense matrices and dynamic allocation for working arrays.
A Fortran 90 implementation. Uses dense matrices and dynamic allocation for working arrays.
<lang Fortran>program Kron_frac
<syntaxhighlight lang="fortran">program Kron_frac
implicit none
implicit none


Line 686: Line 1,007:


end subroutine write2file
end subroutine write2file
</syntaxhighlight>
</lang>


{{out}}
{{out}}
Line 1,110: Line 1,431:


</pre>
</pre>

=={{header|FreeBASIC}}==
<syntaxhighlight lang="vbnet">Type Matrix
As Integer x
As Integer y
As Integer Ptr Dato
End Type

Function kroneckerProduct(a As Matrix, b As Matrix) As Matrix
Dim As Integer m = a.x, n = a.y
Dim As Integer p = b.x, q = b.y
Dim As Matrix r
r.x = m * p
r.y = n * q
r.dato = Callocate(r.x * r.y, Sizeof(Integer))
Dim As Integer i, j, k, l
For i = 0 To m - 1
For j = 0 To n - 1
For k = 0 To p - 1
For l = 0 To q - 1
r.dato[(p * i + k) * r.y + (q * j + l)] = a.dato[i * a.y + j] * b.dato[k * b.y + l]
Next
Next
Next
Next
Return r
End Function

Function kroneckerPower(a As Matrix, n As Integer) As Matrix
Dim As Matrix pow = a
For i As Integer = 1 To n - 1
pow = kroneckerProduct(pow, a)
Next
Return pow
End Function

Sub printMatrix(text As String, m As Matrix)
Dim As Integer i, j
Print text & " fractal:"
For i = 0 To m.x - 1
For j = 0 To m.y - 1
Print Iif(m.dato[i * m.y + j] = 1, "*", " ");
Next
Print
Next
Print
End Sub

Dim As Matrix a = Type(3, 3, Callocate(9, Sizeof(Integer)))
a.dato[0] = 0: a.dato[1] = 1: a.dato[2] = 0
a.dato[3] = 1: a.dato[4] = 1: a.dato[5] = 1
a.dato[6] = 0: a.dato[7] = 1: a.dato[8] = 0
printMatrix("Vicsek", kroneckerPower(a, 4))

a.dato[0] = 1: a.dato[1] = 1: a.dato[2] = 1
a.dato[3] = 1: a.dato[4] = 0: a.dato[5] = 1
a.dato[6] = 1: a.dato[7] = 1: a.dato[8] = 1
printMatrix("Sierpinski carpet", kroneckerPower(a, 4))

Sleep</syntaxhighlight>
{{out}}
<pre>Same as Kotlin entry.</pre>


=={{header|gnuplot}}==
=={{header|gnuplot}}==
Line 1,122: Line 1,505:
[[File:pkf3.png|right|thumb|Output pkf3.png]]
[[File:pkf3.png|right|thumb|Output pkf3.png]]


<lang gnuplot>
<syntaxhighlight lang="gnuplot">
## KPF.gp 4/8/17 aev
## KPF.gp 4/8/17 aev
## Plotting 3 KPF pictures.
## Plotting 3 KPF pictures.
Line 1,139: Line 1,522:
ttl = "Sierpinski triangle fractal"; clr = '"dark-green"'; filename = "pkf3";
ttl = "Sierpinski triangle fractal"; clr = '"dark-green"'; filename = "pkf3";
load "plotff.gp"
load "plotff.gp"
</syntaxhighlight>
</lang>
{{Output}}
{{Output}}
<pre>
<pre>
3 plotted files: pkf1.png, pkf2.png and pkf3.png.
3 plotted files: pkf1.png, pkf2.png and pkf3.png.
</pre>
</pre>

=={{header|Fōrmulæ}}==

{{FormulaeEntry|page=https://formulae.org/?script=examples/Kronecker_product_based_fractals}}

'''Solution'''

[[File:Fōrmulæ - Kronecker product based fractals 01.png]]

'''Test case 1. Vicsek fractal'''

Cross form

[[File:Fōrmulæ - Kronecker product based fractals 02.png]]

[[File:Fōrmulæ - Kronecker product based fractals 03.png]]

Saltire form

[[File:Fōrmulæ - Kronecker product based fractals 04.png]]

[[File:Fōrmulæ - Kronecker product based fractals 05.png]]

'''Test case 2. Sierpiński carpet fractal'''

[[File:Fōrmulæ - Kronecker product based fractals 06.png]]

[[File:Fōrmulæ - Kronecker product based fractals 07.png]]

'''Test case 3. Sierpiński triangle fractal'''

[[File:Fōrmulæ - Kronecker product based fractals 08.png]]

[[File:Fōrmulæ - Kronecker product based fractals 09.png]]

'''Test case 3. Other cases'''

[[File:Fōrmulæ - Kronecker product based fractals 10.png]]

[[File:Fōrmulæ - Kronecker product based fractals 11.png]]

[[File:Fōrmulæ - Kronecker product based fractals 12.png]]

[[File:Fōrmulæ - Kronecker product based fractals 13.png]]

'''Test case 4. Numbers between 0 and 1 can be used, to produce greyscale shades'''

[[File:Fōrmulæ - Kronecker product based fractals 14.png]]

(click or tap to see in real size)

[[File:Fōrmulæ - Kronecker product based fractals 15.png|256px]]


=={{header|Go}}==
=={{header|Go}}==
{{trans|Kotlin}}
{{trans|Kotlin}}
<lang go>package main
<syntaxhighlight lang="go">package main


import "fmt"
import "fmt"
Line 1,205: Line 1,640:
m2 := matrix{{1, 1, 1}, {1, 0, 1}, {1, 1, 1}}
m2 := matrix{{1, 1, 1}, {1, 0, 1}, {1, 1, 1}}
m2.kroneckerPower(4).print("Sierpinski carpet")
m2.kroneckerPower(4).print("Sierpinski carpet")
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}
Line 1,217: Line 1,652:
This implementation compiles to javascript that runs in the browser using the [https://github.com/ghcjs/ghcjs ghcjs compiler ] . The [https://github.com/reflex-frp/reflex-dom reflex-dom ] library is used to help with svg rendering.
This implementation compiles to javascript that runs in the browser using the [https://github.com/ghcjs/ghcjs ghcjs compiler ] . The [https://github.com/reflex-frp/reflex-dom reflex-dom ] library is used to help with svg rendering.


<lang haskell>{-# LANGUAGE OverloadedStrings #-}
<syntaxhighlight lang="haskell">{-# LANGUAGE OverloadedStrings #-}
import Reflex
import Reflex
import Reflex.Dom
import Reflex.Dom
Line 1,300: Line 1,735:
elSvgns t m ma = do
elSvgns t m ma = do
(el, val) <- elDynAttrNS' (Just "http://www.w3.org/2000/svg") t m ma
(el, val) <- elDynAttrNS' (Just "http://www.w3.org/2000/svg") t m ma
return val</lang>
return val</syntaxhighlight>


Link to live demo: https://dc25.github.io/rosettaCode__Kronecker_product_based_fractals/ ( a little slow to load ).
Link to live demo: https://dc25.github.io/rosettaCode__Kronecker_product_based_fractals/ ( a little slow to load ).
Line 1,308: Line 1,743:
Implementation:
Implementation:


<lang J>V=: -.0 2 6 8 e.~i.3 3
<syntaxhighlight lang="j">V=: -.0 2 6 8 e.~i.3 3
S=: 4 ~:i.3 3
S=: 4 ~:i.3 3
KP=: 1 3 ,/"2@(,/)@|: */
KP=: 1 3 ,/"2@(,/)@|: */
Line 1,314: Line 1,749:
ascii_art=: ' *'{~]
ascii_art=: ' *'{~]


KPfractal=:dyad def 'x&KP^:y,.1'</lang>
KPfractal=:dyad def 'x&KP^:y,.1'</syntaxhighlight>


Task examples (order 4, 25% font size):
Task examples (order 4, 25% font size):
Line 1,487: Line 1,922:
This implementation does not use sparse matrices since the powers involved do not exceed 4.
This implementation does not use sparse matrices since the powers involved do not exceed 4.


<syntaxhighlight lang="java">
<lang Java>
package kronecker;
package kronecker;


Line 1,624: Line 2,059:


}
}
</syntaxhighlight>
</lang>


{{Output}}
{{Output}}
Line 1,897: Line 2,332:
[[File:SierpCarpetFractaljs.png|200px|right|thumb|Output SierpCarpetFractaljs.png]]
[[File:SierpCarpetFractaljs.png|200px|right|thumb|Output SierpCarpetFractaljs.png]]
[[File:CheckbrdFractaljs.png|200px|right|thumb|Output CheckbrdFractaljs.png]]
[[File:CheckbrdFractaljs.png|200px|right|thumb|Output CheckbrdFractaljs.png]]
<lang javascript>
<syntaxhighlight lang="javascript">
// KPF.js 6/23/16 aev
// KPF.js 6/23/16 aev
// HFJS: Plot any matrix mat (filled with 0,1)
// HFJS: Plot any matrix mat (filled with 0,1)
Line 1,946: Line 2,381:
// of the a and b matrices
// of the a and b matrices
mkp=(a,b)=>a.map(a=>b.map(b=>a.map(y=>b.map(x=>r.push(y*x)),t.push(r=[]))),t=[])&&t;
mkp=(a,b)=>a.map(a=>b.map(b=>a.map(y=>b.map(x=>r.push(y*x)),t.push(r=[]))),t=[])&&t;
</lang>
</syntaxhighlight>


;Required tests:
;Required tests:
<lang html>
<syntaxhighlight lang="html">
<!-- VicsekFractal.html -->
<!-- VicsekFractal.html -->
<html>
<html>
Line 1,961: Line 2,396:
<canvas id="canvId" width="750" height="750" style="border: 1px outset;"></canvas>
<canvas id="canvId" width="750" height="750" style="border: 1px outset;"></canvas>
</body></html>
</body></html>
</lang>
</syntaxhighlight>


<lang html>
<syntaxhighlight lang="html">
<!-- SierpCarpetFractal.html -->
<!-- SierpCarpetFractal.html -->
<html>
<html>
Line 1,975: Line 2,410:
<canvas id="canvId" width="750" height="750" style="border: 1px outset;"></canvas>
<canvas id="canvId" width="750" height="750" style="border: 1px outset;"></canvas>
</body></html>
</body></html>
</syntaxhighlight>
</lang>


<lang html>
<syntaxhighlight lang="html">
<!-- Checkerboard.html -->
<!-- Checkerboard.html -->
<html>
<html>
Line 1,989: Line 2,424:
<canvas id="canvId" width="750" height="750" style="border: 1px outset;"></canvas>
<canvas id="canvId" width="750" height="750" style="border: 1px outset;"></canvas>
</body></html>
</body></html>
</lang>
</syntaxhighlight>


{{Output}}
{{Output}}
Line 2,001: Line 2,436:
{{works with|Julia|0.6}}
{{works with|Julia|0.6}}
Julia has a builtin function `kron`:
Julia has a builtin function `kron`:
<lang julia>function matkronpow(M::Matrix, n::Int)
<syntaxhighlight lang="julia">function matkronpow(M::Matrix, n::Int)
P = copy(M)
P = copy(M)
for i in 1:n P = kron(P, M) end
for i in 1:n P = kron(P, M) end
Line 2,020: Line 2,455:


M = [1 1 1; 1 0 1; 1 1 1]
M = [1 1 1; 1 0 1; 1 1 1]
matkronpow(M, 3) |> fracprint</lang>
matkronpow(M, 3) |> fracprint</syntaxhighlight>


{{out}}
{{out}}
Line 2,188: Line 2,623:
=={{header|Kotlin}}==
=={{header|Kotlin}}==
This reuses code from the [[Kronecker_product#Kotlin]] task.
This reuses code from the [[Kronecker_product#Kotlin]] task.
<lang scala>// version 1.2.31
<syntaxhighlight lang="scala">// version 1.2.31


typealias Matrix = Array<IntArray>
typealias Matrix = Array<IntArray>
Line 2,239: Line 2,674:
)
)
printMatrix("Sierpinski carpet", kroneckerPower(a, 4))
printMatrix("Sierpinski carpet", kroneckerPower(a, 4))
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}
Line 2,414: Line 2,849:
=={{header|Lua}}==
=={{header|Lua}}==
Needs L&Ouml;VE 2D Engine
Needs L&Ouml;VE 2D Engine
<lang lua>
<syntaxhighlight lang="lua">
function prod( a, b )
function prod( a, b )
local rt, l = {}, 1
local rt, l = {}, 1
Line 2,467: Line 2,902:
love.graphics.draw( canvas )
love.graphics.draw( canvas )
end
end
</syntaxhighlight>
</lang>

=={{header|Mathematica}}/{{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">m = {{0, 1, 0}, {1, 1, 1}, {0, 1, 0}};
ArrayPlot[KroneckerProduct[m, m, m, m]]
m = {{1, 1, 1}, {1, 0, 1}, {1, 1, 1}};
ArrayPlot[KroneckerProduct[m, m, m, m]]
m = {{0, 1, 1}, {1, 0, 1}, {1, 1, 0}};
ArrayPlot[KroneckerProduct[m, m, m, m]]</syntaxhighlight>
{{out}}
Outputs three graphical visualisations of the three 4th order products.

=={{header|Maxima}}==
Using function defined in Kronecker product task page. [[https://rosettacode.org/wiki/Kronecker_product#Maxima Kronecker Product]]

<syntaxhighlight lang="maxima">
pow_kron(matr,n):=block(MATR:copymatrix(matr),
for i from 1 thru n do MATR:altern_kronecker(matr,MATR),
MATR);

/* Examples (images are shown in format png)*/
/* A to generate Vicsek fractal */
/* B to generate Sierpinski carpet fractal */
A:matrix([0,1,0],[1,1,1],[0,1,0])$
B:matrix([1,1,1],[1,0,1],[1,1,1])$

/* Vicsek */
pow_kron(A,3)$
at(%,[0="",1="x"]);

/* Sierpinski carpet */
pow_kron(B,3)$
at(%,[0="",1="x"]);
</syntaxhighlight>

[[File:Vicsek.png|thumb|center]]

[[File:SierpinskiCarpet.png|thumb|center]]

=={{header|Nim}}==
{{trans|Kotlin}}
<syntaxhighlight lang="nim">import sequtils

type Matrix[T] = seq[seq[T]]

func kroneckerProduct[T](a, b: Matrix[T]): Matrix[T] =
result = newSeqWith(a.len * b.len, newSeq[T](a[0].len * b[0].len))
let m = a.len
let n = a[0].len
let p = b.len
let q = b[0].len
for i in 0..<m:
for j in 0..<n:
for k in 0..<p:
for l in 0..<q:
result[i * p + k][j * q + l] = a[i][j] * b[k][l]

func kroneckerPower(m: Matrix; n: int): Matrix =
result = m
for i in 2..n:
result = kroneckerProduct(result, m)

func `$`(m: Matrix): string =
for row in m:
for val in row:
result.add if val == 0: " " else: " *"
result.add '\n'


type B = range[0..1]

const A1: Matrix[B] = @[@[B 0, 1, 0], @[B 1, 1, 1], @[B 0, 1, 0]]
echo "Vicsek fractal:\n", A1.kroneckerPower(4)
echo ""
const A2: Matrix[B] = @[@[B 1, 1, 1], @[B 1, 0, 1], @[B 1, 1, 1]]
echo "Sierpinski carpet fractal:\n", A2.kroneckerPower(4)</syntaxhighlight>

{{out}}
<pre>Vicsek fractal:
*
* * *
*
* * *
* * * * * * * * *
* * *
*
* * *
*
* * *
* * * * * * * * *
* * *
* * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * *
* * *
* * * * * * * * *
* * *
*
* * *
*
* * *
* * * * * * * * *
* * *
*
* * *
*
* * *
* * * * * * * * *
* * *
* * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * *
* * *
* * * * * * * * *
* * *
* * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * *
* * *
* * * * * * * * *
* * *
* * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * *
* * *
* * * * * * * * *
* * *
*
* * *
*
* * *
* * * * * * * * *
* * *
*
* * *
*
* * *
* * * * * * * * *
* * *
* * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * *
* * *
* * * * * * * * *
* * *
*
* * *
*
* * *
* * * * * * * * *
* * *
*
* * *
*


Sierpinski carpet fractal:
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *</pre>


=={{header|PARI/GP}}==
=={{header|PARI/GP}}==
Line 2,477: Line 3,155:
[[File:SierpCarpetFractalgp.png|200px|right|thumb|Output SierpCarpetFractalgp.png]]
[[File:SierpCarpetFractalgp.png|200px|right|thumb|Output SierpCarpetFractalgp.png]]
[[File:SierpTriFractalgp.png|200px|right|thumb|Output SierpTriFractalgp.png]]
[[File:SierpTriFractalgp.png|200px|right|thumb|Output SierpTriFractalgp.png]]
<lang parigp>
<syntaxhighlight lang="parigp">
\\ Build block matrix applying Kronecker product to the special matrix m
\\ Build block matrix applying Kronecker product to the special matrix m
\\ (n times to itself). Then plot Kronecker fractal. 4/25/2016 aev
\\ (n times to itself). Then plot Kronecker fractal. 4/25/2016 aev
Line 2,498: Line 3,176:
pkronfractal(M,7,6);
pkronfractal(M,7,6);
}
}
</lang>
</syntaxhighlight>
{{Output}}
{{Output}}
<pre>
<pre>
Line 2,512: Line 3,190:


=={{header|Perl}}==
=={{header|Perl}}==
{{trans|Perl 6}}
{{trans|Raku}}
<lang perl>use Imager;
<syntaxhighlight lang="perl">use Imager;
use Math::Cartesian::Product;
use Math::Cartesian::Product;


Line 2,551: Line 3,229:
} [0..@{$img[0]}-1], [0..$#img];
} [0..@{$img[0]}-1], [0..$#img];
$png->write(file => "run/kronecker-$name-perl6.png");
$png->write(file => "run/kronecker-$name-perl6.png");
}</lang>
}</syntaxhighlight>
See [https://github.com/SqrtNegInf/Rosettacode-Perl5-Smoke/blob/master/ref/kronecker-vicsek-perl6.png Kronecker-Vicsek], [https://github.com/SqrtNegInf/Rosettacode-Perl5-Smoke/blob/master/ref/kronecker-carpet-perl6.png Kronecker-Carpet] and [https://github.com/SqrtNegInf/Rosettacode-Perl5-Smoke/blob/master/ref/kronecker-six-perl6.png Kronecker-Six] images.
See [https://github.com/SqrtNegInf/Rosettacode-Perl5-Smoke/blob/master/ref/kronecker-vicsek-perl6.png Kronecker-Vicsek], [https://github.com/SqrtNegInf/Rosettacode-Perl5-Smoke/blob/master/ref/kronecker-carpet-perl6.png Kronecker-Carpet] and [https://github.com/SqrtNegInf/Rosettacode-Perl5-Smoke/blob/master/ref/kronecker-six-perl6.png Kronecker-Six] images.


=={{header|Phix}}==
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">(phixonline)-->
<lang Phix>function kronecker(sequence a, b)
<span style="color: #008080;">function</span> <span style="color: #000000;">kronecker</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">)</span>
integer ar = length(a),
<span style="color: #004080;">integer</span> <span style="color: #000000;">ar</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">),</span>
ac = length(a[1]),
<span style="color: #000000;">ac</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]),</span>
br = length(b),
<span style="color: #000000;">br</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">b</span><span style="color: #0000FF;">),</span>
bc = length(b[1])
<span style="color: #000000;">bc</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">b</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">])</span>
sequence res = repeat(repeat(0,ac*bc),ar*br)
<span style="color: #004080;">sequence</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ac</span><span style="color: #0000FF;">*</span><span style="color: #000000;">bc</span><span style="color: #0000FF;">),</span><span style="color: #000000;">ar</span><span style="color: #0000FF;">*</span><span style="color: #000000;">br</span><span style="color: #0000FF;">)</span>
for ia=1 to ar do
<span style="color: #008080;">for</span> <span style="color: #000000;">ia</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">ar</span> <span style="color: #008080;">do</span>
integer i0 = (ia-1)*br
<span style="color: #004080;">integer</span> <span style="color: #000000;">i0</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">ia</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)*</span><span style="color: #000000;">br</span>
for ja=1 to ac do
<span style="color: #008080;">for</span> <span style="color: #000000;">ja</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">ac</span> <span style="color: #008080;">do</span>
integer j0 = (ja-1)*bc
<span style="color: #004080;">integer</span> <span style="color: #000000;">j0</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">ja</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)*</span><span style="color: #000000;">bc</span>
for ib=1 to br do
<span style="color: #008080;">for</span> <span style="color: #000000;">ib</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">br</span> <span style="color: #008080;">do</span>
integer i = i0+ib
<span style="color: #004080;">integer</span> <span style="color: #000000;">i</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">i0</span><span style="color: #0000FF;">+</span><span style="color: #000000;">ib</span>
for jb=1 to bc do
<span style="color: #008080;">for</span> <span style="color: #000000;">jb</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">bc</span> <span style="color: #008080;">do</span>
integer j = j0+jb
<span style="color: #004080;">integer</span> <span style="color: #000000;">j</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">j0</span><span style="color: #0000FF;">+</span><span style="color: #000000;">jb</span>
res[i,j] = a[ia,ja]*b[ib,jb]
<span style="color: #000000;">res</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">,</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">[</span><span style="color: #000000;">ia</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ja</span><span style="color: #0000FF;">]*</span><span style="color: #000000;">b</span><span style="color: #0000FF;">[</span><span style="color: #000000;">ib</span><span style="color: #0000FF;">,</span><span style="color: #000000;">jb</span><span style="color: #0000FF;">]</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
return res
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>

function kroneckern(sequence m, integer n)
<span style="color: #008080;">function</span> <span style="color: #000000;">kroneckern</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">m</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
sequence res = m
<span style="color: #004080;">sequence</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">m</span>
for i=2 to n do
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #000000;">n</span> <span style="color: #008080;">do</span>
res = kronecker(res,m)
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">kronecker</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #000000;">m</span><span style="color: #0000FF;">)</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
return res
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>

procedure show(sequence m)
<span style="color: #008080;">procedure</span> <span style="color: #000000;">show</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">m</span><span style="color: #0000FF;">)</span>
for i=1 to length(m) do
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">m</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
string s = repeat(' ',length(m[i]))
<span style="color: #004080;">string</span> <span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #008000;">' '</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">m</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]))</span>
for j=1 to length(s) do
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
if m[i][j] then s[j] = '#' end if
<span style="color: #008080;">if</span> <span style="color: #000000;">m</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">][</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">'#'</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
puts(1,s&"\n")
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">&</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">)</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
puts(1,"\n")
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">)</span>
end procedure
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>

constant vicsek = {{0,1,0},
<span style="color: #008080;">constant</span> <span style="color: #000000;">vicsek</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},</span>
{1,1,1},
<span style="color: #0000FF;">{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">},</span>
{0,1,0}},
<span style="color: #0000FF;">{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">}},</span>
siercp = {{1,1,1},
<span style="color: #000000;">siercp</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">},</span>
{1,0,1},
<span style="color: #0000FF;">{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">},</span>
{1,1,1}},
<span style="color: #0000FF;">{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">}},</span>
xxxxxx = {{0,1,1},
<span style="color: #000000;">xxxxxx</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">},</span>
{0,1,0},
<span style="color: #0000FF;">{</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">},</span>
{1,1,0}}
<span style="color: #0000FF;">{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">}}</span>

show(kroneckern(vicsek,4))
<span style="color: #000000;">show</span><span style="color: #0000FF;">(</span><span style="color: #000000;">kroneckern</span><span style="color: #0000FF;">(</span><span style="color: #000000;">vicsek</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">))</span>
show(kroneckern(siercp,4))
<span style="color: #000000;">show</span><span style="color: #0000FF;">(</span><span style="color: #000000;">kroneckern</span><span style="color: #0000FF;">(</span><span style="color: #000000;">siercp</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">))</span>
show(kroneckern(xxxxxx,4))</lang>
<span style="color: #000000;">show</span><span style="color: #0000FF;">(</span><span style="color: #000000;">kroneckern</span><span style="color: #0000FF;">(</span><span style="color: #000000;">xxxxxx</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">))</span>
<!--</syntaxhighlight>-->
Output same as Julia/Kotlin/Factor
Output same as Julia/Kotlin/Factor


Line 2,615: Line 3,295:


'''Using only python lists'''
'''Using only python lists'''
<lang python>import os
<syntaxhighlight lang="python">import os
from PIL import Image
from PIL import Image


Line 2,702: Line 3,382:
fractal('test2', test2)
fractal('test2', test2)
fractal('test3', test3)
fractal('test3', test3)
</syntaxhighlight>
</lang>


Because this is not very efficent/fast you should use scipy sparse matrices instead
Because this is not very efficent/fast you should use scipy sparse matrices instead
<lang python>import os
<syntaxhighlight lang="python">import os
import numpy as np
import numpy as np
from scipy.sparse import csc_matrix, kron
from scipy.sparse import csc_matrix, kron
Line 2,778: Line 3,458:
fractal('test1', test1)
fractal('test1', test1)
fractal('test2', test2)
fractal('test2', test2)
fractal('test3', test3)</lang>
fractal('test3', test3)</syntaxhighlight>


=={{header|R}}==
=={{header|R}}==
Line 2,788: Line 3,468:
[[File:PlusSignFR.png|200px|right|thumb|Output PlusSignFR.png]]
[[File:PlusSignFR.png|200px|right|thumb|Output PlusSignFR.png]]


<syntaxhighlight lang="r">
<lang r>
## Generate and plot Kronecker product based fractals. aev 8/12/16
## Generate and plot Kronecker product based fractals. aev 8/12/16
## gpKronFractal(m, n, pf, clr, ttl, dflg=0, psz=600):
## gpKronFractal(m, n, pf, clr, ttl, dflg=0, psz=600):
Line 2,831: Line 3,511:
# 0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1), ncol=8, nrow=8, byrow=TRUE);
# 0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1), ncol=8, nrow=8, byrow=TRUE);
#gpKronFractal(M, 2, "ChessBrdFractalR","black", "Chessboard Fractal, n=2")
#gpKronFractal(M, 2, "ChessBrdFractalR","black", "Chessboard Fractal, n=2")
</lang>
</syntaxhighlight>


{{Output}}
{{Output}}
Line 2,862: Line 3,542:
{{works with|Rakudo|2018.09}}
{{works with|Rakudo|2018.09}}


<lang perl6>sub kronecker-product ( @a, @b ) { (@a X @b).map: { (.[0].list X* .[1].list).Array } }
<syntaxhighlight lang="raku" line>sub kronecker-product ( @a, @b ) { (@a X @b).map: { (.[0].list X* .[1].list).Array } }


sub kronecker-fractal ( @pattern, $order = 4 ) {
sub kronecker-fractal ( @pattern, $order = 4 ) {
Line 2,889: Line 3,569:
}
}
$png.write: "kronecker-{$name}-perl6.png";
$png.write: "kronecker-{$name}-perl6.png";
}</lang>
}</syntaxhighlight>


See [https://github.com/thundergnat/rc/blob/master/img/kronecker-vicsek-perl6.png Kronecker-Vicsek], [https://github.com/thundergnat/rc/blob/master/img/kronecker-carpet-perl6.png Kronecker-Carpet] and [https://github.com/thundergnat/rc/blob/master/img/kronecker-six-perl6.png Kronecker-Six] images.
See [https://github.com/thundergnat/rc/blob/master/img/kronecker-vicsek-perl6.png Kronecker-Vicsek], [https://github.com/thundergnat/rc/blob/master/img/kronecker-carpet-perl6.png Kronecker-Carpet] and [https://github.com/thundergnat/rc/blob/master/img/kronecker-six-perl6.png Kronecker-Six] images.
Line 2,895: Line 3,575:
=={{header|REXX}}==
=={{header|REXX}}==
This is a work-in-progress, this version shows the 1st order.
This is a work-in-progress, this version shows the 1st order.
<lang rexx>/*REXX program calculates the Kronecker product of two arbitrary size matrices. */
<syntaxhighlight lang="rexx">/*REXX program calculates the Kronecker product of two arbitrary size matrices. */
parse arg pGlyph . /*obtain optional argument from the CL.*/
parse arg pGlyph . /*obtain optional argument from the CL.*/
if pGlyph=='' | pGlyph=="," then pGlyph= '█' /*Not specified? Then use the default.*/
if pGlyph=='' | pGlyph=="," then pGlyph= '█' /*Not specified? Then use the default.*/
Line 2,932: Line 3,612:
$= translate($, pGlyph, 10) /*change──►plot glyph*/
$= translate($, pGlyph, 10) /*change──►plot glyph*/
say strip($, 'T') /*display line──►term*/
say strip($, 'T') /*display line──►term*/
end /*r*/; return</lang>
end /*r*/; return</syntaxhighlight>
{{out|output|text=&nbsp; when using the default input:}}
{{out|output|text=&nbsp; when using the default input:}}
<pre>
<pre>
Line 2,945: Line 3,625:
███
███
</pre>
</pre>

=={{header|Rust}}==

Because Rust lacks support for images, this sample contains a simple implementation of
[[Bitmap/Write a PPM file| writing PPM files]].

<syntaxhighlight lang="rust">use std::{
fmt::{Debug, Display, Write},
ops::Mul,
};

// Rust has (almost) no built-in support for multi-dimensional arrays or so.
// Let's make a basic one ourselves for our use cases.

#[derive(Clone, Debug)]
pub struct Mat<T> {
col_count: usize,
row_count: usize,
items: Vec<T>,
}

impl<T> Mat<T> {
pub fn from_vec(items: Vec<T>, col_count: usize, row_count: usize) -> Self {
assert_eq!(items.len(), col_count * row_count, "mismatching dimensions");

Self {
col_count,
row_count,
items,
}
}

pub fn row_count(&self) -> usize {
self.row_count
}

pub fn col_count(&self) -> usize {
self.col_count
}

pub fn iter(&self) -> impl Iterator<Item = &T> {
self.items.iter()
}

pub fn row_iter(&self, row: usize) -> impl Iterator<Item = &T> {
assert!(row < self.row_count, "index out of bounds");
let start = row * self.col_count;
self.items[start..start + self.col_count].iter()
}

pub fn col_iter(&self, col: usize) -> impl Iterator<Item = &T> {
assert!(col < self.col_count, "index out of bounds");
self.items.iter().skip(col).step_by(self.col_count)
}
}

impl<T: Display> Display for Mat<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
// Compute the width of the widest item first
let mut len = 0usize;
let mut buf = String::new();
for item in (0..self.row_count).flat_map(|row| self.row_iter(row)) {
buf.clear();
write!(buf, "{}", item)?;
len = std::cmp::max(len, buf.chars().count());
}

// Then render the matrix with proper padding

len += 1; // To separate cells
let width = len * self.col_count + 1;
writeln!(f, "┌{:width$}┐", "", width = width)?;

for row in (0..self.row_count).map(|row| self.row_iter(row)) {
write!(f, "│")?;

for item in row {
write!(f, "{:>width$}", item, width = len)?;
}

writeln!(f, " │")?;
}

write!(f, "└{:width$}┘", "", width = width)
}
}

// Rust standard libraries have no graphics support. If we want to render
// an image, we can write, e.g., a PPM file.

impl<T> Mat<T> {
pub fn write_ppm(
&self,
f: &mut dyn std::io::Write,
rgb: impl Fn(&T) -> (u8, u8, u8),
) -> std::io::Result<()> {
let bytes = self
.iter()
.map(rgb)
.flat_map(|(r, g, b)| {
use std::iter::once;
once(r).chain(once(g)).chain(once(b))
})
.collect::<Vec<u8>>();

write!(f, "P6\n{} {}\n255\n", self.col_count, self.row_count)?;
f.write_all(&bytes)
}
}

mod kronecker {

use super::Mat;
use std::ops::Mul;

// Look ma, no numbers! We can combine anything with Mul (see later)

pub fn product<T, U>(a: &Mat<T>, b: &Mat<U>) -> Mat<<T as Mul<U>>::Output>
where
T: Clone + Mul<U>,
U: Clone,
{
let row_count = a.row_count() * b.row_count();
let col_count = a.col_count() * b.col_count();
let mut items = Vec::with_capacity(row_count * col_count);

for i in 0..a.row_count() {
for k in 0..b.row_count() {
for a_x in a.row_iter(i) {
for b_x in b.row_iter(k) {
items.push(a_x.clone() * b_x.clone());
}
}
}
}

Mat::from_vec(items, col_count, row_count)
}

pub fn power<T>(m: &Mat<T>, n: u32) -> Mat<T>
where
T: Clone + Mul<T, Output = T>,
{
match n {
0 => m.clone(),
_ => (1..n).fold(product(&m, &m), |result, _| product(&result, &m)),
}
}
}

// Here we make a char-like type with Mul implementation.
// We can do fancy things with that later.

#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
struct Char(char);

impl Char {
fn space() -> Self {
Char(' ')
}

fn is_space(&self) -> bool {
self.0 == ' '
}
}

impl Display for Char {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
Display::fmt(&self.0, f)
}
}

impl Mul for Char {
type Output = Self;

#[allow(clippy::suspicious_arithmetic_impl)]
fn mul(self, rhs: Self) -> Self {
if self.is_space() || rhs.is_space() {
Char(' ')
} else {
self
}
}
}

fn main() -> std::io::Result<()> {

// Vicsek rendered in numbers

#[rustfmt::skip]
let vicsek = Mat::<u8>::from_vec(vec![
0, 1, 0,
1, 1, 1,
0, 1, 0,
], 3, 3);

println!("{}", vicsek);
println!("{}", kronecker::power(&vicsek, 3));

// We could render something by mapping the numbers to
// something else. But we could compute with something
// else directly, right?
let s = Char::space();
let b = Char('\u{2588}');

#[rustfmt::skip]
let sierpienski = Mat::from_vec(vec![
b, b, b,
b, s, b,
b, b, b,
], 3, 3);

println!("{}", sierpienski);
println!("{}", kronecker::power(&sierpienski, 3));

#[rustfmt::skip]
let matrix = Mat::from_vec(vec![
s, s, b, s, s,
s, b, b, b, s,
b, s, b, s, b,
s, s, b, s, s,
s, b, s, b, s,
], 5, 5,);

println!("{}", kronecker::power(&matrix, 1));

// This is nicer as an actual image
kronecker::power(&matrix, 4).write_ppm(
&mut std::fs::OpenOptions::new()
.write(true)
.create(true)
.truncate(true)
.open("kronecker_power.ppm")?,
|&item| {
if item.is_space() {
(0, 0, 32)
} else {
(192, 192, 0)
}
},
)
}
</syntaxhighlight>


=={{header|Sidef}}==
=={{header|Sidef}}==
{{trans|Perl 6}}
{{trans|Raku}}
<lang ruby>func kronecker_product (a, b) { a ~X b -> map { _[0] ~X* _[1] } }
<syntaxhighlight lang="ruby">func kronecker_product (a, b) { a ~X b -> map { _[0] ~X* _[1] } }


func kronecker_fractal(pattern, order=4) {
func kronecker_fractal(pattern, order=4) {
Line 2,974: Line 3,897:
}
}
img.write(file => "kronecker-#{name}-sidef.png")
img.write(file => "kronecker-#{name}-sidef.png")
}</lang>
}</syntaxhighlight>
Output images: [https://github.com/trizen/rc/blob/master/img/kronecker-carpet-sidef.png Kronecker Carpet], [https://github.com/trizen/rc/blob/master/img/kronecker-vicsek-sidef.png Kronecker Vicsek] and [https://github.com/trizen/rc/blob/master/img/kronecker-six-sidef.png Kronecker Six]
Output images: [https://github.com/trizen/rc/blob/master/img/kronecker-carpet-sidef.png Kronecker Carpet], [https://github.com/trizen/rc/blob/master/img/kronecker-vicsek-sidef.png Kronecker Vicsek] and [https://github.com/trizen/rc/blob/master/img/kronecker-six-sidef.png Kronecker Six]

=={{header|Wren}}==
{{trans|Kotlin}}
{{libheader|Wren-matrix}}
<syntaxhighlight lang="wren">import "./matrix" for Matrix

var kroneckerPower = Fn.new { |m, n|
var pow = m.copy()
for (i in 1...n) pow = pow.kronecker(m)
return pow
}

var printMatrix = Fn.new { |text, m|
System.print("%(text) fractal :\n")
for (i in 0...m.numRows) {
for (j in 0...m.numCols) {
System.write((m[i][j] == 1) ? "*" : " ")
}
System.print()
}
System.print()
}

var m = Matrix.new([ [0, 1, 0], [1, 1, 1], [0, 1, 0] ])
printMatrix.call("Vicsek", kroneckerPower.call(m, 4))
m = Matrix.new([ [1, 1, 1], [1, 0, 1], [1, 1, 1] ])
printMatrix.call("Sierpinski carpet", kroneckerPower.call(m, 4))</syntaxhighlight>

{{out}}
<pre>
Same as Kotlin entry.
</pre>


=={{header|zkl}}==
=={{header|zkl}}==
Uses Image Magick and
Uses Image Magick and
the PPM class from http://rosettacode.org/wiki/Bitmap/Bresenham%27s_line_algorithm#zkl
the PPM class from http://rosettacode.org/wiki/Bitmap/Bresenham%27s_line_algorithm#zkl
<lang zkl>var [const] GSL=Import.lib("zklGSL"); // libGSL (GNU Scientific Library)
<syntaxhighlight lang="zkl">var [const] GSL=Import.lib("zklGSL"); // libGSL (GNU Scientific Library)
fcn kronecker(A,B){ //--> new Matrix
fcn kronecker(A,B){ //--> new Matrix
m,n, p,q := A.rows,A.cols, B.rows,B.cols;
m,n, p,q := A.rows,A.cols, B.rows,B.cols;
Line 2,991: Line 3,946:
R:=M;
R:=M;
do(n){ R=kronecker(R,M) }
do(n){ R=kronecker(R,M) }
r,c,img := R.rows, R.cols, PPM(r,c,0xFFFFFF); // white canvas
r,c,img := R.rows, R.cols, PPM(r,c,0xFFFFFF); // white canvas
foreach i,j in (r,c){ if(R[i,j]) img[i,j]=0x00FF00 } // green dots
foreach i,j in (r,c){ if(R[i,j]) img[i,j]=0x00FF00 } // green dots
println("%s: %dx%d with %,d points".fmt(fname,R.rows,R.cols,
println("%s: %dx%d with %,d points".fmt(fname,R.rows,R.cols,
R.pump(0,Ref(0).inc,Void.Filter).value)); // count 1s in fractal matrix
R.pump(0,Ref(0).inc,Void.Filter).value)); // count 1s in fractal matrix
img.writeJPGFile(fname);
img.writeJPGFile(fname);
}</lang>
}</syntaxhighlight>
<lang zkl>var [const] A=GSL.Matrix(3,3).set(0,1,0, 1,1,1, 0,1,0),
<syntaxhighlight lang="zkl">var [const] A=GSL.Matrix(3,3).set(0,1,0, 1,1,1, 0,1,0),
B=GSL.Matrix(3,3).set(1,1,1, 1,0,1, 1,1,1);
B=GSL.Matrix(3,3).set(1,1,1, 1,0,1, 1,1,1);
kfractal(A,4,"vicsek_k.jpg");
kfractal(A,4,"vicsek_k.jpg");
kfractal(B,4,"sierpinskiCarpet_k.jpg");</lang>
kfractal(B,4,"sierpinskiCarpet_k.jpg");</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>

Latest revision as of 23:44, 22 March 2024

Task
Kronecker product based fractals
You are encouraged to solve this task according to the task description, using any language you may know.

This task is based on   Kronecker product   of two matrices.

If your language has no a built-in function for such product then you need to implement it first.

The essence of fractals is self-replication (at least, self-similar replications).

So, using   n   times self-product of the matrix   (filled with 0/1)   we will have a fractal of the   nth   order.

Actually, "self-product" is a Kronecker power of the matrix.

In other words: for a matrix   M   and a power   n   create a function like   matkronpow(M, n),
which returns   MxMxMx...   (n   times product).

A formal recurrent algorithm of creating Kronecker power of a matrix is the following:


Algorithm
  • Let M is an initial matrix, and Rn is a resultant block matrix of the Kronecker power, where n is the power (a.k.a. order).
  • Self-product of M, i.e., M x M producing R2 (resultant matrix with order/power 2).
  • To receive the next order/power matrix use this recurrent formula: Rn = R(n-1) x M.
  • Plot this Rn matrix to produce the nth order fractal.


Even just looking at the resultant matrix you can see what will be plotted.
There are virtually infinitely many fractals of this type. You are limited only by your creativity and the power of your computer.


Task

Using Kronecker product implement and show two popular and well-known fractals, i.e.:


The last one ( Sierpinski carpet) is already here on RC, but built using different approaches.


Test cases

These 2 fractals (each order/power 4 at least) should be built using the following 2 simple matrices:

          │ 0 1 0 │    and    │ 1 1 1 │
          │ 1 1 1 │           │ 1 0 1 │
          │ 0 1 0 │           │ 1 1 1 │
Note
  • Output could be a graphical or ASCII-art representation, but if an order is set > 4 then printing is not suitable.
  • The orientation and distortion of the fractal could be your language/tool specific.
  • It would be nice to see one additional fractal of your choice, e.g., based on using a single (double) letter(s) of an alphabet, any sign(s) or already made a resultant matrix of the Kronecker product.


See implementations and results below in JavaScript, PARI/GP and R languages. They have additional samples of "H", "+" and checkerboard fractals.

11l

Translation of: Nim
F kroneckerProduct(a, b)
   V m = a.len
   V n = a[0].len
   V p = b.len
   V q = b[0].len
   V result = [[0] * (n * q)] * (m * p)
   L(i) 0 .< m
      L(j) 0 .< n
         L(k) 0 .< p
            L(l) 0 .< q
               result[i * p + k][j * q + l] = a[i][j] * b[k][l]
   R result

F kroneckerPower(m, n)
   V result = m
   L 2..n
      result = kroneckerProduct(result, m)
   R result

F to_str(m)
   V result = ‘’
   L(row) m
      L(val) row
         result ‘’= I val == 0 {‘  ’} E ‘ *’
      result ‘’= "\n"
   R result

V a1 = [[0, 1, 0], [1, 1, 1], [0, 1, 0]]
print(‘Vicsek fractal:’)
print(to_str(kroneckerPower(a1, 4)))
print()
V a2 = [[1, 1, 1], [1, 0, 1], [1, 1, 1]]
print(‘Sierpinski carpet fractal:’)
print(to_str(kroneckerPower(a2, 4)))
Output:

The same as in Nim solution.

Action!

The user must type in the monitor the following command after compilation and before running the program!

SET EndProg=*
CARD EndProg ;required for ALLOCATE.ACT

INCLUDE "D2:ALLOCATE.ACT" ;from the Action! Tool Kit. You must type 'SET EndProg=*' from the monitor after compiling, but before running this program!

DEFINE PTR="CARD"
DEFINE MATRIX_SIZE="4"
TYPE Matrix=[
  BYTE width,height
  PTR data]

PTR FUNC CreateEmpty(BYTE w,h)
  Matrix POINTER m

  m=Alloc(MATRIX_SIZE)
  m.width=w
  m.height=h
  m.data=Alloc(w*h)
RETURN (m)

PTR FUNC Create(BYTE w,h BYTE ARRAY a)
  Matrix POINTER m

  m=CreateEmpty(w,h)
  MoveBlock(m.data,a,w*h)
RETURN (m)

PROC Destroy(Matrix POINTER m)
  Free(m.data,m.width*m.height)
  Free(m,MATRIX_SIZE) 
RETURN

PTR FUNC Product(Matrix POINTER m1,m2)
  Matrix POINTER m
  BYTE x1,x2,y1,y2
  INT i1,i2,i
  BYTE ARRAY a1,a2,a

  m=CreateEmpty(m1.width*m2.width,m1.height*m2.height)
  a1=m1.data
  a2=m2.data
  a=m.data
  i=0
  FOR y1=0 TO m1.height-1
  DO
    FOR y2=0 TO m2.height-1
    DO
      FOR x1=0 TO m1.width-1
      DO
        FOR x2=0 TO m2.width-1
        DO
          i1=y1*m1.width+x1
          i2=y2*m2.width+x2
          a(i)=a1(i1)*a2(i2)
          i==+1
        OD
      OD
    OD
  OD
RETURN (m)

PROC DrawMatrix(Matrix POINTER m INT x,y)
  INT i,j
  BYTE ARRAY d

  d=m.data
  FOR j=0 TO m.height-1
  DO
    FOR i=0 TO m.width-1
    DO
      IF d(j*m.width+i) THEN
        Plot(x+i,y+j)
      FI
    OD
  OD
RETURN

PROC DrawFractal(BYTE ARRAY a BYTE w,h INT x,y BYTE n)
  Matrix POINTER m1,m2,m3
  BYTE i
  
  m1=Create(w,h,a)
  m2=Create(w,h,a)
  FOR i=1 TO n
  DO
    m3=Product(m1,m2)
    IF i<n THEN
      Destroy(m1)
      m1=m3 m3=0
    FI
  OD

  DrawMatrix(m3,x,y)

  Destroy(m1)
  Destroy(m2)
  Destroy(m3)
RETURN

PROC Main()
  BYTE CH=$02FC,COLOR1=$02C5,COLOR2=$02C6
  BYTE ARRAY a=[0 1 0 1 1 1 0 1 0],
    b=[1 1 1 1 0 1 1 1 1],
    c=[1 0 1 0 1 0 1 0 1]

  Graphics(8+16)
  AllocInit(0)
  Color=1
  COLOR1=$0C
  COLOR2=$02

  DrawFractal(a,3,3,12,55,3)
  DrawFractal(b,3,3,120,55,3)
  DrawFractal(c,3,3,226,55,3)

  DO UNTIL CH#$FF OD
  CH=$FF
RETURN
Output:

Screenshot from Atari 8-bit computer

Ada

Library: SDLAda

Using multiplication function from Kronecker product.

with SDL.Video.Windows.Makers;
with SDL.Video.Renderers.Makers;
with SDL.Events.Events;
with SDL.Events.Mice;

procedure Kronecker_Fractals is

   Width  : constant := 800;
   Height : constant := 800;
   Order  : constant := 6;

   Window   : SDL.Video.Windows.Window;
   Renderer : SDL.Video.Renderers.Renderer;

   type Matrix is array (Positive range <>, Positive range <>) of Integer;

   function "*" (Left, Right : in Matrix) return Matrix is
      Result : Matrix
        (1 .. Left'Length (1) * Right'Length (1),
         1 .. Left'Length (2) * Right'Length (2));
      LI : Natural := 0;
      LJ : Natural := 0;
   begin
      for I in 0 .. Result'Length (1) - 1 loop
         for J in 0 .. Result'Length (2) - 1 loop
            Result (I + 1, J + 1) :=
              Left (Left'First (1) + (LI), Left'First (2) + (LJ))
              * Right
              (Right'First (1) + (I mod Right'Length (1)),
               Right'First (2) + (J mod Right'Length (2)));
            if (J + 1) mod Right'Length (2) = 0 then
               LJ := LJ + 1;
            end if;
         end loop;
         if (I + 1) mod Right'Length (1) = 0 then
            LI := LI + 1;
         end if;
         LJ := 0;
      end loop;
      return Result;
   end "*";

   function "**" (Base : Matrix; Exp : Positive) return Matrix is
      (case Exp is
         when 1      => Base,
         when 2      => Base * Base,
         when others => Base * Base ** (Exp - 1));

   procedure Draw_Matrix (LX, LY : Integer; M : Matrix) is
      use SDL.C;
   begin
      for Y in M'Range (1) loop
         for X in M'Range (2) loop
            if M (Y, X) /= 0 then
               Renderer.Draw (Point => (int (LX + X), int (LY + Y)));
            end if;
         end loop;
      end loop;
   end Draw_Matrix;

   type Fractals is (Cross, H, X, Sierpinski, U);
   Base : Fractals := Fractals'First;

   M : constant array (Fractals) of Matrix (1 .. 3, 1 .. 3) :=
     (Cross      => ((0, 1, 0), (1, 1, 1), (0, 1, 0)),
      H          => ((1, 0, 1), (1, 1, 1), (1, 0, 1)),
      X          => ((1, 0, 1), (0, 1, 0), (1, 0, 1)),
      Sierpinski => ((1, 1, 1), (1, 0, 1), (1, 1, 1)),
      U          => ((1, 0, 1), (1, 0, 1), (1, 1, 1)));

   procedure Draw is
   begin
      Renderer.Set_Draw_Colour ((0, 0, 0, 255));
      Renderer.Fill (Rectangle => (0, 0, Width, Height));

      Renderer.Set_Draw_Colour (Colour => (0, 220, 0, 255));
      Draw_Matrix (10, 10, M (Base) ** Order);
      Window.Update_Surface;
      Base := (if Base = Fractals'Last
                    then Fractals'First
                    else Fractals'Succ (Base));
   end Draw;

   procedure Event_Loop is
      use type SDL.Events.Event_Types;
      Event : SDL.Events.Events.Events;
   begin
      loop
         SDL.Events.Events.Wait (Event);
         case Event.Common.Event_Type is
            when SDL.Events.Quit             => return;
            when SDL.Events.Mice.Button_Down => Draw;
            when others                      => null;
         end case;
      end loop;
   end Event_Loop;

begin
   if not SDL.Initialise (Flags => SDL.Enable_Screen) then
      return;
   end if;

   SDL.Video.Windows.Makers.Create (Win      => Window,
                                    Title    => "Kronecker fractals (Click to cycle)",
                                    Position => SDL.Natural_Coordinates'(X => 10, Y => 10),
                                    Size     => SDL.Positive_Sizes'(Width, Height),
                                    Flags    => 0);
   SDL.Video.Renderers.Makers.Create (Renderer, Window.Get_Surface);

   Draw;
   Event_Loop;
   Window.Finalize;
   SDL.Finalise;
end Kronecker_Fractals;

ALGOL 68

BEGIN # Kronecker product based fractals - translated from the Kotlin sample #

    MODE MATRIX = FLEX[ 1 : 0, 1 : 0 ]INT;

    PROC kronecker product = ( MATRIX a in, b in )MATRIX:
         BEGIN
             MATRIX a = a in[ AT 0, AT 0 ], b = b in[ AT 0, AT 0 ];
             INT m   = 1 UPB a + 1, n = 2 UPB a + 1;
             INT p   = 1 UPB b + 1, q = 2 UPB b + 1;
             INT rtn = m * p, ctn = n * q;
             [ 0 : rtn - 1, 0 : ctn - 1 ]INT r;
             FOR i FROM 0 TO rtn - 1 DO FOR j FROM 0 TO ctn - 1 DO r[ i, j ] := 0 OD OD;
             FOR i FROM 0 TO m - 1 DO
                 FOR j FROM 0 TO n - 1 DO
                     FOR k FROM 0 TO p - 1 DO
                         FOR l FROM 0 TO q - 1 DO
                             r[ p * i + k, q * j + l ] := a[ i, j ] * b[ k, l ]
                         OD
                     OD
                 OD
             OD;
             r
         END # kronecker product # ;

    PROC kronecker power = ( MATRIX a, INT n )MATRIX:
         BEGIN
             MATRIX pow := a;
             FOR i TO n - 1 DO pow := kronecker product( pow, a ) OD;
             pow
         END # kronecker power # ;

    PROC print matrix = ( STRING text, MATRIX m )VOID:
         BEGIN
             print( ( text, " fractal :", newline ) );
             FOR i FROM 1 LWB m TO 1 UPB m DO
                 FOR j FROM 2 LWB m TO 2 UPB m DO
                     print( ( IF m[ i, j ] = 1 THEN "*" ELSE " " FI ) )
                 OD;
                 print( ( newline ) )
             OD;
             print( ( newline ) )
         END # print matrix # ;

    MATRIX a := MATRIX( ( 0, 1, 0 )
                      , ( 1, 1, 1 )
                      , ( 0, 1, 0 )
                      );
    print matrix( "Vicsek", kronecker power( a, 4 ) );

    a := MATRIX( ( 1, 1, 1 )
               , ( 1, 0, 1 )
               , ( 1, 1, 1 )
               );
    print matrix( "Sierpinski carpet", kronecker power( a, 4 ) )
END
Output:

Same as the Kotlin sample.

C

Although this task is related to Kronecker product, this is computationally a more complex task as the matrix has to be raised to an arbitrary power. Assume matrix A, order i x j has to be raised to power n, the final result will have (i^n)x(j^n) elements. Doing this "conventionally" will require at least (i^n)x(j^n) operations with storage for the same number of elements. This means a storage requirement of 4 x (i^n) x (j^n) bytes for an integer matrix.

However, if half of the elements of the initial matrix A are zeroes, computations and storage for such elements are wasted as they will never be plotted. The only relevant elements are the 1s.

Thus this implementation treats the initial matrix as a Sparse matrix. Doing so cuts down drastically on the required storage and number of operations. The graphical part needs the WinBGIm library.

#include<graphics.h>
#include<stdlib.h>
#include<stdio.h>

typedef struct{
    int row, col;
}cell;

int ROW,COL,SUM=0;

unsigned long raiseTo(int base,int power){
    if(power==0)
        return 1;
    else
        return base*raiseTo(base,power-1);
}

cell* kroneckerProduct(char* inputFile,int power){
    FILE* fp = fopen(inputFile,"r");
    
    int i,j,k,l;
    unsigned long prod;
    int** matrix;
    cell *coreList,*tempList,*resultList;
    
    fscanf(fp,"%d%d",&ROW,&COL);
    
    matrix = (int**)malloc(ROW*sizeof(int*));
    
    for(i=0;i<ROW;i++){
        matrix[i] = (int*)malloc(COL*sizeof(int));
        for(j=0;j<COL;j++){
            fscanf(fp,"%d",&matrix[i][j]);
            if(matrix[i][j]==1)
                SUM++;
        }
    }
    
    coreList = (cell*)malloc(SUM*sizeof(cell));
    resultList = (cell*)malloc(SUM*sizeof(cell));
    
    k = 0;
    
    for(i=0;i<ROW;i++){
        for(j=0;j<COL;j++){
            if(matrix[i][j]==1){
                coreList[k].row = i+1;
                coreList[k].col = j+1;
                resultList[k].row = i+1;
                resultList[k].col = j+1;
                k++;
            }
        }
    }
    
    prod = k;
    
    for(i=2;i<=power;i++){
        tempList = (cell*)malloc(prod*k*sizeof(cell));
        
        l = 0;
        
        for(j=0;j<prod;j++){
            for(k=0;k<SUM;k++){
                tempList[l].row = (resultList[j].row-1)*ROW + coreList[k].row;
                tempList[l].col = (resultList[j].col-1)*COL + coreList[k].col;
                l++;
            }
        }
        
        free(resultList);
        
        prod *= k;
        
        resultList = (cell*)malloc(prod*sizeof(cell));
        
        for(j=0;j<prod;j++){
            resultList[j].row = tempList[j].row;
            resultList[j].col = tempList[j].col;
        }
        free(tempList);
    }
    
    return resultList;
}

int main(){
    char fileName[100];
    int power,i,length;
    
    cell* resultList;
    
    printf("Enter input file name : ");
    scanf("%s",fileName);
    
    printf("Enter power : ");
    scanf("%d",&power);
    
    resultList = kroneckerProduct(fileName,power);
    
    initwindow(raiseTo(ROW,power),raiseTo(COL,power),"Kronecker Product Fractal");
    
    length = raiseTo(SUM,power);

    for(i=0;i<length;i++){
        putpixel(resultList[i].row,resultList[i].col,15);
    }
    
    getch();
    
    closegraph();
    
    return 0;
}

C++

Library: Qt

This program produces image files in PNG format. The C++ code from Kronecker product is reused here.

#include <cassert>
#include <vector>

#include <QImage>

template <typename scalar_type> class matrix {
public:
    matrix(size_t rows, size_t columns)
        : rows_(rows), columns_(columns), elements_(rows * columns) {}
    matrix(size_t rows, size_t columns,
        const std::initializer_list<std::initializer_list<scalar_type>>& values)
        : rows_(rows), columns_(columns), elements_(rows * columns) {
        assert(values.size() <= rows_);
        size_t i = 0;
        for (const auto& row : values) {
            assert(row.size() <= columns_);
            std::copy(begin(row), end(row), &elements_[i]);
            i += columns_;
        }
    }
    size_t rows() const { return rows_; }
    size_t columns() const { return columns_; }

    const scalar_type& operator()(size_t row, size_t column) const {
        assert(row < rows_);
        assert(column < columns_);
        return elements_[row * columns_ + column];
    }
    scalar_type& operator()(size_t row, size_t column) {
        assert(row < rows_);
        assert(column < columns_);
        return elements_[row * columns_ + column];
    }
private:
    size_t rows_;
    size_t columns_;
    std::vector<scalar_type> elements_;
};

// See https://en.wikipedia.org/wiki/Kronecker_product
template <typename scalar_type>
matrix<scalar_type> kronecker_product(const matrix<scalar_type>& a,
                                      const matrix<scalar_type>& b) {
    size_t arows = a.rows();
    size_t acolumns = a.columns();
    size_t brows = b.rows();
    size_t bcolumns = b.columns();
    matrix<scalar_type> c(arows * brows, acolumns * bcolumns);
    for (size_t i = 0; i < arows; ++i)
        for (size_t j = 0; j < acolumns; ++j)
            for (size_t k = 0; k < brows; ++k)
                for (size_t l = 0; l < bcolumns; ++l)
                    c(i*brows + k, j*bcolumns + l) = a(i, j) * b(k, l);
    return c;
}

bool kronecker_fractal(const char* fileName, const matrix<unsigned char>& m, int order) {
    matrix<unsigned char> result = m;
    for (int i = 0; i < order; ++i)
        result = kronecker_product(result, m);

    size_t height = result.rows();
    size_t width = result.columns();
    size_t bytesPerLine = 4 * ((width + 3)/4);
    std::vector<uchar> imageData(bytesPerLine * height);

    for (size_t i = 0; i < height; ++i)
        for (size_t j = 0; j < width; ++j)
            imageData[i * bytesPerLine + j] = result(i, j);

    QImage image(&imageData[0], width, height, bytesPerLine, QImage::Format_Indexed8);
    QVector<QRgb> colours(2);
    colours[0] = qRgb(0, 0, 0);
    colours[1] = qRgb(255, 255, 255);
    image.setColorTable(colours);
    return image.save(fileName);
}

int main() {
    matrix<unsigned char> matrix1(3, 3, {{0,1,0}, {1,1,1}, {0,1,0}});
    matrix<unsigned char> matrix2(3, 3, {{1,1,1}, {1,0,1}, {1,1,1}});
    matrix<unsigned char> matrix3(2, 2, {{1,1}, {0,1}});
    kronecker_fractal("vicsek.png", matrix1, 5);
    kronecker_fractal("sierpinski_carpet.png", matrix2, 5);
    kronecker_fractal("sierpinski_triangle.png", matrix3, 8);
    return 0;
}
Output:

Media:Kronecker fractals sierpinski carpet.png
Media:Kronecker fractals sierpinski triangle.png
Media:Kronecker fractals vicsek.png

Factor

Works with: Factor version 0.99 2020-01-23
USING: io kernel math math.matrices.extras sequences ;

: mat-kron-pow ( m n -- m' )
    1 - [ dup kronecker-product ] times ;

: print-fractal ( m -- )
    [ [ 1 = "*" " " ? write ] each nl ] each ;
    
{ { 0 1 0 } { 1 1 1 } { 0 1 0 } }
{ { 1 1 1 } { 1 0 1 } { 1 1 1 } }
{ { 0 1 1 } { 0 1 0 } { 1 1 0 } }
[ 3 mat-kron-pow print-fractal ] tri@

Output shown at order 4 and 25% font size.

Output:
                                        *                                        
                                       ***                                       
                                        *                                        
                                     *  *  *                                     
                                    *********                                    
                                     *  *  *                                     
                                        *                                        
                                       ***                                       
                                        *                                        
                               *        *        *                               
                              ***      ***      ***                              
                               *        *        *                               
                            *  *  *  *  *  *  *  *  *                            
                           ***************************                           
                            *  *  *  *  *  *  *  *  *                            
                               *        *        *                               
                              ***      ***      ***                              
                               *        *        *                               
                                        *                                        
                                       ***                                       
                                        *                                        
                                     *  *  *                                     
                                    *********                                    
                                     *  *  *                                     
                                        *                                        
                                       ***                                       
                                        *                                        
             *                          *                          *             
            ***                        ***                        ***            
             *                          *                          *             
          *  *  *                    *  *  *                    *  *  *          
         *********                  *********                  *********         
          *  *  *                    *  *  *                    *  *  *          
             *                          *                          *             
            ***                        ***                        ***            
             *                          *                          *             
    *        *        *        *        *        *        *        *        *    
   ***      ***      ***      ***      ***      ***      ***      ***      ***   
    *        *        *        *        *        *        *        *        *    
 *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*********************************************************************************
 *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
    *        *        *        *        *        *        *        *        *    
   ***      ***      ***      ***      ***      ***      ***      ***      ***   
    *        *        *        *        *        *        *        *        *    
             *                          *                          *             
            ***                        ***                        ***            
             *                          *                          *             
          *  *  *                    *  *  *                    *  *  *          
         *********                  *********                  *********         
          *  *  *                    *  *  *                    *  *  *          
             *                          *                          *             
            ***                        ***                        ***            
             *                          *                          *             
                                        *                                        
                                       ***                                       
                                        *                                        
                                     *  *  *                                     
                                    *********                                    
                                     *  *  *                                     
                                        *                                        
                                       ***                                       
                                        *                                        
                               *        *        *                               
                              ***      ***      ***                              
                               *        *        *                               
                            *  *  *  *  *  *  *  *  *                            
                           ***************************                           
                            *  *  *  *  *  *  *  *  *                            
                               *        *        *                               
                              ***      ***      ***                              
                               *        *        *                               
                                        *                                        
                                       ***                                       
                                        *                                        
                                     *  *  *                                     
                                    *********                                    
                                     *  *  *                                     
                                        *                                        
                                       ***                                       
                                        *                                        
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * *
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
*********         ******************         ******************         *********
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** *
*********         ******************         ******************         *********
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
* *   * *         * *   * ** *   * *         * *   * ** *   * *         * *   * *
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
*********         ******************         ******************         *********
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** *
*********         ******************         ******************         *********
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * *
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***************************                           ***************************
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** *
***************************                           ***************************
***   ******   ******   ***                           ***   ******   ******   ***
* *   * ** *   * ** *   * *                           * *   * ** *   * ** *   * *
***   ******   ******   ***                           ***   ******   ******   ***
***************************                           ***************************
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** *
***************************                           ***************************
*********         *********                           *********         *********
* ** ** *         * ** ** *                           * ** ** *         * ** ** *
*********         *********                           *********         *********
***   ***         ***   ***                           ***   ***         ***   ***
* *   * *         * *   * *                           * *   * *         * *   * *
***   ***         ***   ***                           ***   ***         ***   ***
*********         *********                           *********         *********
* ** ** *         * ** ** *                           * ** ** *         * ** ** *
*********         *********                           *********         *********
***************************                           ***************************
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** *
***************************                           ***************************
***   ******   ******   ***                           ***   ******   ******   ***
* *   * ** *   * ** *   * *                           * *   * ** *   * ** *   * *
***   ******   ******   ***                           ***   ******   ******   ***
***************************                           ***************************
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** *
***************************                           ***************************
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * *
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
*********         ******************         ******************         *********
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** *
*********         ******************         ******************         *********
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
* *   * *         * *   * ** *   * *         * *   * ** *   * *         * *   * *
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
*********         ******************         ******************         *********
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** *
*********         ******************         ******************         *********
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * *
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
                                        ** **    ** **             ** **    ** **
                                        *  *     *  *              *  *     *  * 
                                       ** **    ** **             ** **    ** ** 
                                        **       **                **       **   
                                        *        *                 *        *    
                                       **       **                **       **    
                                     ** **    ** **             ** **    ** **   
                                     *  *     *  *              *  *     *  *    
                                    ** **    ** **             ** **    ** **    
                                        ** **                      ** **         
                                        *  *                       *  *          
                                       ** **                      ** **          
                                        **                         **            
                                        *                          *             
                                       **                         **             
                                     ** **                      ** **            
                                     *  *                       *  *             
                                    ** **                      ** **             
                               ** **    ** **             ** **    ** **         
                               *  *     *  *              *  *     *  *          
                              ** **    ** **             ** **    ** **          
                               **       **                **       **            
                               *        *                 *        *             
                              **       **                **       **             
                            ** **    ** **             ** **    ** **            
                            *  *     *  *              *  *     *  *             
                           ** **    ** **             ** **    ** **             
                                        ** **    ** **                           
                                        *  *     *  *                            
                                       ** **    ** **                            
                                        **       **                              
                                        *        *                               
                                       **       **                               
                                     ** **    ** **                              
                                     *  *     *  *                               
                                    ** **    ** **                               
                                        ** **                                    
                                        *  *                                     
                                       ** **                                     
                                        **                                       
                                        *                                        
                                       **                                        
                                     ** **                                       
                                     *  *                                        
                                    ** **                                        
                               ** **    ** **                                    
                               *  *     *  *                                     
                              ** **    ** **                                     
                               **       **                                       
                               *        *                                        
                              **       **                                        
                            ** **    ** **                                       
                            *  *     *  *                                        
                           ** **    ** **                                        
             ** **    ** **             ** **    ** **                           
             *  *     *  *              *  *     *  *                            
            ** **    ** **             ** **    ** **                            
             **       **                **       **                              
             *        *                 *        *                               
            **       **                **       **                               
          ** **    ** **             ** **    ** **                              
          *  *     *  *              *  *     *  *                               
         ** **    ** **             ** **    ** **                               
             ** **                      ** **                                    
             *  *                       *  *                                     
            ** **                      ** **                                     
             **                         **                                       
             *                          *                                        
            **                         **                                        
          ** **                      ** **                                       
          *  *                       *  *                                        
         ** **                      ** **                                        
    ** **    ** **             ** **    ** **                                    
    *  *     *  *              *  *     *  *                                     
   ** **    ** **             ** **    ** **                                     
    **       **                **       **                                       
    *        *                 *        *                                        
   **       **                **       **                                        
 ** **    ** **             ** **    ** **                                       
 *  *     *  *              *  *     *  *                                        
** **    ** **             ** **    ** **                                        

Fortran

A Fortran 90 implementation. Uses dense matrices and dynamic allocation for working arrays.

program Kron_frac
  implicit none

  interface
    function matkronpow(M, n) result(Mpowern)
      integer, dimension(:,:), intent(in) :: M
      integer, intent(in) :: n
      integer, dimension(size(M, 1)**n, size(M,2)**n) :: Mpowern
    end function matkronpow

    function kron(A, B) result(M)
      integer, dimension(:,:), intent(in) :: A, B
      integer, dimension(size(A,1)*size(B,1), size(A,2)*size(B,2)) :: M
    end function kron

    subroutine write2file(M, filename)
      integer, dimension(:,:), intent(in) :: M
      character(*), intent(in) :: filename
    end subroutine write2file
  end interface

  integer, parameter :: n = 4
  integer, dimension(3,3) :: Vicsek, Sierpinski
  integer, dimension(4,4) :: Hadamard
  integer, dimension(3**n, 3**n) :: fracV, fracS
  integer, dimension(4**n, 4**n) :: fracH

  Vicsek = reshape( (/0, 1, 0,&
                      1, 1, 1,&
                      0, 1, 0/),&
                    (/3,3/) )

  Sierpinski = reshape( (/1, 1, 1,&
                          1, 0, 1,&
                          1, 1, 1/),&
                          (/3,3/) )

  Hadamard = transpose(reshape( (/ 1, 0, 1, 0,&
                         1, 0, 0, 1,&
                         1, 1, 0, 0,&
                         1, 1, 1, 1/),&
                         (/4,4/) ))

  fracV = matkronpow(Vicsek, n)
  fracS = matkronpow(Sierpinski, n)
  fracH = matkronpow(Hadamard, n)

  call write2file(fracV, 'Viczek.txt')
  call write2file(fracS, 'Sierpinski.txt')
  call write2file(fracH, 'Hadamard.txt')

end program

function matkronpow(M, n) result(Mpowern)
interface
function kron(A, B) result(M)
  integer, dimension(:,:), intent(in) :: A, B
  integer, dimension(size(A,1)*size(B,1), size(A,2)*size(B,2)) :: M
  end function kron
end interface

  integer, dimension(:,:), intent(in) :: M
  integer, intent(in) :: n
  integer, dimension(size(M, 1)**n, size(M,2)**n) :: Mpowern
  integer, dimension(:,:), allocatable :: work1, work2
  integer :: icount

  if (n <= 1) then
     Mpowern = M
  else
    allocate(work1(size(M,1), size(M,2)))
    work1 = M
    do icount = 2,n
      allocate(work2(size(M,1)**icount, size(M,2)**icount))
      work2 = kron(work1, M)
      deallocate(work1)
      allocate(work1(size(M,1)**icount, size(M,2)**icount))
      work1 = work2
      deallocate(work2)
    end do
    Mpowern = work1
    deallocate(work1)
  end if

end function matkronpow

function kron(A, B) result(M)
  integer, dimension(:,:), intent(in) :: A, B
  integer, dimension(size(A,1)*size(B,1), size(A,2)*size(B,2)) :: M
  integer :: ia, ja, ib, jb, im, jm

  do ja = 1, size(A, 2)
    do ia = 1, size(A, 1)
      do jb = 1, size(B, 2)
        do ib = 1, size(B, 1)
          im = (ia - 1)*size(B, 1) + ib
          jm = (ja - 1)*size(B, 2) + jb
          M(im, jm) = A(ia, ja) * B(ib, jb)
        end do
      end do
    end do
  end do

end function kron

subroutine write2file(M, filename)
  integer, dimension(:,:), intent(in) :: M
  character(*), intent(in) :: filename
  integer :: ii, jj
  integer, parameter :: fi = 10

  open(fi, file=filename, status='replace')

  do ii = 1,size(M, 1)
    do jj = 1,size(M,2)
      if (M(ii,jj) == 0) then
        write(fi, '(A)', advance='no') ' '
      else
        write(fi, '(A)', advance='no') '*'
      end if
    end do
    write(fi, '(A)') ' '
  end do

  close(fi)

end subroutine write2file
Output:
                                        *                                         
                                       ***                                        
                                        *                                         
                                     *  *  *                                      
                                    *********                                     
                                     *  *  *                                      
                                        *                                         
                                       ***                                        
                                        *                                         
                               *        *        *                                
                              ***      ***      ***                               
                               *        *        *                                
                            *  *  *  *  *  *  *  *  *                             
                           ***************************                            
                            *  *  *  *  *  *  *  *  *                             
                               *        *        *                                
                              ***      ***      ***                               
                               *        *        *                                
                                        *                                         
                                       ***                                        
                                        *                                         
                                     *  *  *                                      
                                    *********                                     
                                     *  *  *                                      
                                        *                                         
                                       ***                                        
                                        *                                         
             *                          *                          *              
            ***                        ***                        ***             
             *                          *                          *              
          *  *  *                    *  *  *                    *  *  *           
         *********                  *********                  *********          
          *  *  *                    *  *  *                    *  *  *           
             *                          *                          *              
            ***                        ***                        ***             
             *                          *                          *              
    *        *        *        *        *        *        *        *        *     
   ***      ***      ***      ***      ***      ***      ***      ***      ***    
    *        *        *        *        *        *        *        *        *     
 *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  
********************************************************************************* 
 *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  
    *        *        *        *        *        *        *        *        *     
   ***      ***      ***      ***      ***      ***      ***      ***      ***    
    *        *        *        *        *        *        *        *        *     
             *                          *                          *              
            ***                        ***                        ***             
             *                          *                          *              
          *  *  *                    *  *  *                    *  *  *           
         *********                  *********                  *********          
          *  *  *                    *  *  *                    *  *  *           
             *                          *                          *              
            ***                        ***                        ***             
             *                          *                          *              
                                        *                                         
                                       ***                                        
                                        *                                         
                                     *  *  *                                      
                                    *********                                     
                                     *  *  *                                      
                                        *                                         
                                       ***                                        
                                        *                                         
                               *        *        *                                
                              ***      ***      ***                               
                               *        *        *                                
                            *  *  *  *  *  *  *  *  *                             
                           ***************************                            
                            *  *  *  *  *  *  *  *  *                             
                               *        *        *                                
                              ***      ***      ***                               
                               *        *        *                                
                                        *                                         
                                       ***                                        
                                        *                                         
                                     *  *  *                                      
                                    *********                                     
                                     *  *  *                                      
                                        *                                         
                                       ***                                        
                                        *                                         
********************************************************************************* 
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * 
********************************************************************************* 
***   ******   ******   ******   ******   ******   ******   ******   ******   *** 
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * * 
***   ******   ******   ******   ******   ******   ******   ******   ******   *** 
********************************************************************************* 
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * 
********************************************************************************* 
*********         ******************         ******************         ********* 
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** * 
*********         ******************         ******************         ********* 
***   ***         ***   ******   ***         ***   ******   ***         ***   *** 
* *   * *         * *   * ** *   * *         * *   * ** *   * *         * *   * * 
***   ***         ***   ******   ***         ***   ******   ***         ***   *** 
*********         ******************         ******************         ********* 
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** * 
*********         ******************         ******************         ********* 
********************************************************************************* 
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * 
********************************************************************************* 
***   ******   ******   ******   ******   ******   ******   ******   ******   *** 
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * * 
***   ******   ******   ******   ******   ******   ******   ******   ******   *** 
********************************************************************************* 
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * 
********************************************************************************* 
***************************                           *************************** 
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** * 
***************************                           *************************** 
***   ******   ******   ***                           ***   ******   ******   *** 
* *   * ** *   * ** *   * *                           * *   * ** *   * ** *   * * 
***   ******   ******   ***                           ***   ******   ******   *** 
***************************                           *************************** 
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** * 
***************************                           *************************** 
*********         *********                           *********         ********* 
* ** ** *         * ** ** *                           * ** ** *         * ** ** * 
*********         *********                           *********         ********* 
***   ***         ***   ***                           ***   ***         ***   *** 
* *   * *         * *   * *                           * *   * *         * *   * * 
***   ***         ***   ***                           ***   ***         ***   *** 
*********         *********                           *********         ********* 
* ** ** *         * ** ** *                           * ** ** *         * ** ** * 
*********         *********                           *********         ********* 
***************************                           *************************** 
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** * 
***************************                           *************************** 
***   ******   ******   ***                           ***   ******   ******   *** 
* *   * ** *   * ** *   * *                           * *   * ** *   * ** *   * * 
***   ******   ******   ***                           ***   ******   ******   *** 
***************************                           *************************** 
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** * 
***************************                           *************************** 
********************************************************************************* 
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * 
********************************************************************************* 
***   ******   ******   ******   ******   ******   ******   ******   ******   *** 
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * * 
***   ******   ******   ******   ******   ******   ******   ******   ******   *** 
********************************************************************************* 
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * 
********************************************************************************* 
*********         ******************         ******************         ********* 
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** * 
*********         ******************         ******************         ********* 
***   ***         ***   ******   ***         ***   ******   ***         ***   *** 
* *   * *         * *   * ** *   * *         * *   * ** *   * *         * *   * * 
***   ***         ***   ******   ***         ***   ******   ***         ***   *** 
*********         ******************         ******************         ********* 
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** * 
*********         ******************         ******************         ********* 
********************************************************************************* 
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * 
********************************************************************************* 
***   ******   ******   ******   ******   ******   ******   ******   ******   *** 
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * * 
***   ******   ******   ******   ******   ******   ******   ******   ******   *** 
********************************************************************************* 
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * 
********************************************************************************* 
* *     * *                     * *     * *                                                                                     * *     * *                     * *     * *                                                                                      
*  *    *  *                    *  *    *  *                                                                                    *  *    *  *                    *  *    *  *                                                                                     
**      **                      **      **                                                                                      **      **                      **      **                                                                                       
****    ****                    ****    ****                                                                                    ****    ****                    ****    ****                                                                                     
* *         * *                 * *         * *                                                                                 * *         * *                 * *         * *                                                                                  
*  *        *  *                *  *        *  *                                                                                *  *        *  *                *  *        *  *                                                                                 
**          **                  **          **                                                                                  **          **                  **          **                                                                                   
****        ****                ****        ****                                                                                ****        ****                ****        ****                                                                                 
* * * *                         * * * *                                                                                         * * * *                         * * * *                                                                                          
*  **  *                        *  **  *                                                                                        *  **  *                        *  **  *                                                                                         
**  **                          **  **                                                                                          **  **                          **  **                                                                                           
********                        ********                                                                                        ********                        ********                                                                                         
* * * * * * * *                 * * * * * * * *                                                                                 * * * * * * * *                 * * * * * * * *                                                                                  
*  **  **  **  *                *  **  **  **  *                                                                                *  **  **  **  *                *  **  **  **  *                                                                                 
**  **  **  **                  **  **  **  **                                                                                  **  **  **  **                  **  **  **  **                                                                                   
****************                ****************                                                                                ****************                ****************                                                                                 
* *     * *                                     * *     * *                                                                     * *     * *                                     * *     * *                                                                      
*  *    *  *                                    *  *    *  *                                                                    *  *    *  *                                    *  *    *  *                                                                     
**      **                                      **      **                                                                      **      **                                      **      **                                                                       
****    ****                                    ****    ****                                                                    ****    ****                                    ****    ****                                                                     
* *         * *                                 * *         * *                                                                 * *         * *                                 * *         * *                                                                  
*  *        *  *                                *  *        *  *                                                                *  *        *  *                                *  *        *  *                                                                 
**          **                                  **          **                                                                  **          **                                  **          **                                                                   
****        ****                                ****        ****                                                                ****        ****                                ****        ****                                                                 
* * * *                                         * * * *                                                                         * * * *                                         * * * *                                                                          
*  **  *                                        *  **  *                                                                        *  **  *                                        *  **  *                                                                         
**  **                                          **  **                                                                          **  **                                          **  **                                                                           
********                                        ********                                                                        ********                                        ********                                                                         
* * * * * * * *                                 * * * * * * * *                                                                 * * * * * * * *                                 * * * * * * * *                                                                  
*  **  **  **  *                                *  **  **  **  *                                                                *  **  **  **  *                                *  **  **  **  *                                                                 
**  **  **  **                                  **  **  **  **                                                                  **  **  **  **                                  **  **  **  **                                                                   
****************                                ****************                                                                ****************                                ****************                                                                 
* *     * *     * *     * *                                                                                                     * *     * *     * *     * *                                                                                                      
*  *    *  *    *  *    *  *                                                                                                    *  *    *  *    *  *    *  *                                                                                                     
**      **      **      **                                                                                                      **      **      **      **                                                                                                       
****    ****    ****    ****                                                                                                    ****    ****    ****    ****                                                                                                     
* *         * * * *         * *                                                                                                 * *         * * * *         * *                                                                                                  
*  *        *  **  *        *  *                                                                                                *  *        *  **  *        *  *                                                                                                 
**          **  **          **                                                                                                  **          **  **          **                                                                                                   
****        ********        ****                                                                                                ****        ********        ****                                                                                                 
* * * *         * * * *                                                                                                         * * * *         * * * *                                                                                                          
*  **  *        *  **  *                                                                                                        *  **  *        *  **  *                                                                                                         
**  **          **  **                                                                                                          **  **          **  **                                                                                                           
********        ********                                                                                                        ********        ********                                                                                                         
* * * * * * * * * * * * * * * *                                                                                                 * * * * * * * * * * * * * * * *                                                                                                  
*  **  **  **  **  **  **  **  *                                                                                                *  **  **  **  **  **  **  **  *                                                                                                 
**  **  **  **  **  **  **  **                                                                                                  **  **  **  **  **  **  **  **                                                                                                   
********************************                                                                                                ********************************                                                                                                 
* *     * *     * *     * *     * *     * *     * *     * *                                                                     * *     * *     * *     * *     * *     * *     * *     * *                                                                      
*  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *                                                                    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *                                                                     
**      **      **      **      **      **      **      **                                                                      **      **      **      **      **      **      **      **                                                                       
****    ****    ****    ****    ****    ****    ****    ****                                                                    ****    ****    ****    ****    ****    ****    ****    ****                                                                     
* *         * * * *         * * * *         * * * *         * *                                                                 * *         * * * *         * * * *         * * * *         * *                                                                  
*  *        *  **  *        *  **  *        *  **  *        *  *                                                                *  *        *  **  *        *  **  *        *  **  *        *  *                                                                 
**          **  **          **  **          **  **          **                                                                  **          **  **          **  **          **  **          **                                                                   
****        ********        ********        ********        ****                                                                ****        ********        ********        ********        ****                                                                 
* * * *         * * * *         * * * *         * * * *                                                                         * * * *         * * * *         * * * *         * * * *                                                                          
*  **  *        *  **  *        *  **  *        *  **  *                                                                        *  **  *        *  **  *        *  **  *        *  **  *                                                                         
**  **          **  **          **  **          **  **                                                                          **  **          **  **          **  **          **  **                                                                           
********        ********        ********        ********                                                                        ********        ********        ********        ********                                                                         
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *                                                                 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *                                                                  
*  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  *                                                                *  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  *                                                                 
**  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **                                                                  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **                                                                   
****************************************************************                                                                ****************************************************************                                                                 
* *     * *                     * *     * *                                                                                                                                                     * *     * *                     * *     * *                      
*  *    *  *                    *  *    *  *                                                                                                                                                    *  *    *  *                    *  *    *  *                     
**      **                      **      **                                                                                                                                                      **      **                      **      **                       
****    ****                    ****    ****                                                                                                                                                    ****    ****                    ****    ****                     
* *         * *                 * *         * *                                                                                                                                                 * *         * *                 * *         * *                  
*  *        *  *                *  *        *  *                                                                                                                                                *  *        *  *                *  *        *  *                 
**          **                  **          **                                                                                                                                                  **          **                  **          **                   
****        ****                ****        ****                                                                                                                                                ****        ****                ****        ****                 
* * * *                         * * * *                                                                                                                                                         * * * *                         * * * *                          
*  **  *                        *  **  *                                                                                                                                                        *  **  *                        *  **  *                         
**  **                          **  **                                                                                                                                                          **  **                          **  **                           
********                        ********                                                                                                                                                        ********                        ********                         
* * * * * * * *                 * * * * * * * *                                                                                                                                                 * * * * * * * *                 * * * * * * * *                  
*  **  **  **  *                *  **  **  **  *                                                                                                                                                *  **  **  **  *                *  **  **  **  *                 
**  **  **  **                  **  **  **  **                                                                                                                                                  **  **  **  **                  **  **  **  **                   
****************                ****************                                                                                                                                                ****************                ****************                 
* *     * *                                     * *     * *                                                                                                                                     * *     * *                                     * *     * *      
*  *    *  *                                    *  *    *  *                                                                                                                                    *  *    *  *                                    *  *    *  *     
**      **                                      **      **                                                                                                                                      **      **                                      **      **       
****    ****                                    ****    ****                                                                                                                                    ****    ****                                    ****    ****     
* *         * *                                 * *         * *                                                                                                                                 * *         * *                                 * *         * *  
*  *        *  *                                *  *        *  *                                                                                                                                *  *        *  *                                *  *        *  * 
**          **                                  **          **                                                                                                                                  **          **                                  **          **   
****        ****                                ****        ****                                                                                                                                ****        ****                                ****        **** 
* * * *                                         * * * *                                                                                                                                         * * * *                                         * * * *          
*  **  *                                        *  **  *                                                                                                                                        *  **  *                                        *  **  *         
**  **                                          **  **                                                                                                                                          **  **                                          **  **           
********                                        ********                                                                                                                                        ********                                        ********         
* * * * * * * *                                 * * * * * * * *                                                                                                                                 * * * * * * * *                                 * * * * * * * *  
*  **  **  **  *                                *  **  **  **  *                                                                                                                                *  **  **  **  *                                *  **  **  **  * 
**  **  **  **                                  **  **  **  **                                                                                                                                  **  **  **  **                                  **  **  **  **   
****************                                ****************                                                                                                                                ****************                                **************** 
* *     * *     * *     * *                                                                                                                                                                     * *     * *     * *     * *                                      
*  *    *  *    *  *    *  *                                                                                                                                                                    *  *    *  *    *  *    *  *                                     
**      **      **      **                                                                                                                                                                      **      **      **      **                                       
****    ****    ****    ****                                                                                                                                                                    ****    ****    ****    ****                                     
* *         * * * *         * *                                                                                                                                                                 * *         * * * *         * *                                  
*  *        *  **  *        *  *                                                                                                                                                                *  *        *  **  *        *  *                                 
**          **  **          **                                                                                                                                                                  **          **  **          **                                   
****        ********        ****                                                                                                                                                                ****        ********        ****                                 
* * * *         * * * *                                                                                                                                                                         * * * *         * * * *                                          
*  **  *        *  **  *                                                                                                                                                                        *  **  *        *  **  *                                         
**  **          **  **                                                                                                                                                                          **  **          **  **                                           
********        ********                                                                                                                                                                        ********        ********                                         
* * * * * * * * * * * * * * * *                                                                                                                                                                 * * * * * * * * * * * * * * * *                                  
*  **  **  **  **  **  **  **  *                                                                                                                                                                *  **  **  **  **  **  **  **  *                                 
**  **  **  **  **  **  **  **                                                                                                                                                                  **  **  **  **  **  **  **  **                                   
********************************                                                                                                                                                                ********************************                                 
* *     * *     * *     * *     * *     * *     * *     * *                                                                                                                                     * *     * *     * *     * *     * *     * *     * *     * *      
*  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *                                                                                                                                    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *     
**      **      **      **      **      **      **      **                                                                                                                                      **      **      **      **      **      **      **      **       
****    ****    ****    ****    ****    ****    ****    ****                                                                                                                                    ****    ****    ****    ****    ****    ****    ****    ****     
* *         * * * *         * * * *         * * * *         * *                                                                                                                                 * *         * * * *         * * * *         * * * *         * *  
*  *        *  **  *        *  **  *        *  **  *        *  *                                                                                                                                *  *        *  **  *        *  **  *        *  **  *        *  * 
**          **  **          **  **          **  **          **                                                                                                                                  **          **  **          **  **          **  **          **   
****        ********        ********        ********        ****                                                                                                                                ****        ********        ********        ********        **** 
* * * *         * * * *         * * * *         * * * *                                                                                                                                         * * * *         * * * *         * * * *         * * * *          
*  **  *        *  **  *        *  **  *        *  **  *                                                                                                                                        *  **  *        *  **  *        *  **  *        *  **  *         
**  **          **  **          **  **          **  **                                                                                                                                          **  **          **  **          **  **          **  **           
********        ********        ********        ********                                                                                                                                        ********        ********        ********        ********         
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *                                                                                                                                 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *  
*  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  *                                                                                                                                *  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  * 
**  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **                                                                                                                                  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **   
****************************************************************                                                                                                                                **************************************************************** 
* *     * *                     * *     * *                     * *     * *                     * *     * *                                                                                                                                                      
*  *    *  *                    *  *    *  *                    *  *    *  *                    *  *    *  *                                                                                                                                                     
**      **                      **      **                      **      **                      **      **                                                                                                                                                       
****    ****                    ****    ****                    ****    ****                    ****    ****                                                                                                                                                     
* *         * *                 * *         * *                 * *         * *                 * *         * *                                                                                                                                                  
*  *        *  *                *  *        *  *                *  *        *  *                *  *        *  *                                                                                                                                                 
**          **                  **          **                  **          **                  **          **                                                                                                                                                   
****        ****                ****        ****                ****        ****                ****        ****                                                                                                                                                 
* * * *                         * * * *                         * * * *                         * * * *                                                                                                                                                          
*  **  *                        *  **  *                        *  **  *                        *  **  *                                                                                                                                                         
**  **                          **  **                          **  **                          **  **                                                                                                                                                           
********                        ********                        ********                        ********                                                                                                                                                         
* * * * * * * *                 * * * * * * * *                 * * * * * * * *                 * * * * * * * *                                                                                                                                                  
*  **  **  **  *                *  **  **  **  *                *  **  **  **  *                *  **  **  **  *                                                                                                                                                 
**  **  **  **                  **  **  **  **                  **  **  **  **                  **  **  **  **                                                                                                                                                   
****************                ****************                ****************                ****************                                                                                                                                                 
* *     * *                                     * *     * *     * *     * *                                     * *     * *                                                                                                                                      
*  *    *  *                                    *  *    *  *    *  *    *  *                                    *  *    *  *                                                                                                                                     
**      **                                      **      **      **      **                                      **      **                                                                                                                                       
****    ****                                    ****    ****    ****    ****                                    ****    ****                                                                                                                                     
* *         * *                                 * *         * * * *         * *                                 * *         * *                                                                                                                                  
*  *        *  *                                *  *        *  **  *        *  *                                *  *        *  *                                                                                                                                 
**          **                                  **          **  **          **                                  **          **                                                                                                                                   
****        ****                                ****        ********        ****                                ****        ****                                                                                                                                 
* * * *                                         * * * *         * * * *                                         * * * *                                                                                                                                          
*  **  *                                        *  **  *        *  **  *                                        *  **  *                                                                                                                                         
**  **                                          **  **          **  **                                          **  **                                                                                                                                           
********                                        ********        ********                                        ********                                                                                                                                         
* * * * * * * *                                 * * * * * * * * * * * * * * * *                                 * * * * * * * *                                                                                                                                  
*  **  **  **  *                                *  **  **  **  **  **  **  **  *                                *  **  **  **  *                                                                                                                                 
**  **  **  **                                  **  **  **  **  **  **  **  **                                  **  **  **  **                                                                                                                                   
****************                                ********************************                                ****************                                                                                                                                 
* *     * *     * *     * *                                     * *     * *     * *     * *                                                                                                                                                                      
*  *    *  *    *  *    *  *                                    *  *    *  *    *  *    *  *                                                                                                                                                                     
**      **      **      **                                      **      **      **      **                                                                                                                                                                       
****    ****    ****    ****                                    ****    ****    ****    ****                                                                                                                                                                     
* *         * * * *         * *                                 * *         * * * *         * *                                                                                                                                                                  
*  *        *  **  *        *  *                                *  *        *  **  *        *  *                                                                                                                                                                 
**          **  **          **                                  **          **  **          **                                                                                                                                                                   
****        ********        ****                                ****        ********        ****                                                                                                                                                                 
* * * *         * * * *                                         * * * *         * * * *                                                                                                                                                                          
*  **  *        *  **  *                                        *  **  *        *  **  *                                                                                                                                                                         
**  **          **  **                                          **  **          **  **                                                                                                                                                                           
********        ********                                        ********        ********                                                                                                                                                                         
* * * * * * * * * * * * * * * *                                 * * * * * * * * * * * * * * * *                                                                                                                                                                  
*  **  **  **  **  **  **  **  *                                *  **  **  **  **  **  **  **  *                                                                                                                                                                 
**  **  **  **  **  **  **  **                                  **  **  **  **  **  **  **  **                                                                                                                                                                   
********************************                                ********************************                                                                                                                                                                 
* *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *                                                                                                                                      
*  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *                                                                                                                                     
**      **      **      **      **      **      **      **      **      **      **      **      **      **      **      **                                                                                                                                       
****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****                                                                                                                                     
* *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * *                                                                                                                                  
*  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  *                                                                                                                                 
**          **  **          **  **          **  **          **  **          **  **          **  **          **  **          **                                                                                                                                   
****        ********        ********        ********        ********        ********        ********        ********        ****                                                                                                                                 
* * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *                                                                                                                                          
*  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *                                                                                                                                         
**  **          **  **          **  **          **  **          **  **          **  **          **  **          **  **                                                                                                                                           
********        ********        ********        ********        ********        ********        ********        ********                                                                                                                                         
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *                                                                                                                                  
*  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  *                                                                                                                                 
**  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **                                                                                                                                   
********************************************************************************************************************************                                                                                                                                 
* *     * *                     * *     * *                     * *     * *                     * *     * *                     * *     * *                     * *     * *                     * *     * *                     * *     * *                      
*  *    *  *                    *  *    *  *                    *  *    *  *                    *  *    *  *                    *  *    *  *                    *  *    *  *                    *  *    *  *                    *  *    *  *                     
**      **                      **      **                      **      **                      **      **                      **      **                      **      **                      **      **                      **      **                       
****    ****                    ****    ****                    ****    ****                    ****    ****                    ****    ****                    ****    ****                    ****    ****                    ****    ****                     
* *         * *                 * *         * *                 * *         * *                 * *         * *                 * *         * *                 * *         * *                 * *         * *                 * *         * *                  
*  *        *  *                *  *        *  *                *  *        *  *                *  *        *  *                *  *        *  *                *  *        *  *                *  *        *  *                *  *        *  *                 
**          **                  **          **                  **          **                  **          **                  **          **                  **          **                  **          **                  **          **                   
****        ****                ****        ****                ****        ****                ****        ****                ****        ****                ****        ****                ****        ****                ****        ****                 
* * * *                         * * * *                         * * * *                         * * * *                         * * * *                         * * * *                         * * * *                         * * * *                          
*  **  *                        *  **  *                        *  **  *                        *  **  *                        *  **  *                        *  **  *                        *  **  *                        *  **  *                         
**  **                          **  **                          **  **                          **  **                          **  **                          **  **                          **  **                          **  **                           
********                        ********                        ********                        ********                        ********                        ********                        ********                        ********                         
* * * * * * * *                 * * * * * * * *                 * * * * * * * *                 * * * * * * * *                 * * * * * * * *                 * * * * * * * *                 * * * * * * * *                 * * * * * * * *                  
*  **  **  **  *                *  **  **  **  *                *  **  **  **  *                *  **  **  **  *                *  **  **  **  *                *  **  **  **  *                *  **  **  **  *                *  **  **  **  *                 
**  **  **  **                  **  **  **  **                  **  **  **  **                  **  **  **  **                  **  **  **  **                  **  **  **  **                  **  **  **  **                  **  **  **  **                   
****************                ****************                ****************                ****************                ****************                ****************                ****************                ****************                 
* *     * *                                     * *     * *     * *     * *                                     * *     * *     * *     * *                                     * *     * *     * *     * *                                     * *     * *      
*  *    *  *                                    *  *    *  *    *  *    *  *                                    *  *    *  *    *  *    *  *                                    *  *    *  *    *  *    *  *                                    *  *    *  *     
**      **                                      **      **      **      **                                      **      **      **      **                                      **      **      **      **                                      **      **       
****    ****                                    ****    ****    ****    ****                                    ****    ****    ****    ****                                    ****    ****    ****    ****                                    ****    ****     
* *         * *                                 * *         * * * *         * *                                 * *         * * * *         * *                                 * *         * * * *         * *                                 * *         * *  
*  *        *  *                                *  *        *  **  *        *  *                                *  *        *  **  *        *  *                                *  *        *  **  *        *  *                                *  *        *  * 
**          **                                  **          **  **          **                                  **          **  **          **                                  **          **  **          **                                  **          **   
****        ****                                ****        ********        ****                                ****        ********        ****                                ****        ********        ****                                ****        **** 
* * * *                                         * * * *         * * * *                                         * * * *         * * * *                                         * * * *         * * * *                                         * * * *          
*  **  *                                        *  **  *        *  **  *                                        *  **  *        *  **  *                                        *  **  *        *  **  *                                        *  **  *         
**  **                                          **  **          **  **                                          **  **          **  **                                          **  **          **  **                                          **  **           
********                                        ********        ********                                        ********        ********                                        ********        ********                                        ********         
* * * * * * * *                                 * * * * * * * * * * * * * * * *                                 * * * * * * * * * * * * * * * *                                 * * * * * * * * * * * * * * * *                                 * * * * * * * *  
*  **  **  **  *                                *  **  **  **  **  **  **  **  *                                *  **  **  **  **  **  **  **  *                                *  **  **  **  **  **  **  **  *                                *  **  **  **  * 
**  **  **  **                                  **  **  **  **  **  **  **  **                                  **  **  **  **  **  **  **  **                                  **  **  **  **  **  **  **  **                                  **  **  **  **   
****************                                ********************************                                ********************************                                ********************************                                **************** 
* *     * *     * *     * *                                     * *     * *     * *     * *                                     * *     * *     * *     * *                                     * *     * *     * *     * *                                      
*  *    *  *    *  *    *  *                                    *  *    *  *    *  *    *  *                                    *  *    *  *    *  *    *  *                                    *  *    *  *    *  *    *  *                                     
**      **      **      **                                      **      **      **      **                                      **      **      **      **                                      **      **      **      **                                       
****    ****    ****    ****                                    ****    ****    ****    ****                                    ****    ****    ****    ****                                    ****    ****    ****    ****                                     
* *         * * * *         * *                                 * *         * * * *         * *                                 * *         * * * *         * *                                 * *         * * * *         * *                                  
*  *        *  **  *        *  *                                *  *        *  **  *        *  *                                *  *        *  **  *        *  *                                *  *        *  **  *        *  *                                 
**          **  **          **                                  **          **  **          **                                  **          **  **          **                                  **          **  **          **                                   
****        ********        ****                                ****        ********        ****                                ****        ********        ****                                ****        ********        ****                                 
* * * *         * * * *                                         * * * *         * * * *                                         * * * *         * * * *                                         * * * *         * * * *                                          
*  **  *        *  **  *                                        *  **  *        *  **  *                                        *  **  *        *  **  *                                        *  **  *        *  **  *                                         
**  **          **  **                                          **  **          **  **                                          **  **          **  **                                          **  **          **  **                                           
********        ********                                        ********        ********                                        ********        ********                                        ********        ********                                         
* * * * * * * * * * * * * * * *                                 * * * * * * * * * * * * * * * *                                 * * * * * * * * * * * * * * * *                                 * * * * * * * * * * * * * * * *                                  
*  **  **  **  **  **  **  **  *                                *  **  **  **  **  **  **  **  *                                *  **  **  **  **  **  **  **  *                                *  **  **  **  **  **  **  **  *                                 
**  **  **  **  **  **  **  **                                  **  **  **  **  **  **  **  **                                  **  **  **  **  **  **  **  **                                  **  **  **  **  **  **  **  **                                   
********************************                                ********************************                                ********************************                                ********************************                                 
* *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *     * *      
*  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *    *  *     
**      **      **      **      **      **      **      **      **      **      **      **      **      **      **      **      **      **      **      **      **      **      **      **      **      **      **      **      **      **      **      **       
****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****    ****     
* *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * *  
*  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  * 
**          **  **          **  **          **  **          **  **          **  **          **  **          **  **          **  **          **  **          **  **          **  **          **  **          **  **          **  **          **  **          **   
****        ********        ********        ********        ********        ********        ********        ********        ********        ********        ********        ********        ********        ********        ********        ********        **** 
* * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *         * * * *          
*  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *        *  **  *         
**  **          **  **          **  **          **  **          **  **          **  **          **  **          **  **          **  **          **  **          **  **          **  **          **  **          **  **          **  **          **  **           
********        ********        ********        ********        ********        ********        ********        ********        ********        ********        ********        ********        ********        ********        ********        ********         
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *  
*  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  * 
**  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **  **   
**************************************************************************************************************************************************************************************************************************************************************** 

FreeBASIC

Type Matrix
    As Integer x
    As Integer y
    As Integer Ptr Dato
End Type

Function kroneckerProduct(a As Matrix, b As Matrix) As Matrix
    Dim As Integer m = a.x, n = a.y
    Dim As Integer p = b.x, q = b.y
    Dim As Matrix r
    r.x = m * p
    r.y = n * q
    r.dato = Callocate(r.x * r.y, Sizeof(Integer))
    Dim As Integer i, j, k, l
    For i = 0 To m - 1
        For j = 0 To n - 1
            For k = 0 To p - 1
                For l = 0 To q - 1
                    r.dato[(p * i + k) * r.y + (q * j + l)] = a.dato[i * a.y + j] * b.dato[k * b.y + l]
                Next
            Next
        Next
    Next
    Return r
End Function

Function kroneckerPower(a As Matrix, n As Integer) As Matrix
    Dim As Matrix pow = a
    For i As Integer = 1 To n - 1
        pow = kroneckerProduct(pow, a)
    Next
    Return pow
End Function

Sub printMatrix(text As String, m As Matrix)
    Dim As Integer i, j
    Print text & " fractal:"
    For i = 0 To m.x - 1
        For j = 0 To m.y - 1
            Print Iif(m.dato[i * m.y + j] = 1, "*", " ");
        Next
        Print
    Next
    Print
End Sub

Dim As Matrix a = Type(3, 3, Callocate(9, Sizeof(Integer)))
a.dato[0] = 0: a.dato[1] = 1: a.dato[2] = 0
a.dato[3] = 1: a.dato[4] = 1: a.dato[5] = 1
a.dato[6] = 0: a.dato[7] = 1: a.dato[8] = 0
printMatrix("Vicsek", kroneckerPower(a, 4))

a.dato[0] = 1: a.dato[1] = 1: a.dato[2] = 1
a.dato[3] = 1: a.dato[4] = 0: a.dato[5] = 1
a.dato[6] = 1: a.dato[7] = 1: a.dato[8] = 1
printMatrix("Sierpinski carpet", kroneckerPower(a, 4))

Sleep
Output:
Same as Kotlin entry.

gnuplot

File for the load command is the only possible imitation of the fine function in the gnuplot.

Note
  • Find plotff.gp here on RC
  • dat-files are PARI/GP generated output files. They are too big to post them here on RC.


Works with: gnuplot version 5.0 (patchlevel 3) and above
File:Pkf1.png
Output pkf1.png
File:Pkf2.png
Output pkf2.png
File:Pkf3.png
Output pkf3.png
## KPF.gp 4/8/17 aev
## Plotting 3 KPF pictures.
## dat-files are PARI/GP generated output files: 
#cd 'C:\gnupData'

##PKF1 from PARI/GP created file pkf1.dat
ttl = "Vicsec fractal"; clr = '"blue"'; filename = "pkf1"; 
load "plotff.gp"

##PKF2 from PARI/GP created file pkf2.dat
ttl = "Sierpinski carpet fractal"; clr = '"navy"';filename = "pkf2";
load "plotff.gp"

##PKF3 from PARI/GP created file pkf3.dat
ttl = "Sierpinski triangle fractal"; clr = '"dark-green"'; filename = "pkf3";
load "plotff.gp"
Output:
3 plotted files: pkf1.png, pkf2.png and pkf3.png.

Fōrmulæ

Fōrmulæ programs are not textual, visualization/edition of programs is done showing/manipulating structures but not text. Moreover, there can be multiple visual representations of the same program. Even though it is possible to have textual representation —i.e. XML, JSON— they are intended for storage and transfer purposes more than visualization and edition.

Programs in Fōrmulæ are created/edited online in its website.

In this page you can see and run the program(s) related to this task and their results. You can also change either the programs or the parameters they are called with, for experimentation, but remember that these programs were created with the main purpose of showing a clear solution of the task, and they generally lack any kind of validation.

Solution

Test case 1. Vicsek fractal

Cross form

Saltire form

Test case 2. Sierpiński carpet fractal

Test case 3. Sierpiński triangle fractal

Test case 3. Other cases

Test case 4. Numbers between 0 and 1 can be used, to produce greyscale shades

(click or tap to see in real size)

Go

Translation of: Kotlin
package main

import "fmt"

type matrix [][]int

func (m1 matrix) kroneckerProduct(m2 matrix) matrix {
    m := len(m1)
    n := len(m1[0])
    p := len(m2)
    q := len(m2[0])
    rtn := m * p
    ctn := n * q
    r := make(matrix, rtn)
    for i := range r {
        r[i] = make([]int, ctn) // all elements zero by default
    }
    for i := 0; i < m; i++ {
        for j := 0; j < n; j++ {
            for k := 0; k < p; k++ {
                for l := 0; l < q; l++ {
                    r[p*i+k][q*j+l] = m1[i][j] * m2[k][l]
                }
            }
        }
    }
    return r
}

func (m matrix) kroneckerPower(n int) matrix {
    pow := m
    for i := 1; i < n; i++ {
        pow = pow.kroneckerProduct(m)
    }
    return pow
}

func (m matrix) print(text string) {
    fmt.Println(text, "fractal :\n")
    for i := range m {
        for j := range m[0] {
            if m[i][j] == 1 {
                fmt.Print("*")
            } else {
                fmt.Print(" ")
            }
        }
        fmt.Println()
    }
    fmt.Println()
}

func main() {
    m1 := matrix{{0, 1, 0}, {1, 1, 1}, {0, 1, 0}}
    m1.kroneckerPower(4).print("Vivsek")

    m2 := matrix{{1, 1, 1}, {1, 0, 1}, {1, 1, 1}}
    m2.kroneckerPower(4).print("Sierpinski carpet")
}
Output:
Same as Kotlin entry.

Haskell

Works with: Chrome and Firefox

This implementation compiles to javascript that runs in the browser using the ghcjs compiler . The reflex-dom library is used to help with svg rendering.

{-# LANGUAGE OverloadedStrings #-}
import Reflex
import Reflex.Dom
import Data.Map as DM (Map, fromList)
import Data.Text (Text, pack)
import Data.List (transpose)

-- Show Vicsek and Sierpinski Carpet fractals
main :: IO ()
main = mainWidget $ do 
  elAttr "h1" ("style" =: "color:black") $ text "Kroneker Product Based Fractals" 
  elAttr "a" ("href" =: "http://rosettacode.org/wiki/Kronecker_product_based_fractals#Haskell") $ text "Rosetta Code / Kroneker product based fractals / Haskell"

  -- Show a Vicsek fractal
  el "br" $ return ()
  elAttr "h2" ("style" =: "color:brown") $ text "Vicsek Fractal" 
  showFractal [[0, 1, 0] ,[1, 1, 1] ,[0, 1, 0] ]

  -- Show a Sierpinski Carpet fractal
  el "br" $ return ()
  elAttr "h2" ("style" =: "color:brown") $ text "Sierpinski Carpet Fractal" 
  showFractal [[1, 1, 1] ,[1, 0, 1] ,[1, 1, 1] ]

-- Size in pixels of an individual cell
cellSize :: Int
cellSize = 8

-- Given a "seed" matrix, generate and display a fractal.
showFractal :: MonadWidget t m => [[Int]] -> m ()
showFractal seed = do
  let boardAttrs w h = 
         fromList [ ("width" , pack $ show $ w * cellSize)
                  , ("height", pack $ show $ h * cellSize)
                  ]
      fractals = iterate (kronekerProduct seed) seed
      shown = fractals !! 3 -- the fourth fractal (starting from 0)
      w = length $ head shown
      h = length shown
  elSvgns "svg" (constDyn $ boardAttrs w h) $ showMatrix shown

-- Compute the Kroneker product of two matrices.
kronekerProduct :: Num a => [[a]] -> [[a]] -> [[a]]
kronekerProduct xs ys = 
    let m0 = flip $ fmap.fmap.(*)
        m1 = flip $ fmap.fmap.m0
    in concat $ fmap (fmap concat.transpose) $ m1 xs ys

-- Show an entire matrix
showMatrix :: MonadWidget t m => [[Int]] -> m ()
showMatrix m = mapM_ showRow $ zip [0..] m 

-- Show a single horizontal row of a matrix
showRow :: MonadWidget t m => (Int,[Int]) -> m ()
showRow (x,r) = mapM_ (showCell x) $ zip [0..] r 

-- Show a circle in a box moved to the correct location on screen
showCell :: MonadWidget t m => Int -> (Int,Int) -> m ()
showCell x (y,on) = 
  let boxAttrs (x,y) = -- Place box on screen
        fromList [ ("transform", 
                    pack $    "scale (" ++ show cellSize ++ ", " ++ show cellSize ++ ") " 
                           ++ "translate (" ++ show x ++ ", " ++ show y ++ ")" 
                   )
                 ] 

      cellAttrs = -- Draw circle in box.
        fromList [ ( "cx",      "0.5")
                 , ( "cy",      "0.5")
                 , ( "r",       "0.45")
                 , ( "style",   "fill:green")
                 ] 

  in if (on==1) then  -- Only draw circle for elements containing 1
       elSvgns "g"  (constDyn $ boxAttrs (x,y)) $ 
         elSvgns "circle" (constDyn $ cellAttrs) $ 
           return ()
     else
       return ()

-- Wrapper around elDynAttrNS'
elSvgns :: MonadWidget t m => Text -> Dynamic t (Map Text Text) -> m a -> m a
elSvgns t m ma = do
    (el, val) <- elDynAttrNS' (Just "http://www.w3.org/2000/svg") t m ma
    return val

Link to live demo: https://dc25.github.io/rosettaCode__Kronecker_product_based_fractals/ ( a little slow to load ).

J

Implementation:

V=: -.0 2 6 8 e.~i.3 3
S=: 4 ~:i.3 3
KP=: 1 3 ,/"2@(,/)@|: */

ascii_art=: ' *'{~]

KPfractal=:dyad def 'x&KP^:y,.1'

Task examples (order 4, 25% font size):

   ascii_art S KPfractal 4
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * *
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
*********         ******************         ******************         *********
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** *
*********         ******************         ******************         *********
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
* *   * *         * *   * ** *   * *         * *   * ** *   * *         * *   * *
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
*********         ******************         ******************         *********
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** *
*********         ******************         ******************         *********
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * *
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***************************                           ***************************
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** *
***************************                           ***************************
***   ******   ******   ***                           ***   ******   ******   ***
* *   * ** *   * ** *   * *                           * *   * ** *   * ** *   * *
***   ******   ******   ***                           ***   ******   ******   ***
***************************                           ***************************
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** *
***************************                           ***************************
*********         *********                           *********         *********
* ** ** *         * ** ** *                           * ** ** *         * ** ** *
*********         *********                           *********         *********
***   ***         ***   ***                           ***   ***         ***   ***
* *   * *         * *   * *                           * *   * *         * *   * *
***   ***         ***   ***                           ***   ***         ***   ***
*********         *********                           *********         *********
* ** ** *         * ** ** *                           * ** ** *         * ** ** *
*********         *********                           *********         *********
***************************                           ***************************
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** *
***************************                           ***************************
***   ******   ******   ***                           ***   ******   ******   ***
* *   * ** *   * ** *   * *                           * *   * ** *   * ** *   * *
***   ******   ******   ***                           ***   ******   ******   ***
***************************                           ***************************
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** *
***************************                           ***************************
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * *
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
*********         ******************         ******************         *********
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** *
*********         ******************         ******************         *********
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
* *   * *         * *   * ** *   * *         * *   * ** *   * *         * *   * *
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
*********         ******************         ******************         *********
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** *
*********         ******************         ******************         *********
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * *
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
   ascii_art V KPfractal 4
                                        *                                        
                                       ***                                       
                                        *                                        
                                     *  *  *                                     
                                    *********                                    
                                     *  *  *                                     
                                        *                                        
                                       ***                                       
                                        *                                        
                               *        *        *                               
                              ***      ***      ***                              
                               *        *        *                               
                            *  *  *  *  *  *  *  *  *                            
                           ***************************                           
                            *  *  *  *  *  *  *  *  *                            
                               *        *        *                               
                              ***      ***      ***                              
                               *        *        *                               
                                        *                                        
                                       ***                                       
                                        *                                        
                                     *  *  *                                     
                                    *********                                    
                                     *  *  *                                     
                                        *                                        
                                       ***                                       
                                        *                                        
             *                          *                          *             
            ***                        ***                        ***            
             *                          *                          *             
          *  *  *                    *  *  *                    *  *  *          
         *********                  *********                  *********         
          *  *  *                    *  *  *                    *  *  *          
             *                          *                          *             
            ***                        ***                        ***            
             *                          *                          *             
    *        *        *        *        *        *        *        *        *    
   ***      ***      ***      ***      ***      ***      ***      ***      ***   
    *        *        *        *        *        *        *        *        *    
 *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*********************************************************************************
 *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
    *        *        *        *        *        *        *        *        *    
   ***      ***      ***      ***      ***      ***      ***      ***      ***   
    *        *        *        *        *        *        *        *        *    
             *                          *                          *             
            ***                        ***                        ***            
             *                          *                          *             
          *  *  *                    *  *  *                    *  *  *          
         *********                  *********                  *********         
          *  *  *                    *  *  *                    *  *  *          
             *                          *                          *             
            ***                        ***                        ***            
             *                          *                          *             
                                        *                                        
                                       ***                                       
                                        *                                        
                                     *  *  *                                     
                                    *********                                    
                                     *  *  *                                     
                                        *                                        
                                       ***                                       
                                        *                                        
                               *        *        *                               
                              ***      ***      ***                              
                               *        *        *                               
                            *  *  *  *  *  *  *  *  *                            
                           ***************************                           
                            *  *  *  *  *  *  *  *  *                            
                               *        *        *                               
                              ***      ***      ***                              
                               *        *        *                               
                                        *                                        
                                       ***                                       
                                        *                                        
                                     *  *  *                                     
                                    *********                                    
                                     *  *  *                                     
                                        *                                        
                                       ***                                       
                                        *

Java

This implementation does not use sparse matrices since the powers involved do not exceed 4.

package kronecker;

/**
 * Uses the Kronecker product powers of two rectangular matrices
 * to generate fractals and tests it with three examples.
 */
public class ProductFractals {
  /**
   * Find the Kronecker product of the arguments.
   * @param a The first matrix to multiply.
   * @param b The second matrix to multiply.
   * @return A new matrix: the Kronecker product of the arguments.
   */
  public static int[][] product(final int[][] a, final int[][] b) {
    // Create matrix c as the matrix to fill and return.
    // The length of a matrix is its number of rows.
    final int[][] c = new int[a.length*b.length][];
    // Fill in the (empty) rows of c.
    // The length of each row is the number of columns.
    for (int ix = 0; ix < c.length; ix++) {
      final int num_cols = a[0].length*b[0].length;
      c[ix] = new int[num_cols];
    }
    // Now fill in the values: the products of each pair.
    // Go through all the elements of a.
    for (int ia = 0; ia < a.length; ia++) {
      for (int ja = 0; ja < a[ia].length; ja++) {
        // For each element of a, multiply it by all the elements of b.
        for (int ib = 0; ib < b.length; ib++) {
          for (int jb = 0; jb < b[ib].length; jb++) {
             c[b.length*ia+ib][b[ib].length*ja+jb] = a[ia][ja] * b[ib][jb];
          }
        }
      }
    }

    // Return the completed product matrix c.
    return c;
  }

  /**
   * Print an image obtained from an integer matrix, using the specified
   * characters to indicate non-zero and zero elements.
   * @param m The matrix to print.
   * @param nz The character to print for a non-zero element.
   * @param z The character to print for a zero element.
   */
  public static void show_matrix(final int[][] m, final char nz, final char z) {
    for (int im = 0; im < m.length; im++) {
      for (int jm = 0; jm < m[im].length; jm++) {
        System.out.print(m[im][jm] == 0 ? z : nz);
      }
      System.out.println();
    }
  }

  /**
   * Compute the specified Kronecker product power
   * of the matrix and return  it.
   * @param m The matrix to raise to the power.
   * @param n The power to which to raise the matrix.
   * @return A new matrix containing the resulting power.
   */
  public static int[][] power(final int[][] m, final int n) {
    // Start with m itself as the first power.
    int[][] m_pow = m;
    // Start the iteration with 1, not 0,
    // since we already have the first power.
    for (int ix = 1; ix < n; ix++) {
      m_pow = product(m, m_pow);
    }
    return m_pow;
  }

  /**
   * Run a test by computing the specified Kronecker product power
   * of the matrix and printing matrix and power.
   * @param m The base matrix raise to the power.
   * @param n The power to which to raise the matrix.
   */
  private static void test(final int[][] m, final int n) {
    System.out.println("Test matrix");
    show_matrix(m, '*', ' ');
    final int[][] m_pow = power(m, n);
    System.out.println("Matrix power " + n);
    show_matrix(m_pow, '*', ' ');
  }

  /**
   * Create the matrix for the first test and run the test.
   */
  private static void test1() {
    // Create the matrix.
    final int[][] m = {{0, 1, 0},
                       {1, 1, 1},
                       {0, 1, 0}};
    // Run the test.
    test(m, 4);
  }

  /**
   * Create the matrix for the second test and run the test.
   */
  private static void test2() {
    // Create the matrix.
    final int[][] m = {{1, 1, 1},
                       {1, 0, 1},
                       {1, 1, 1}};
    // Run the test.
    test(m, 4);
  }

  /**
   * Create the matrix for the second test and run the test.
   */
  private static void test3() {
    // Create the matrix.
    final int[][] m = {{1, 0, 1},
                       {1, 0, 1},
                       {0, 1, 0}};
    // Run the test.
    test(m, 4);
  }

  /**
   * Run the program to run the three tests.
   * @param args Command line arguments (not used).
   */
  public static void main(final String[] args) {
    // Test the product fractals.
    test1();
    test2();
    test3();
  }

}
Output:

This output uses 50% font size. Of course, it shows ASCII height distortion.

Test matrix
 * 
***
 * 
Matrix power 4
                                        *                                        
                                       ***                                       
                                        *                                        
                                     *  *  *                                     
                                    *********                                    
                                     *  *  *                                     
                                        *                                        
                                       ***                                       
                                        *                                        
                               *        *        *                               
                              ***      ***      ***                              
                               *        *        *                               
                            *  *  *  *  *  *  *  *  *                            
                           ***************************                           
                            *  *  *  *  *  *  *  *  *                            
                               *        *        *                               
                              ***      ***      ***                              
                               *        *        *                               
                                        *                                        
                                       ***                                       
                                        *                                        
                                     *  *  *                                     
                                    *********                                    
                                     *  *  *                                     
                                        *                                        
                                       ***                                       
                                        *                                        
             *                          *                          *             
            ***                        ***                        ***            
             *                          *                          *             
          *  *  *                    *  *  *                    *  *  *          
         *********                  *********                  *********         
          *  *  *                    *  *  *                    *  *  *          
             *                          *                          *             
            ***                        ***                        ***            
             *                          *                          *             
    *        *        *        *        *        *        *        *        *    
   ***      ***      ***      ***      ***      ***      ***      ***      ***   
    *        *        *        *        *        *        *        *        *    
 *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*********************************************************************************
 *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
    *        *        *        *        *        *        *        *        *    
   ***      ***      ***      ***      ***      ***      ***      ***      ***   
    *        *        *        *        *        *        *        *        *    
             *                          *                          *             
            ***                        ***                        ***            
             *                          *                          *             
          *  *  *                    *  *  *                    *  *  *          
         *********                  *********                  *********         
          *  *  *                    *  *  *                    *  *  *          
             *                          *                          *             
            ***                        ***                        ***            
             *                          *                          *             
                                        *                                        
                                       ***                                       
                                        *                                        
                                     *  *  *                                     
                                    *********                                    
                                     *  *  *                                     
                                        *                                        
                                       ***                                       
                                        *                                        
                               *        *        *                               
                              ***      ***      ***                              
                               *        *        *                               
                            *  *  *  *  *  *  *  *  *                            
                           ***************************                           
                            *  *  *  *  *  *  *  *  *                            
                               *        *        *                               
                              ***      ***      ***                              
                               *        *        *                               
                                        *                                        
                                       ***                                       
                                        *                                        
                                     *  *  *                                     
                                    *********                                    
                                     *  *  *                                     
                                        *                                        
                                       ***                                       
                                        *                                        
Test matrix
***
* *
***
Matrix power 4
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * *
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
*********         ******************         ******************         *********
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** *
*********         ******************         ******************         *********
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
* *   * *         * *   * ** *   * *         * *   * ** *   * *         * *   * *
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
*********         ******************         ******************         *********
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** *
*********         ******************         ******************         *********
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * *
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***************************                           ***************************
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** *
***************************                           ***************************
***   ******   ******   ***                           ***   ******   ******   ***
* *   * ** *   * ** *   * *                           * *   * ** *   * ** *   * *
***   ******   ******   ***                           ***   ******   ******   ***
***************************                           ***************************
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** *
***************************                           ***************************
*********         *********                           *********         *********
* ** ** *         * ** ** *                           * ** ** *         * ** ** *
*********         *********                           *********         *********
***   ***         ***   ***                           ***   ***         ***   ***
* *   * *         * *   * *                           * *   * *         * *   * *
***   ***         ***   ***                           ***   ***         ***   ***
*********         *********                           *********         *********
* ** ** *         * ** ** *                           * ** ** *         * ** ** *
*********         *********                           *********         *********
***************************                           ***************************
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** *
***************************                           ***************************
***   ******   ******   ***                           ***   ******   ******   ***
* *   * ** *   * ** *   * *                           * *   * ** *   * ** *   * *
***   ******   ******   ***                           ***   ******   ******   ***
***************************                           ***************************
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** *
***************************                           ***************************
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * *
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
*********         ******************         ******************         *********
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** *
*********         ******************         ******************         *********
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
* *   * *         * *   * ** *   * *         * *   * ** *   * *         * *   * *
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
*********         ******************         ******************         *********
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** *
*********         ******************         ******************         *********
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * *
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
Test matrix
* *
* *
 * 
Matrix power 4
* *   * *         * *   * *                           * *   * *         * *   * *
* *   * *         * *   * *                           * *   * *         * *   * *
 *     *           *     *                             *     *           *     * 
* *   * *         * *   * *                           * *   * *         * *   * *
* *   * *         * *   * *                           * *   * *         * *   * *
 *     *           *     *                             *     *           *     * 
   * *               * *                                 * *               * *   
   * *               * *                                 * *               * *   
    *                 *                                   *                 *    
* *   * *         * *   * *                           * *   * *         * *   * *
* *   * *         * *   * *                           * *   * *         * *   * *
 *     *           *     *                             *     *           *     * 
* *   * *         * *   * *                           * *   * *         * *   * *
* *   * *         * *   * *                           * *   * *         * *   * *
 *     *           *     *                             *     *           *     * 
   * *               * *                                 * *               * *   
   * *               * *                                 * *               * *   
    *                 *                                   *                 *    
         * *   * *                                             * *   * *         
         * *   * *                                             * *   * *         
          *     *                                               *     *          
         * *   * *                                             * *   * *         
         * *   * *                                             * *   * *         
          *     *                                               *     *          
            * *                                                   * *            
            * *                                                   * *            
             *                                                     *             
* *   * *         * *   * *                           * *   * *         * *   * *
* *   * *         * *   * *                           * *   * *         * *   * *
 *     *           *     *                             *     *           *     * 
* *   * *         * *   * *                           * *   * *         * *   * *
* *   * *         * *   * *                           * *   * *         * *   * *
 *     *           *     *                             *     *           *     * 
   * *               * *                                 * *               * *   
   * *               * *                                 * *               * *   
    *                 *                                   *                 *    
* *   * *         * *   * *                           * *   * *         * *   * *
* *   * *         * *   * *                           * *   * *         * *   * *
 *     *           *     *                             *     *           *     * 
* *   * *         * *   * *                           * *   * *         * *   * *
* *   * *         * *   * *                           * *   * *         * *   * *
 *     *           *     *                             *     *           *     * 
   * *               * *                                 * *               * *   
   * *               * *                                 * *               * *   
    *                 *                                   *                 *    
         * *   * *                                             * *   * *         
         * *   * *                                             * *   * *         
          *     *                                               *     *          
         * *   * *                                             * *   * *         
         * *   * *                                             * *   * *         
          *     *                                               *     *          
            * *                                                   * *            
            * *                                                   * *            
             *                                                     *             
                           * *   * *         * *   * *                           
                           * *   * *         * *   * *                           
                            *     *           *     *                            
                           * *   * *         * *   * *                           
                           * *   * *         * *   * *                           
                            *     *           *     *                            
                              * *               * *                              
                              * *               * *                              
                               *                 *                               
                           * *   * *         * *   * *                           
                           * *   * *         * *   * *                           
                            *     *           *     *                            
                           * *   * *         * *   * *                           
                           * *   * *         * *   * *                           
                            *     *           *     *                            
                              * *               * *                              
                              * *               * *                              
                               *                 *                               
                                    * *   * *                                    
                                    * *   * *                                    
                                     *     *                                     
                                    * *   * *                                    
                                    * *   * *                                    
                                     *     *                                     
                                       * *                                       
                                       * *                                       
                                        *                                        

JavaScript

Using Version #1 of Kronecker product in JavaScript.

Works with: Chrome
File:VicsekFractaljs.png
Output VicsekFractaljs.png
File:SierpCarpetFractaljs.png
Output SierpCarpetFractaljs.png
File:CheckbrdFractaljs.png
Output CheckbrdFractaljs.png
// KPF.js 6/23/16 aev
// HFJS: Plot any matrix mat (filled with 0,1)
function pmat01(mat, color) {
  // DCLs
  var cvs = document.getElementById('canvId');
  var ctx = cvs.getContext("2d"); 
  var w = cvs.width; var h = cvs.height;
  var m = mat[0].length; var n = mat.length;
  // Cleaning canvas and setting plotting color 
  ctx.fillStyle="white"; ctx.fillRect(0,0,w,h);
  ctx.fillStyle=color;
  // MAIN LOOP
  for(var i=0; i<m; i++) {
    for(var j=0; j<n; j++) {
      if(mat[i][j]==1) { ctx.fillRect(i,j,1,1)};
    }//fend j
  }//fend i
}//func end
// Prime functions:
// Create Kronecker product based fractal matrix rm from matrix m (order=ord)
function ckpbfmat(m,ord) {
  var rm=m;
  for(var i=1; i<ord; i++) {rm=mkp(rm,m)};
  //matpp2doc('R 4 ordd',rm,'*'); // ASCII "plotting" - if you wish to try.
  return(rm);
}
// Create and plot Kronecker product based fractal from matrix m (filled with 0/1)
function cpmat(m,ord,color) {
  var kpr;
  kpr=ckpbfmat(m,ord);
  pmat01(kpr,color);
}
// Fractal matrix "pretty" printing to document. 
// mat should be filled with 0 and 1; chr is a char substituting 1.
function matpp2doc(title,mat,chr) {
  var i,j,re='',e; var m=mat.length; var n=mat[0].length;
  document.write('&nbsp;&nbsp;<b>'+title+'</b>:<pre>');
  for(var i=0; i<m; i++) {
    for(var j=0; j<n; j++) {
      e='&nbsp;'; if(mat[i][j]==1) {e=chr}; re+=e; 
    }//fend j
    document.write('&nbsp;&nbsp;'+re+'<br />'); re='';
  }//fend i
  document.write('</pre>');
}
// mkp function (exotic arrow function): Return the Kronecker product
// of the a and b matrices
mkp=(a,b)=>a.map(a=>b.map(b=>a.map(y=>b.map(x=>r.push(y*x)),t.push(r=[]))),t=[])&&t;
Required tests
<!-- VicsekFractal.html -->
<html>
<head>
  <title>Vicsek fractal</title>
  <script src="KPF.js"></script>
</head>
<body onload="cpmat([[0,1,0],[1,1,1],[0,1,0]],6,'navy')">
   <h3>Vicsek fractal</h3>
   <a href="SierpCarpetFractal.html"> Next: Sierpinski carpet fractal</a><br />
   <canvas id="canvId" width="750" height="750" style="border: 1px outset;"></canvas>
</body></html>
<!-- SierpCarpetFractal.html -->
<html>
<head>
  <title>Sierpinski carpet fractal</title>
  <script src="KPF.js"></script>
</head>
<body onload="cpmat([[1,1,1],[1,0,1],[1,1,1]],6,'brown')">
   <h3>Sierpinski carpet fractal</h3>
   <a href="Checkerboard.html"/> Next: Checkerboard </a><br />
   <canvas id="canvId" width="750" height="750" style="border: 1px outset;"></canvas>
</body></html>
<!-- Checkerboard.html -->
<html>
<head>
  <title>Checkerboard</title>
  <script src="KPF.js"></script>
</head>
<body onload="cpmat([[0,1,0,1],[1,0,1,0],[0,1,0,1],[1,0,1,0]],5,'black')">
   <h3>Checkerboard</h3>
   <a href="VicsekFractal.html"/> Next: Vicsek fractal </a><br />
   <canvas id="canvId" width="750" height="750" style="border: 1px outset;"></canvas>
</body></html>
Output:
Page VicsekFractal.html with VicsekFractaljs.png
Page SierpCarpetFractal.html with SierpCarpetFractaljs.png
Page Checkerboard.html with CheckbrdFractaljs.png

Julia

Works with: Julia version 0.6

Julia has a builtin function `kron`:

function matkronpow(M::Matrix, n::Int)
    P = copy(M)
    for i in 1:n P = kron(P, M) end
    return P
end

function fracprint(M::Matrix)
    for i in 1:size(M, 1)
        for j in 1:size(M, 2)
            print(M[i, j] == 1 ? '*' : ' ')
        end
        println()
    end
end

M = [0 1 0; 1 1 1; 0 1 0]
matkronpow(M, 3) |> fracprint

M = [1 1 1; 1 0 1; 1 1 1]
matkronpow(M, 3) |> fracprint
Output:
                                        *                                        
                                       ***                                       
                                        *                                        
                                     *  *  *                                     
                                    *********                                    
                                     *  *  *                                     
                                        *                                        
                                       ***                                       
                                        *                                        
                               *        *        *                               
                              ***      ***      ***                              
                               *        *        *                               
                            *  *  *  *  *  *  *  *  *                            
                           ***************************                           
                            *  *  *  *  *  *  *  *  *                            
                               *        *        *                               
                              ***      ***      ***                              
                               *        *        *                               
                                        *                                        
                                       ***                                       
                                        *                                        
                                     *  *  *                                     
                                    *********                                    
                                     *  *  *                                     
                                        *                                        
                                       ***                                       
                                        *                                        
             *                          *                          *             
            ***                        ***                        ***            
             *                          *                          *             
          *  *  *                    *  *  *                    *  *  *          
         *********                  *********                  *********         
          *  *  *                    *  *  *                    *  *  *          
             *                          *                          *             
            ***                        ***                        ***            
             *                          *                          *             
    *        *        *        *        *        *        *        *        *    
   ***      ***      ***      ***      ***      ***      ***      ***      ***   
    *        *        *        *        *        *        *        *        *    
 *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*********************************************************************************
 *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
    *        *        *        *        *        *        *        *        *    
   ***      ***      ***      ***      ***      ***      ***      ***      ***   
    *        *        *        *        *        *        *        *        *    
             *                          *                          *             
            ***                        ***                        ***            
             *                          *                          *             
          *  *  *                    *  *  *                    *  *  *          
         *********                  *********                  *********         
          *  *  *                    *  *  *                    *  *  *          
             *                          *                          *             
            ***                        ***                        ***            
             *                          *                          *             
                                        *                                        
                                       ***                                       
                                        *                                        
                                     *  *  *                                     
                                    *********                                    
                                     *  *  *                                     
                                        *                                        
                                       ***                                       
                                        *                                        
                               *        *        *                               
                              ***      ***      ***                              
                               *        *        *                               
                            *  *  *  *  *  *  *  *  *                            
                           ***************************                           
                            *  *  *  *  *  *  *  *  *                            
                               *        *        *                               
                              ***      ***      ***                              
                               *        *        *                               
                                        *                                        
                                       ***                                       
                                        *                                        
                                     *  *  *                                     
                                    *********                                    
                                     *  *  *                                     
                                        *                                        
                                       ***                                       
                                        *                                        
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * *
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
*********         ******************         ******************         *********
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** *
*********         ******************         ******************         *********
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
* *   * *         * *   * ** *   * *         * *   * ** *   * *         * *   * *
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
*********         ******************         ******************         *********
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** *
*********         ******************         ******************         *********
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * *
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***************************                           ***************************
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** *
***************************                           ***************************
***   ******   ******   ***                           ***   ******   ******   ***
* *   * ** *   * ** *   * *                           * *   * ** *   * ** *   * *
***   ******   ******   ***                           ***   ******   ******   ***
***************************                           ***************************
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** *
***************************                           ***************************
*********         *********                           *********         *********
* ** ** *         * ** ** *                           * ** ** *         * ** ** *
*********         *********                           *********         *********
***   ***         ***   ***                           ***   ***         ***   ***
* *   * *         * *   * *                           * *   * *         * *   * *
***   ***         ***   ***                           ***   ***         ***   ***
*********         *********                           *********         *********
* ** ** *         * ** ** *                           * ** ** *         * ** ** *
*********         *********                           *********         *********
***************************                           ***************************
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** *
***************************                           ***************************
***   ******   ******   ***                           ***   ******   ******   ***
* *   * ** *   * ** *   * *                           * *   * ** *   * ** *   * *
***   ******   ******   ***                           ***   ******   ******   ***
***************************                           ***************************
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** *
***************************                           ***************************
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * *
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
*********         ******************         ******************         *********
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** *
*********         ******************         ******************         *********
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
* *   * *         * *   * ** *   * *         * *   * ** *   * *         * *   * *
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
*********         ******************         ******************         *********
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** *
*********         ******************         ******************         *********
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * *
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************

Kotlin

This reuses code from the Kronecker_product#Kotlin task.

// version 1.2.31

typealias Matrix = Array<IntArray>

fun kroneckerProduct(a: Matrix, b: Matrix): Matrix {
    val m = a.size
    val n = a[0].size
    val p = b.size
    val q = b[0].size
    val rtn = m * p
    val ctn = n * q
    val r: Matrix = Array(rtn) { IntArray(ctn) } // all elements zero by default
    for (i in 0 until m)
        for (j in 0 until n)
            for (k in 0 until p)
                for (l in 0 until q)
                    r[p * i + k][q * j + l] = a[i][j] * b[k][l]
    return r
}

fun kroneckerPower(a: Matrix, n: Int): Matrix {
    var pow = a.copyOf()
    for (i in 1 until n) pow = kroneckerProduct(pow, a)
    return pow
}

fun printMatrix(text: String, m: Matrix) {
    println("$text fractal :\n")
    for (i in 0 until m.size) {
        for (j in 0 until m[0].size) {
            print(if (m[i][j] == 1) "*" else " ")
        }
        println()
    }
    println()
}

fun main(args: Array<String>) {
    var a = arrayOf(
        intArrayOf(0, 1, 0),
        intArrayOf(1, 1, 1),
        intArrayOf(0, 1, 0)
    )
    printMatrix("Vicsek", kroneckerPower(a, 4))

    a = arrayOf(
        intArrayOf(1, 1, 1),
        intArrayOf(1, 0, 1),
        intArrayOf(1, 1, 1)
    )
    printMatrix("Sierpinski carpet", kroneckerPower(a, 4))
}
Output:
Vicsek fractal :

                                        *                                        
                                       ***                                       
                                        *                                        
                                     *  *  *                                     
                                    *********                                    
                                     *  *  *                                     
                                        *                                        
                                       ***                                       
                                        *                                        
                               *        *        *                               
                              ***      ***      ***                              
                               *        *        *                               
                            *  *  *  *  *  *  *  *  *                            
                           ***************************                           
                            *  *  *  *  *  *  *  *  *                            
                               *        *        *                               
                              ***      ***      ***                              
                               *        *        *                               
                                        *                                        
                                       ***                                       
                                        *                                        
                                     *  *  *                                     
                                    *********                                    
                                     *  *  *                                     
                                        *                                        
                                       ***                                       
                                        *                                        
             *                          *                          *             
            ***                        ***                        ***            
             *                          *                          *             
          *  *  *                    *  *  *                    *  *  *          
         *********                  *********                  *********         
          *  *  *                    *  *  *                    *  *  *          
             *                          *                          *             
            ***                        ***                        ***            
             *                          *                          *             
    *        *        *        *        *        *        *        *        *    
   ***      ***      ***      ***      ***      ***      ***      ***      ***   
    *        *        *        *        *        *        *        *        *    
 *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
*********************************************************************************
 *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  *  * 
    *        *        *        *        *        *        *        *        *    
   ***      ***      ***      ***      ***      ***      ***      ***      ***   
    *        *        *        *        *        *        *        *        *    
             *                          *                          *             
            ***                        ***                        ***            
             *                          *                          *             
          *  *  *                    *  *  *                    *  *  *          
         *********                  *********                  *********         
          *  *  *                    *  *  *                    *  *  *          
             *                          *                          *             
            ***                        ***                        ***            
             *                          *                          *             
                                        *                                        
                                       ***                                       
                                        *                                        
                                     *  *  *                                     
                                    *********                                    
                                     *  *  *                                     
                                        *                                        
                                       ***                                       
                                        *                                        
                               *        *        *                               
                              ***      ***      ***                              
                               *        *        *                               
                            *  *  *  *  *  *  *  *  *                            
                           ***************************                           
                            *  *  *  *  *  *  *  *  *                            
                               *        *        *                               
                              ***      ***      ***                              
                               *        *        *                               
                                        *                                        
                                       ***                                       
                                        *                                        
                                     *  *  *                                     
                                    *********                                    
                                     *  *  *                                     
                                        *                                        
                                       ***                                       
                                        *                                        

Sierpinski carpet fractal :

*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * *
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
*********         ******************         ******************         *********
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** *
*********         ******************         ******************         *********
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
* *   * *         * *   * ** *   * *         * *   * ** *   * *         * *   * *
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
*********         ******************         ******************         *********
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** *
*********         ******************         ******************         *********
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * *
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***************************                           ***************************
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** *
***************************                           ***************************
***   ******   ******   ***                           ***   ******   ******   ***
* *   * ** *   * ** *   * *                           * *   * ** *   * ** *   * *
***   ******   ******   ***                           ***   ******   ******   ***
***************************                           ***************************
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** *
***************************                           ***************************
*********         *********                           *********         *********
* ** ** *         * ** ** *                           * ** ** *         * ** ** *
*********         *********                           *********         *********
***   ***         ***   ***                           ***   ***         ***   ***
* *   * *         * *   * *                           * *   * *         * *   * *
***   ***         ***   ***                           ***   ***         ***   ***
*********         *********                           *********         *********
* ** ** *         * ** ** *                           * ** ** *         * ** ** *
*********         *********                           *********         *********
***************************                           ***************************
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** *
***************************                           ***************************
***   ******   ******   ***                           ***   ******   ******   ***
* *   * ** *   * ** *   * *                           * *   * ** *   * ** *   * *
***   ******   ******   ***                           ***   ******   ******   ***
***************************                           ***************************
* ** ** ** ** ** ** ** ** *                           * ** ** ** ** ** ** ** ** *
***************************                           ***************************
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * *
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
*********         ******************         ******************         *********
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** *
*********         ******************         ******************         *********
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
* *   * *         * *   * ** *   * *         * *   * ** *   * *         * *   * *
***   ***         ***   ******   ***         ***   ******   ***         ***   ***
*********         ******************         ******************         *********
* ** ** *         * ** ** ** ** ** *         * ** ** ** ** ** *         * ** ** *
*********         ******************         ******************         *********
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
* *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * ** *   * *
***   ******   ******   ******   ******   ******   ******   ******   ******   ***
*********************************************************************************
* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *
*********************************************************************************

Lua

Needs LÖVE 2D Engine

function prod( a, b )
    local rt, l = {}, 1
    for m = 1, #a do
        for p = 1, #b do
            rt[l] = {}
            for n = 1, #a[m] do
                for q = 1, #b[p] do
                    table.insert( rt[l], a[m][n] * b[p][q] )
                end
            end
            l = l + 1
        end
    end
    return rt
end
function love.load()
    wid, hei = love.graphics.getWidth(), love.graphics.getHeight()
    canvas = love.graphics.newCanvas( wid, hei )
    mA = { {0,1,0}, {1,1,1}, {0,1,0} }; mB = { {1,0,1}, {0,1,0}, {1,0,1} }
    mC = { {1,1,1}, {1,0,1}, {1,1,1} }; mD = { {1,1,1}, {0,1,0}, {1,1,1} }
end
function drawFractals( m )
    love.graphics.setCanvas( canvas )
    love.graphics.clear()
    love.graphics.setColor( 255, 255, 255 )
    for j = 1, #m do
        for i = 1, #m[j] do
            if m[i][j] == 1 then 
                love.graphics.points( i * .1, j * .1 )
            end
        end
    end
    love.graphics.setCanvas()
end
function love.keypressed( key, scancode, isrepeat )
    local t = {}
    if key == "a" then
        print( "Build Vicsek fractal I" ); t = mA
    elseif key == "b" then 
        print( "Build Vicsek fractal II" ); t = mB
    elseif key == "c" then 
        print( "Sierpinski carpet fractal" ); t = mC
    elseif key == "d" then 
        print( "Build 'H' fractal" ); t = mD
    else return
    end
    for i = 1, 3 do t = prod( t, t ) end
    drawFractals( t )
end
function love.draw()
    love.graphics.draw( canvas )
end

Mathematica/Wolfram Language

m = {{0, 1, 0}, {1, 1, 1}, {0, 1, 0}};
ArrayPlot[KroneckerProduct[m, m, m, m]]
m = {{1, 1, 1}, {1, 0, 1}, {1, 1, 1}};
ArrayPlot[KroneckerProduct[m, m, m, m]]
m = {{0, 1, 1}, {1, 0, 1}, {1, 1, 0}};
ArrayPlot[KroneckerProduct[m, m, m, m]]
Output:

Outputs three graphical visualisations of the three 4th order products.

Maxima

Using function defined in Kronecker product task page. [Kronecker Product]

pow_kron(matr,n):=block(MATR:copymatrix(matr),
for i from 1 thru n do MATR:altern_kronecker(matr,MATR),
MATR);

/* Examples (images are shown in format png)*/
/* A to generate Vicsek fractal */
/* B to generate Sierpinski carpet fractal */
A:matrix([0,1,0],[1,1,1],[0,1,0])$
B:matrix([1,1,1],[1,0,1],[1,1,1])$

/* Vicsek */
pow_kron(A,3)$
at(%,[0="",1="x"]);

/* Sierpinski carpet */
pow_kron(B,3)$
at(%,[0="",1="x"]);
File:Vicsek.png
File:SierpinskiCarpet.png

Nim

Translation of: Kotlin
import sequtils

type Matrix[T] = seq[seq[T]]

func kroneckerProduct[T](a, b: Matrix[T]): Matrix[T] =
  result = newSeqWith(a.len * b.len, newSeq[T](a[0].len * b[0].len))
  let m = a.len
  let n = a[0].len
  let p = b.len
  let q = b[0].len
  for i in 0..<m:
    for j in 0..<n:
      for k in 0..<p:
        for l in 0..<q:
          result[i * p + k][j * q + l] = a[i][j] * b[k][l]

func kroneckerPower(m: Matrix; n: int): Matrix =
  result = m
  for i in 2..n:
    result = kroneckerProduct(result, m)

func `$`(m: Matrix): string =
  for row in m:
    for val in row:
      result.add if val == 0: "  " else: " *"
    result.add '\n'


type B = range[0..1]

const A1: Matrix[B] = @[@[B 0, 1, 0], @[B 1, 1, 1], @[B 0, 1, 0]]
echo "Vicsek fractal:\n", A1.kroneckerPower(4)
echo ""
const A2: Matrix[B] = @[@[B 1, 1, 1], @[B 1, 0, 1], @[B 1, 1, 1]]
echo "Sierpinski carpet fractal:\n", A2.kroneckerPower(4)
Output:
Vicsek fractal:
                                                                                 *                                                                                
                                                                               * * *                                                                              
                                                                                 *                                                                                
                                                                           *     *     *                                                                          
                                                                         * * * * * * * * *                                                                        
                                                                           *     *     *                                                                          
                                                                                 *                                                                                
                                                                               * * *                                                                              
                                                                                 *                                                                                
                                                               *                 *                 *                                                              
                                                             * * *             * * *             * * *                                                            
                                                               *                 *                 *                                                              
                                                         *     *     *     *     *     *     *     *     *                                                        
                                                       * * * * * * * * * * * * * * * * * * * * * * * * * * *                                                      
                                                         *     *     *     *     *     *     *     *     *                                                        
                                                               *                 *                 *                                                              
                                                             * * *             * * *             * * *                                                            
                                                               *                 *                 *                                                              
                                                                                 *                                                                                
                                                                               * * *                                                                              
                                                                                 *                                                                                
                                                                           *     *     *                                                                          
                                                                         * * * * * * * * *                                                                        
                                                                           *     *     *                                                                          
                                                                                 *                                                                                
                                                                               * * *                                                                              
                                                                                 *                                                                                
                           *                                                     *                                                     *                          
                         * * *                                                 * * *                                                 * * *                        
                           *                                                     *                                                     *                          
                     *     *     *                                         *     *     *                                         *     *     *                    
                   * * * * * * * * *                                     * * * * * * * * *                                     * * * * * * * * *                  
                     *     *     *                                         *     *     *                                         *     *     *                    
                           *                                                     *                                                     *                          
                         * * *                                                 * * *                                                 * * *                        
                           *                                                     *                                                     *                          
         *                 *                 *                 *                 *                 *                 *                 *                 *        
       * * *             * * *             * * *             * * *             * * *             * * *             * * *             * * *             * * *      
         *                 *                 *                 *                 *                 *                 *                 *                 *        
   *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *  
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
   *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *     *  
         *                 *                 *                 *                 *                 *                 *                 *                 *        
       * * *             * * *             * * *             * * *             * * *             * * *             * * *             * * *             * * *      
         *                 *                 *                 *                 *                 *                 *                 *                 *        
                           *                                                     *                                                     *                          
                         * * *                                                 * * *                                                 * * *                        
                           *                                                     *                                                     *                          
                     *     *     *                                         *     *     *                                         *     *     *                    
                   * * * * * * * * *                                     * * * * * * * * *                                     * * * * * * * * *                  
                     *     *     *                                         *     *     *                                         *     *     *                    
                           *                                                     *                                                     *                          
                         * * *                                                 * * *                                                 * * *                        
                           *                                                     *                                                     *                          
                                                                                 *                                                                                
                                                                               * * *                                                                              
                                                                                 *                                                                                
                                                                           *     *     *                                                                          
                                                                         * * * * * * * * *                                                                        
                                                                           *     *     *                                                                          
                                                                                 *                                                                                
                                                                               * * *                                                                              
                                                                                 *                                                                                
                                                               *                 *                 *                                                              
                                                             * * *             * * *             * * *                                                            
                                                               *                 *                 *                                                              
                                                         *     *     *     *     *     *     *     *     *                                                        
                                                       * * * * * * * * * * * * * * * * * * * * * * * * * * *                                                      
                                                         *     *     *     *     *     *     *     *     *                                                        
                                                               *                 *                 *                                                              
                                                             * * *             * * *             * * *                                                            
                                                               *                 *                 *                                                              
                                                                                 *                                                                                
                                                                               * * *                                                                              
                                                                                 *                                                                                
                                                                           *     *     *                                                                          
                                                                         * * * * * * * * *                                                                        
                                                                           *     *     *                                                                          
                                                                                 *                                                                                
                                                                               * * *                                                                              
                                                                                 *                                                                                


Sierpinski carpet fractal:
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * *
 *   *       *   * *   *       *   * *   *       *   * *   *       *   * *   *       *   * *   *       *   * *   *       *   * *   *       *   * *   *       *   *
 * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * * * * * * * * *                   * * * * * * * * * * * * * * * * * *                   * * * * * * * * * * * * * * * * * *                   * * * * * * * * *
 *   * *   * *   *                   *   * *   * *   * *   * *   * *   *                   *   * *   * *   * *   * *   * *   *                   *   * *   * *   *
 * * * * * * * * *                   * * * * * * * * * * * * * * * * * *                   * * * * * * * * * * * * * * * * * *                   * * * * * * * * *
 * * *       * * *                   * * *       * * * * * *       * * *                   * * *       * * * * * *       * * *                   * * *       * * *
 *   *       *   *                   *   *       *   * *   *       *   *                   *   *       *   * *   *       *   *                   *   *       *   *
 * * *       * * *                   * * *       * * * * * *       * * *                   * * *       * * * * * *       * * *                   * * *       * * *
 * * * * * * * * *                   * * * * * * * * * * * * * * * * * *                   * * * * * * * * * * * * * * * * * *                   * * * * * * * * *
 *   * *   * *   *                   *   * *   * *   * *   * *   * *   *                   *   * *   * *   * *   * *   * *   *                   *   * *   * *   *
 * * * * * * * * *                   * * * * * * * * * * * * * * * * * *                   * * * * * * * * * * * * * * * * * *                   * * * * * * * * *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * *
 *   *       *   * *   *       *   * *   *       *   * *   *       *   * *   *       *   * *   *       *   * *   *       *   * *   *       *   * *   *       *   *
 * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * * * * * * * * * * * * * * * * * * * * * * * * * * *                                                       * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *   * *   * *   * *   * *   * *   * *   * *   * *   *                                                       *   * *   * *   * *   * *   * *   * *   * *   * *   *
 * * * * * * * * * * * * * * * * * * * * * * * * * * *                                                       * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * * *       * * * * * *       * * * * * *       * * *                                                       * * *       * * * * * *       * * * * * *       * * *
 *   *       *   * *   *       *   * *   *       *   *                                                       *   *       *   * *   *       *   * *   *       *   *
 * * *       * * * * * *       * * * * * *       * * *                                                       * * *       * * * * * *       * * * * * *       * * *
 * * * * * * * * * * * * * * * * * * * * * * * * * * *                                                       * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *   * *   * *   * *   * *   * *   * *   * *   * *   *                                                       *   * *   * *   * *   * *   * *   * *   * *   * *   *
 * * * * * * * * * * * * * * * * * * * * * * * * * * *                                                       * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * * * * * * * * *                   * * * * * * * * *                                                       * * * * * * * * *                   * * * * * * * * *
 *   * *   * *   *                   *   * *   * *   *                                                       *   * *   * *   *                   *   * *   * *   *
 * * * * * * * * *                   * * * * * * * * *                                                       * * * * * * * * *                   * * * * * * * * *
 * * *       * * *                   * * *       * * *                                                       * * *       * * *                   * * *       * * *
 *   *       *   *                   *   *       *   *                                                       *   *       *   *                   *   *       *   *
 * * *       * * *                   * * *       * * *                                                       * * *       * * *                   * * *       * * *
 * * * * * * * * *                   * * * * * * * * *                                                       * * * * * * * * *                   * * * * * * * * *
 *   * *   * *   *                   *   * *   * *   *                                                       *   * *   * *   *                   *   * *   * *   *
 * * * * * * * * *                   * * * * * * * * *                                                       * * * * * * * * *                   * * * * * * * * *
 * * * * * * * * * * * * * * * * * * * * * * * * * * *                                                       * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *   * *   * *   * *   * *   * *   * *   * *   * *   *                                                       *   * *   * *   * *   * *   * *   * *   * *   * *   *
 * * * * * * * * * * * * * * * * * * * * * * * * * * *                                                       * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * * *       * * * * * *       * * * * * *       * * *                                                       * * *       * * * * * *       * * * * * *       * * *
 *   *       *   * *   *       *   * *   *       *   *                                                       *   *       *   * *   *       *   * *   *       *   *
 * * *       * * * * * *       * * * * * *       * * *                                                       * * *       * * * * * *       * * * * * *       * * *
 * * * * * * * * * * * * * * * * * * * * * * * * * * *                                                       * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *   * *   * *   * *   * *   * *   * *   * *   * *   *                                                       *   * *   * *   * *   * *   * *   * *   * *   * *   *
 * * * * * * * * * * * * * * * * * * * * * * * * * * *                                                       * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * *
 *   *       *   * *   *       *   * *   *       *   * *   *       *   * *   *       *   * *   *       *   * *   *       *   * *   *       *   * *   *       *   *
 * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * * * * * * * * *                   * * * * * * * * * * * * * * * * * *                   * * * * * * * * * * * * * * * * * *                   * * * * * * * * *
 *   * *   * *   *                   *   * *   * *   * *   * *   * *   *                   *   * *   * *   * *   * *   * *   *                   *   * *   * *   *
 * * * * * * * * *                   * * * * * * * * * * * * * * * * * *                   * * * * * * * * * * * * * * * * * *                   * * * * * * * * *
 * * *       * * *                   * * *       * * * * * *       * * *                   * * *       * * * * * *       * * *                   * * *       * * *
 *   *       *   *                   *   *       *   * *   *       *   *                   *   *       *   * *   *       *   *                   *   *       *   *
 * * *       * * *                   * * *       * * * * * *       * * *                   * * *       * * * * * *       * * *                   * * *       * * *
 * * * * * * * * *                   * * * * * * * * * * * * * * * * * *                   * * * * * * * * * * * * * * * * * *                   * * * * * * * * *
 *   * *   * *   *                   *   * *   * *   * *   * *   * *   *                   *   * *   * *   * *   * *   * *   *                   *   * *   * *   *
 * * * * * * * * *                   * * * * * * * * * * * * * * * * * *                   * * * * * * * * * * * * * * * * * *                   * * * * * * * * *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * *
 *   *       *   * *   *       *   * *   *       *   * *   *       *   * *   *       *   * *   *       *   * *   *       *   * *   *       *   * *   *       *   *
 * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * * * * *       * * *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   * *   *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

PARI/GP

Note
Works with: PARI/GP version 2.9.1 and above
File:VicsekFractalgp.png
Output VicsekFractalgp.png
File:SierpCarpetFractalgp.png
Output SierpCarpetFractalgp.png
File:SierpTriFractalgp.png
Output SierpTriFractalgp.png
\\ Build block matrix applying Kronecker product to the special matrix m
\\ (n times to itself). Then plot Kronecker fractal. 4/25/2016 aev
pkronfractal(m,n=2,clr)={
  my(r=m);
  for(i=1,n, r=matkronprod(r,m));
  iPlotmat(r,clr);
}
\\Requireq tests:
{\\ Vicsek fractal: VicsekFractalgp.png
  my(M=[0,1,0;1,1,1;0,1,0]); print(" *** Vicsek fractal, order 4:");
  pkronfractal(M,4,6);
}
{\\ Sierpinski carpet fractal:  SierpCarpetFractalgp.png
  my(M=[1,1,1;1,0,1;1,1,1]); print(" *** Sierpinski carpet fractal, order 4:");
  pkronfractal(M,4,5);
}
{\\ Sierpinski triangle fractal:  SierpTriFractalgp.png
  my(M=[1,1;0,1]); print(" *** Sierpinski triangle fractal, order 7:");
  pkronfractal(M,7,6);
}
Output:
 *** Vicsek fractal, order 4:
 *** matrix(243x243) 3125 DOTS

 *** Sierpinski carpet fractal, order 4:
 *** matrix(243x243) 32768 DOTS 

 *** Sierpinski triangle fractal, order 7:
 *** matrix: 256x256, 6561 DOTS

Perl

Translation of: Raku
use Imager;
use Math::Cartesian::Product;

sub kronecker_product {
    our @a; local *a = shift;
    our @b; local *b = shift;
    my @c;
    cartesian {
        my @cc;
        cartesian {
            push @cc, $_[0] * $_[1];
        } [@{$_[0]}], [@{$_[1]}];
        push @c, [@cc];
    } [@a], [@b];
    @c
}

sub kronecker_fractal {
    my($order, @pattern) = @_;
    my @kronecker = @pattern;
    @kronecker = kronecker_product(\@kronecker, \@pattern) for 0..$order-1;
    @kronecker
}

@vicsek = ( [0, 1, 0], [1, 1, 1], [0, 1, 0] );
@carpet = ( [1, 1, 1], [1, 0, 1], [1, 1, 1] );
@six    = ( [0,1,1,1,0], [1,0,0,0,1], [1,0,0,0,0], [1,1,1,1,0], [1,0,0,0,1], [1,0,0,0,1], [0,1,1,1,0] );

for (['vicsek', \@vicsek, 4],
     ['carpet', \@carpet, 4],
     ['six',    \@six,    3]) {
    ($name, $shape, $order) = @$_;
    @img = kronecker_fractal( $order, @$shape );
    $png = Imager->new(xsize => 1+@{$img[0]}, ysize => 1+@img);
    cartesian {
        $png->setpixel(x => $_[0], y => $_[1], color => $img[$_[1]][$_[0]] ? [255, 255, 32] : [16, 16, 16]);
    } [0..@{$img[0]}-1], [0..$#img];
    $png->write(file => "run/kronecker-$name-perl6.png");
}

See Kronecker-Vicsek, Kronecker-Carpet and Kronecker-Six images.

Phix

function kronecker(sequence a, b)
    integer ar = length(a),
            ac = length(a[1]),
            br = length(b),
            bc = length(b[1])
    sequence res = repeat(repeat(0,ac*bc),ar*br)
    for ia=1 to ar do
        integer i0 = (ia-1)*br
        for ja=1 to ac do
            integer j0 = (ja-1)*bc
            for ib=1 to br do
                integer i = i0+ib
                for jb=1 to bc do
                    integer j = j0+jb
                    res[i,j] = a[ia,ja]*b[ib,jb]
                end for
            end for
        end for
    end for
    return res
end function
 
function kroneckern(sequence m, integer n)
    sequence res = m
    for i=2 to n do
        res = kronecker(res,m)
    end for
    return res
end function
 
procedure show(sequence m)
    for i=1 to length(m) do
        string s = repeat(' ',length(m[i]))
        for j=1 to length(s) do
            if m[i][j] then s[j] = '#' end if
        end for 
        puts(1,s&"\n")
    end for
    puts(1,"\n")
end procedure
 
constant vicsek = {{0,1,0},
                   {1,1,1},
                   {0,1,0}},
         siercp = {{1,1,1},
                   {1,0,1},
                   {1,1,1}},
         xxxxxx = {{0,1,1},
                   {0,1,0},
                   {1,1,0}}
 
show(kroneckern(vicsek,4))
show(kroneckern(siercp,4))
show(kroneckern(xxxxxx,4))

Output same as Julia/Kotlin/Factor

Python

Generate images of the fractals using PIL.

Using only python lists

import os
from PIL import Image


def imgsave(path, arr):
    w, h = len(arr), len(arr[0])
    img = Image.new('1', (w, h))
    for x in range(w):
        for y in range(h):
            img.putpixel((x, y), arr[x][y])
    img.save(path)


def get_shape(mat):
    return len(mat), len(mat[0])


def kron(matrix1, matrix2):
    """
    Calculate the kronecker product of two matrices
    """
    final_list = []

    count = len(matrix2)

    for elem1 in matrix1:
        for i in range(count):
            sub_list = []
            for num1 in elem1:
                for num2 in matrix2[i]:
                    sub_list.append(num1 * num2)
            final_list.append(sub_list)

    return final_list


def kronpow(mat):
    """
    Generate an arbitrary number of kronecker powers
    """
    matrix = mat
    while True:
        yield matrix
        matrix = kron(mat, matrix)


def fractal(name, mat, order=6):
    """
    Save fractal as jpg to 'fractals/name'
    """
    path = os.path.join('fractals', name)
    os.makedirs(path, exist_ok=True)

    fgen = kronpow(mat)
    print(name)
    for i in range(order):
        p = os.path.join(path, f'{i}.jpg')
        print('Calculating n =', i, end='\t', flush=True)

        mat = next(fgen)
        imgsave(p, mat)

        x, y = get_shape(mat)
        print('Saved as', x, 'x', y, 'image', p)


test1 = [
    [0, 1, 0],
    [1, 1, 1],
    [0, 1, 0]
]

test2 = [
    [1, 1, 1],
    [1, 0, 1],
    [1, 1, 1]
]

test3 = [
    [1, 0, 1],
    [0, 1, 0],
    [1, 0, 1]
]

fractal('test1', test1)
fractal('test2', test2)
fractal('test3', test3)

Because this is not very efficent/fast you should use scipy sparse matrices instead

import os
import numpy as np
from scipy.sparse import csc_matrix, kron
from scipy.misc import imsave


def imgsave(name, arr, *args):
    imsave(name, arr.toarray(), *args)


def get_shape(mat):
    return mat.shape


def kronpow(mat):
    """
    Generate an arbitrary number of kronecker powers
    """
    matrix = mat
    while True:
        yield matrix
        matrix = kron(mat, matrix)


def fractal(name, mat, order=6):
    """
    Save fractal as jpg to 'fractals/name'
    """
    path = os.path.join('fractals', name)
    os.makedirs(path, exist_ok=True)

    fgen = kronpow(mat)
    print(name)
    for i in range(order):
        p = os.path.join(path, f'{i}.jpg')
        print('Calculating n =', i, end='\t', flush=True)

        mat = next(fgen)
        imgsave(p, mat)

        x, y = get_shape(mat)
        print('Saved as', x, 'x', y, 'image', p)


test1 = [
    [0, 1, 0],
    [1, 1, 1],
    [0, 1, 0]
]

test2 = [
    [1, 1, 1],
    [1, 0, 1],
    [1, 1, 1]
]

test3 = [
    [1, 0, 1],
    [0, 1, 0],
    [1, 0, 1]
]

test1 = np.array(test1, dtype='int8')
test1 = csc_matrix(test1)

test2 = np.array(test2, dtype='int8')
test2 = csc_matrix(test2)

test3 = np.array(test3, dtype='int8')
test3 = csc_matrix(test3)

fractal('test1', test1)
fractal('test2', test2)
fractal('test3', test3)

R

Generate and plot 3 Kronecker product based fractals.
Note: Find plotmat() and plotv2() here on Helper Functions page.

Works with: R version 3.3.2 and above
File:VicsekFractalR.png
Output VicsekFractalR.png
File:SierpCarpetFR.png
Output SierpCarpetFR.png
File:PlusSignFR.png
Output PlusSignFR.png
## Generate and plot Kronecker product based fractals. aev 8/12/16
## gpKronFractal(m, n, pf, clr, ttl, dflg=0, psz=600):
## Where: m - initial matrix (filled with 0/1); n - order of the fractal;
## pf - plot file name (without extension); clr - color; ttl - plot title;
## dflg - writing dump file flag (0/1); psz - picture size.
gpKronFractal <- function(m, n, pf, clr, ttl, dflg=0, psz=600) {
  cat(" *** START:", date(), "n=", n, "clr=", clr, "psz=", psz, "\n");
  cat(" *** Plot file -", pf, "\n");
  r <- m;
  for(i in 1:n) {r = r%x%m};
  plotmat(r, pf, clr, ttl, dflg, psz);
  cat(" *** END:", date(), "\n");
}

## Required tests:
# 1. Vicsek Fractal
M <- matrix(c(0,1,0,1,1,1,0,1,0), ncol=3, nrow=3, byrow=TRUE);
gpKronFractal(M, 4, "VicsekFractalR","red", "Vicsek Fractal n=4")
# 2. Sierpinski carpet fractal
M <- matrix(c(1,1,1,1,0,1,1,1,1), ncol=3, nrow=3, byrow=TRUE);
gpKronFractal(M, 4, "SierpinskiCarpetFR", "maroon", "Sierpinski carpet fractal n=4")

# 3. Plus sign fractal
M <- matrix(c(1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,1,1,1,
+0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1), ncol=7, nrow=7, byrow=TRUE);
gpKronFractal(M, 3, "PlusSignFR", "maroon", "Plus sign fractal, n=3")

# Also, try these 3. I bet you've never seen them before.
# 4. Wider Sierpinski carpet fractal (a.k.a. Sierpinski carpet mutant)
# Note: If your computer is not super fast it could take a lot of time.
#       Use dump flag = 1, to save generated fractal.
#M <- matrix(c(1,1,1,1,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,1,1,1,1), ncol=5,
#+nrow=5, byrow=TRUE);
#gpKronFractal(M, 4, "SierpinskiCarpetFw", "brown", "Wider Sierpinski carpet fractal n=4", 1)
# 5. "H" fractal (Try all other letters in the alphabet...)
#M <- matrix(c(1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,
#+0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1), ncol=7, nrow=7, byrow=TRUE);
#gpKronFractal(M, 3, "HFR", "maroon", "'H' fractal n=3", 1)
# 6. Chessboard fractal. 
#M <- matrix(c(1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,
#     0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,1), ncol=8, nrow=8, byrow=TRUE);
#gpKronFractal(M, 2, "ChessBrdFractalR","black", "Chessboard Fractal, n=2")
Output:
> M <- matrix(c(0,1,0,1,1,1,0,1,0), ncol=3, nrow=3, byrow=TRUE);
> gpKronFractal(M, 4, "VicsekFractalR", "red", "Vicsek Fractal n=4")
 *** START: Mon Aug 29 16:14:14 2016 n= 4 clr= red 
 *** Plot file - VicsekFractalR 
 *** Matrix( 243 x 243 ) 3125  DOTS
 *** END: Mon Aug 29 16:14:14 2016 

> M <- matrix(c(1,1,1,1,0,1,1,1,1), ncol=3, nrow=3, byrow=TRUE);
> gpKronFractal(M, 4, "SierpinskiCarpetFR", "maroon", "Sierpinski carpet fractal n=4")
 *** START: Mon Aug 29 16:16:14 2016 n= 4 clr= maroon 
 *** Plot file - SierpinskiCarpetFR
 *** Matrix( 243 x 243 ) 32768  DOTS
 *** END: Mon Aug 29 16:16:32 2016 

> M <- matrix(c(1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,1,1,1,
+0,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1), ncol=7, nrow=7, byrow=TRUE);
> gpKronFractal(M, 3, "PlusSignFR", "maroon", "Plus sign fractal, n=3")
 *** START: Thu Apr 06 21:45:33 2017 n= 3 clr= maroon psz= 600 
 *** Plot file - PlusSignFR 
 *** Matrix( 2401 x 2401 ) 2560000 DOTS
 *** END: Fri Apr 07 09:31:07 2017 

Raku

(formerly Perl 6)

Works with: Rakudo version 2018.09
sub kronecker-product ( @a, @b ) { (@a X @b).map: { (.[0].list X* .[1].list).Array } }

sub kronecker-fractal ( @pattern, $order = 4 ) {
    my @kronecker = @pattern;
    @kronecker = kronecker-product(@kronecker, @pattern) for ^$order;
    @kronecker
}

use Image::PNG::Portable;

#Task requirements
my @vicsek = ( [0, 1, 0], [1, 1, 1], [0, 1, 0] );
my @carpet = ( [1, 1, 1], [1, 0, 1], [1, 1, 1] );
my @six    = ( [0,1,1,1,0], [1,0,0,0,1], [1,0,0,0,0], [1,1,1,1,0], [1,0,0,0,1], [1,0,0,0,1], [0,1,1,1,0] );

for  'vicsek', @vicsek, 4,
     'carpet', @carpet, 4,
     'six',    @six,    3
  -> $name,    @shape,  $order {
    my @img = kronecker-fractal( @shape, $order );
    my $png = Image::PNG::Portable.new: :width(@img[0].elems), :height(@img.elems);
    (^@img[0]).race(:12batch).map: -> $x {
        for ^@img -> $y {
            $png.set: $x, $y, |( @img[$y;$x] ?? <255 255 32> !! <16 16 16> );
        }
    }
    $png.write: "kronecker-{$name}-perl6.png";
}

See Kronecker-Vicsek, Kronecker-Carpet and Kronecker-Six images.

REXX

This is a work-in-progress, this version shows the 1st order.

/*REXX program calculates the   Kronecker product   of   two arbitrary size   matrices. */
parse arg pGlyph .                               /*obtain optional argument from the CL.*/
if pGlyph=='' | pGlyph==","  then pGlyph= '█'    /*Not specified?  Then use the default.*/
if length(pGlyph)==2  then pGlyph= x2c(pGlyph)   /*Plot glyph is 2 chars?   Hexadecimal.*/
if length(pGlyph)==3  then pGlyph= d2c(pGlyph)   /*  "    "    " 3   "      Decimal.    */
       aMat= 3x3  0 1 0 1 1 1 0 1 0              /*define  A  matrix size  and elements.*/
       bMat= 3x3  1 1 1 1 0 1 1 1 1              /*   "    B     "     "    "     "     */
call makeMat 'A', aMat                           /*construct   A   matrix from elements.*/
call makeMat 'B', bMat                           /*    "       B      "     "     "     */
call KronMat 'Kronecker product'                 /*calculate the  Kronecker  product.   */
call showMat 'Kronecker product', result         /*display   the  Kronecker  product.   */
exit                                             /*stick a fork in it,  we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
KronMat: parse arg what;              #= 0;           parse var  @.a.shape  aRows  aCols
                                                      parse var  @.b.shape  bRows  bCols
           do       rA=1  for aRows
             do     rB=1  for bRows;  #= # + 1;       ##= 0;         _=
               do   cA=1  for aCols;  x= @.a.rA.cA
                 do cB=1  for bCols;  y= @.b.rB.cB;   ##= ## + 1;   xy= x * y;     _= _ xy
                 @.what.#.##= xy
                 end   /*cB*/
               end     /*cA*/
             end       /*rB*/
           end         /*rA*/;        return aRows * aRows   ||   'X'   ||   bRows * bRows
/*──────────────────────────────────────────────────────────────────────────────────────*/
makeMat: parse arg what, size elements;   arg , row 'X' col .;      @.what.shape= row  col
         #=0;    do   r=1  for row               /* [↓]  bump item#; get item; max width*/
                   do c=1  for col;   #= # + 1;        @.what.r.c= word(elements, #)
                   end   /*c*/                   /* [↑] define an element of WHAT matrix*/
                 end     /*r*/;           return
/*──────────────────────────────────────────────────────────────────────────────────────*/
showMat: parse arg what, size .;   parse var size  row  'X'  col   /*obtain mat name, sz*/
                     do    r=1  for row;    $=                     /*build row by row.  */
                        do c=1  for col;    $= $ || @.what.r.c     /*  "   col  " col.  */
                        end   /*c*/
                     $= translate($, pGlyph, 10)                   /*change──►plot glyph*/
                     say strip($, 'T')                             /*display line──►term*/
                     end     /*r*/;       return
output   when using the default input:
   ███
   █ █
   ███
█████████
█ ██ ██ █
█████████
   ███
   █ █
   ███

Rust

Because Rust lacks support for images, this sample contains a simple implementation of writing PPM files.

use std::{
    fmt::{Debug, Display, Write},
    ops::Mul,
};

// Rust has (almost) no built-in support for multi-dimensional arrays or so.
// Let's make a basic one ourselves for our use cases.

#[derive(Clone, Debug)]
pub struct Mat<T> {
    col_count: usize,
    row_count: usize,
    items: Vec<T>,
}

impl<T> Mat<T> {
    pub fn from_vec(items: Vec<T>, col_count: usize, row_count: usize) -> Self {
        assert_eq!(items.len(), col_count * row_count, "mismatching dimensions");

        Self {
            col_count,
            row_count,
            items,
        }
    }

    pub fn row_count(&self) -> usize {
        self.row_count
    }

    pub fn col_count(&self) -> usize {
        self.col_count
    }

    pub fn iter(&self) -> impl Iterator<Item = &T> {
        self.items.iter()
    }

    pub fn row_iter(&self, row: usize) -> impl Iterator<Item = &T> {
        assert!(row < self.row_count, "index out of bounds");
        let start = row * self.col_count;
        self.items[start..start + self.col_count].iter()
    }

    pub fn col_iter(&self, col: usize) -> impl Iterator<Item = &T> {
        assert!(col < self.col_count, "index out of bounds");
        self.items.iter().skip(col).step_by(self.col_count)
    }
}

impl<T: Display> Display for Mat<T> {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        // Compute the width of the widest item first
        let mut len = 0usize;
        let mut buf = String::new();
        for item in (0..self.row_count).flat_map(|row| self.row_iter(row)) {
            buf.clear();
            write!(buf, "{}", item)?;
            len = std::cmp::max(len, buf.chars().count());
        }

        // Then render the matrix with proper padding

        len += 1; // To separate cells
        let width = len * self.col_count + 1;
        writeln!(f, "┌{:width$}┐", "", width = width)?;

        for row in (0..self.row_count).map(|row| self.row_iter(row)) {
            write!(f, "│")?;

            for item in row {
                write!(f, "{:>width$}", item, width = len)?;
            }

            writeln!(f, " │")?;
        }

        write!(f, "└{:width$}┘", "", width = width)
    }
}

// Rust standard libraries have no graphics support. If we want to render
// an image, we can write, e.g., a PPM file.

impl<T> Mat<T> {
    pub fn write_ppm(
        &self,
        f: &mut dyn std::io::Write,
        rgb: impl Fn(&T) -> (u8, u8, u8),
    ) -> std::io::Result<()> {
        let bytes = self
            .iter()
            .map(rgb)
            .flat_map(|(r, g, b)| {
                use std::iter::once;
                once(r).chain(once(g)).chain(once(b))
            })
            .collect::<Vec<u8>>();

        write!(f, "P6\n{} {}\n255\n", self.col_count, self.row_count)?;
        f.write_all(&bytes)
    }
}

mod kronecker {

    use super::Mat;
    use std::ops::Mul;

    // Look ma, no numbers! We can combine anything with Mul (see later)

    pub fn product<T, U>(a: &Mat<T>, b: &Mat<U>) -> Mat<<T as Mul<U>>::Output>
    where
        T: Clone + Mul<U>,
        U: Clone,
    {
        let row_count = a.row_count() * b.row_count();
        let col_count = a.col_count() * b.col_count();
        let mut items = Vec::with_capacity(row_count * col_count);

        for i in 0..a.row_count() {
            for k in 0..b.row_count() {
                for a_x in a.row_iter(i) {
                    for b_x in b.row_iter(k) {
                        items.push(a_x.clone() * b_x.clone());
                    }
                }
            }
        }

        Mat::from_vec(items, col_count, row_count)
    }

    pub fn power<T>(m: &Mat<T>, n: u32) -> Mat<T>
    where
        T: Clone + Mul<T, Output = T>,
    {
        match n {
            0 => m.clone(),
            _ => (1..n).fold(product(&m, &m), |result, _| product(&result, &m)),
        }
    }
}

// Here we make a char-like type with Mul implementation.
// We can do fancy things with that later.

#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
struct Char(char);

impl Char {
    fn space() -> Self {
        Char(' ')
    }

    fn is_space(&self) -> bool {
        self.0 == ' '
    }
}

impl Display for Char {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        Display::fmt(&self.0, f)
    }
}

impl Mul for Char {
    type Output = Self;

    #[allow(clippy::suspicious_arithmetic_impl)]
    fn mul(self, rhs: Self) -> Self {
        if self.is_space() || rhs.is_space() {
            Char(' ')
        } else {
            self
        }
    }
}

fn main() -> std::io::Result<()> {

    // Vicsek rendered in numbers

    #[rustfmt::skip]
    let vicsek = Mat::<u8>::from_vec(vec![
        0, 1, 0,
        1, 1, 1,
        0, 1, 0,
    ], 3, 3);

    println!("{}", vicsek);
    println!("{}", kronecker::power(&vicsek, 3));

    // We could render something by mapping the numbers to
    // something else. But we could compute with something
    // else directly, right?
    let s = Char::space();
    let b = Char('\u{2588}');

    #[rustfmt::skip]
    let sierpienski = Mat::from_vec(vec![
        b, b, b,
        b, s, b,
        b, b, b,
    ], 3, 3);

    println!("{}", sierpienski);
    println!("{}", kronecker::power(&sierpienski, 3));

    #[rustfmt::skip]
    let matrix = Mat::from_vec(vec![
        s, s, b, s, s,
        s, b, b, b, s,
        b, s, b, s, b,
        s, s, b, s, s,
        s, b, s, b, s,
    ], 5, 5,);

    println!("{}", kronecker::power(&matrix, 1));

    // This is nicer as an actual image
    kronecker::power(&matrix, 4).write_ppm(
        &mut std::fs::OpenOptions::new()
            .write(true)
            .create(true)
            .truncate(true)
            .open("kronecker_power.ppm")?,
        |&item| {
            if item.is_space() {
                (0, 0, 32)
            } else {
                (192, 192, 0)
            }
        },
    )
}

Sidef

Translation of: Raku
func kronecker_product (a, b) { a ~X b -> map { _[0] ~X* _[1] } }

func kronecker_fractal(pattern, order=4) {
    var kronecker = pattern
    { kronecker = kronecker_product(kronecker, pattern) } * order
    return kronecker
}

var vicsek = [[0,1,0], [1,1,1], [0,1,0]]
var carpet = [[1,1,1], [1,0,1], [1,1,1]]
var six    = [[0,1,1,1,0], [1,0,0,0,1], [1,0,0,0,0],
              [1,1,1,1,0], [1,0,0,0,1], [1,0,0,0,1], [0,1,1,1,0]]

require("Imager")

for name,shape,order in [
    [:vicsek, vicsek, 4],
    [:carpet, carpet, 4],
    [:six,    six,    3],
] {
    var pat = kronecker_fractal(shape, order)
    var img = %O<Imager>.new(xsize => pat[0].len, ysize => pat.len)
    for x,y in (^pat[0].len ~X ^pat.len) {
        img.setpixel(x => x, y => y, color => (pat[y][x] ? <255 255 32> : <16 16 16>))
    }
    img.write(file => "kronecker-#{name}-sidef.png")
}

Output images: Kronecker Carpet, Kronecker Vicsek and Kronecker Six

Wren

Translation of: Kotlin
Library: Wren-matrix
import "./matrix" for Matrix

var kroneckerPower = Fn.new { |m, n|
    var pow = m.copy()
    for (i in 1...n) pow = pow.kronecker(m)
    return pow
}

var printMatrix = Fn.new { |text, m|
    System.print("%(text) fractal :\n")
    for (i in 0...m.numRows) {
        for (j in 0...m.numCols) {
            System.write((m[i][j] == 1) ? "*" : " ")
        }
        System.print()
    }
    System.print()
}

var m = Matrix.new([ [0, 1, 0], [1, 1, 1], [0, 1, 0] ])
printMatrix.call("Vicsek", kroneckerPower.call(m, 4))
m = Matrix.new([ [1, 1, 1], [1, 0, 1], [1, 1, 1] ])
printMatrix.call("Sierpinski carpet", kroneckerPower.call(m, 4))
Output:
Same as Kotlin entry.

zkl

Uses Image Magick and the PPM class from http://rosettacode.org/wiki/Bitmap/Bresenham%27s_line_algorithm#zkl

var [const] GSL=Import.lib("zklGSL");    // libGSL (GNU Scientific Library)
fcn kronecker(A,B){  //--> new Matrix
   m,n, p,q := A.rows,A.cols, B.rows,B.cols;
   r:=GSL.Matrix(m*p, n*q);
   foreach i,j,k,l in (m,n,p,q){ r[p*i + k, q*j + l]=A[i,j]*B[k,l] }
   r
}

fcn kfractal(M,n,fname){
   R:=M;
   do(n){ R=kronecker(R,M) }
   r,c,img := R.rows, R.cols, PPM(r,c,0xFFFFFF);    // white canvas
   foreach i,j in (r,c){ if(R[i,j]) img[i,j]=0x00FF00 } // green dots
   println("%s: %dx%d with %,d points".fmt(fname,R.rows,R.cols,
        R.pump(0,Ref(0).inc,Void.Filter).value)); // count 1s in fractal matrix
   img.writeJPGFile(fname);
}
var [const] A=GSL.Matrix(3,3).set(0,1,0, 1,1,1, 0,1,0),
            B=GSL.Matrix(3,3).set(1,1,1, 1,0,1, 1,1,1);
kfractal(A,4,"vicsek_k.jpg");
kfractal(B,4,"sierpinskiCarpet_k.jpg");
Output:
vicsek_k.jpg: 243x243 with 3,125 points
sierpinskiCarpet_k.jpg: 243x243 with 32,768 points

Images at Vicsek fractal and Sierpinski Carpet fractal.