# フラクタル図形 シェルピンスキーのギャスケット Sierpinski Gasket # 引数 段 割る ($n, $divide) # 戻り値 フラクタル図形 シェルピンスキーのギャスケット (@SierpinskiGasket) sub SIERPINSKIGASKET{ my ($n, $divide) = @_; my @SierpinskiGasket = (); my $Combination = 0; my $BinomialCoefficient = 0; my $N = int($n); my $Divide = int($divide); my $Front = 0; my $Back = 0; my $Limit = 0; my $Blank = 0; my $Remainder = 0; # 段、分割数の確認 if(($N < 0) || ($Divide < 0)){ return 0; } # 計算 for(my $i = 0; $i <= $N; $i++){ # 両端 $Front = $Back = 1; # 中心まで $Limit = $i / 2; # 空白 $Blank = " " x ($N - $i); # 二項係数 Binomial Coefficient $Combination = $i; for(my $j = 1; $j <= $Limit; $j++){ # 二項係数 Binomial Coefficient $Combination = $Combination / $j; $BinomialCoefficient = $Combination; $Combination = $Combination * ($i - $j); # 余り $Remainder = $BinomialCoefficient % $Divide; if($j != ($i - $j)){ # 終端が等しくないなら $Front = $Front." ".$Remainder; $Back = $Remainder." ".$Back; }else { $Front = $Front." ".$Remainder; } } if($i != 0){ # フラクタル図形 シェルピンスキーのギャスケット Sierpinski Gasket $SierpinskiGasket[$i] = $Blank.$Front." ".$Back; }else { # フラクタル図形 シェルピンスキーのギャスケット Sierpinski Gasket $SierpinskiGasket[$i] = $Blank.$Front; } } return @SierpinskiGasket; }