fortran66のブログ

fortran について書きます。

Fortran2003

INT(NaN), INT(+inf), INT(-inf) および部分配列ははみ出しおk?

IEEE例外の数に対するINT()の定義がよくわかりません。文献等で見た記憶がありません。後でISOの規格を調べてみたいですが、面倒くさくて億劫だw INTEGERのOut of rangeは、負の絶対値最大数になっているようですが、Intelの独自実装なのでしょうか、ISOの…

しつこくShell sort

Win32で走らせると、4割がたスピードアップします。Quick sortの場合はx64とWin32で速さは変わらないのですが・・ ■実行結果 Win32では10**9個のデータを確保できませんでした。 x64の場合の結果 ■ソースプログラム bubble sortの代わりにinsertion sortを使…

Shell sortでTokudaのgap increment sequenceを使うとお得だw

この論文によると、Knuthのgap式よりも性能の良いものがいくつか提案されているようです。その中のTokudaの式を使うことにします。 ■実行結果 確かにKnuthのものより計算量が少なくなっていて、Quick sortと似たような要素数依存性(O(NlogN))を見せています…

Quick sortがShell sortに負けているので..

要素数10**8程度ではShell sortも健闘してQuick sortと計算時間が変わりません。しかし、今のプログラムではQuick sortは余計なメモリーを食いすぎてこれ以上の要素数を計算できません。ここではQuick sortの小手先改良を行います。先日、要素数が少なくなっ…

<del datetime="2010-02-24T23:43:13+09:00">Shell sort実行時間がO(N^2)で謎だった件</del>Shell sort かわいいよ Shell sort!の巻

動的に記憶領域を確保できなかったFORTRAN77時代に重宝していたShell Sortのプログラムを書いてみました。ギャップのとり方として、Knuthの数列[tex:\{g_{n+1}=3*g_n+1|2*g_ha102549)。しかし、実行時間をデータ数の関数としてみると大体O(N^2)に比例して…

Quick sort + Bubble sort

Quick sortは、要素数が少ないときはかえって遅いので、要素数が減ったところでBubble sortのような素朴な方法に切り替えたほうが効率がよくなります。ここではBubble sortそのものではないのですが(しいて言えば沈殿sort?)、同等なO(N^2)のSORTを要素数50…

POINTERではなくALLOCATABLEで

ALLOCATABLEでやると、記憶領域の開放を自動でやってくれるのでやや楽だと思います。必要なコンパイラ・オプションは /assume:realloc_lhs /heap-arrays100000 です。Intel掲示板によると、来週早々にもIntelFortranの新しいupdateが出るようです。 ■ソース…

Quick Sort

Quick Sortプログラムをポインタを返す形式に書き直してみました。手動で割付しているので、開放忘れに注意が必要です。多分大丈夫だと思いますが。ヒープ領域に動的配列を割り付けることで、大きな配列にも適用できます。 ■実行結果 要素1個から10**8(1…

素数の個数の近似関数

Riemannによる素数の個数の式。 ここでLi(x)はGaussによる素数の個数の近似式です。(でも積分の下限が2なのか0なのかよく分からんw ただ計算結果からは、どちらでも大差無し)またμ(k)はメビウス関数です。 実行結果 ソースプログラム あまりまじめに考…

積分のRichardson extrapolation

『Extrapolateせよ』と言われると、ヒューゴー・ガーンズバックを思い出してしまう駄目刷り込み。今日も昨晩に続き、積分のRichardson補外(もしくは外挿)をば。ところでSFといえば映画『涼宮ハルヒの消失』を見てきました。そろそろ劇場も空いてる頃かなと…

GaussのLi(x)関数

Nまでの素数の個数の評価式として、ルジャンドルのやGaussのなどがあります。ここではガウスのLi(x)関数を数値積分で求めてみます。定義式のままでは積分範囲が広すぎるので、の変数変換を行い、さらに部分積分をしてみます。 これがベストなのか分かりませ…

エラトステネスの篩

確かに抽象度の高い新しい言語使用を使うとソースコードは簡潔になるけれど、見えないところで動的にメモリーを使用するので、スタックがあふれたり、最適化が効かなかったりで、DO LOOPのさわやかさには及びません。 出発ベクトルを演算子で何段も処理して…

オイラーの素数生成式

オイラーの素数生成式とその類似に基づいて素数を生成し、それが本当に素数かチェックします。素数判定は、素数が小さいので素朴に余りを見てゆくことにします。オイラーの素数生成式を初めて知った時、随分と妙なものがあるものだと思いましたが、その仲間…

EXP(pi SQRT( d ) ) が整数!

EXP(π√163)が整数にとても近くなるという事について、ちょっとだけ詳しく本に載っていたので試し計算。 実行結果 ソースコード PROGRAM test IMPLICIT NONE INTEGER, PARAMETER :: kq = SELECTED_REAL_KIND(25) REAL(kq), PARAMETER :: pi = 4.0_kq * ATAN(1…

単位行列を一行で生成

ついでに動的にフォーマット生成もする。 INTRINSIC :: RESHAPE が入ったのは、ファイル名を RESHAPE.F90 にしたため object 名がかぶってしまい必要になりました。本来的には不要。新版 fortran66.hatenablog.com 出力結果 ソースコード PROGRAM test INTEG…

Fortran2003 でのオブジェクト指向

Intel Fortran ではまだ Fortran2003 が完全実装されていないので、オブジェクト指向がらみの機能は、未実装だったりコンパイラのバグが多いのですが、一応挑戦?インスタンスの生成は、ALLOCATEでやるのかな? CLASS を使った包括的な構造体の使い方がイマ…

シーザー式暗号解読プログラム

正月休みにHaskellの本を斜め読みしていたのですが、その中のシーザー式暗号解読プログラムが面白かったのでFortranで書いてみました。大体はFortran95の範囲内で、配列生成子の記号に(/.../)ではなく[...]を使うところだけFortran2003規格を使いました。 グ…

PGI が CUDA 対応の F2003 コンパイラを11月に出荷?

PGI が CUDA 対応の F2003 コンパイラを11月に出荷とのこと。 http://www.softek.co.jp/SPG/Pgi/Accel/index.html NVIDIA社の CUDA™ 環境を備えた GPU / GPGPU 対応のコンパイラ機能を含めた PGIアクセラレータ™ コンパイラが、Linux / Windows / MacOS X …

新刊

Walter S. Brainerd 著 『Guide to Fortran 2003 Programming』なる本が最近出版されました。Fortan2003 で新たに導入された文法に重点を置いた本というわけでもなく、もっぱら一般的な Fortran 入門書的形式をとっています。各章ごとに前半で例を交えつつ文…

Fortran95/2003 Explained 12-4

allocatable components. TYPE 構造体の中に、allocatable 属性の変数を入れられるようになりました。Pointer の場合とはメモリー上での連続性や、コピーの時の振る舞いが違うようです。 実行結果 ソースコード MODULE real_polunomial_module IMPLICIT NONE…

Fortran95/2003 Explained 12-3

ALLOCATABLE 型の変数に、配列を代入すると、自動的に代入される配列のサイズに ALLOCATE しなおされます。便利ですが、注意して使わないとバグの温床になりそうな機能でもあります。Intel Fortran では、/assume:realloc_lhs という、コンパイル・オプショ…

Fortran95/2003 Explained 12-2

ALLOCATABLE 型の変数を、未ALLOCATE のままサブルーチンへ送り、そちらで ALLOCATE して戻してやることができるようになりました。 実行結果。 ソースコード MODULE m_mrc12_2 ! Fortran95/2003 Explained 12-2 IMPLICIT NONE CONTAINS !------------------…

サンプルが地味に更新されている。

Intel Visual Fortran 11.1-035 のサンプルを見ていて気づいたんですが、C言語との Mixed Language のサンプルなどで、Fortran2003 の ISO_C_BINDINGS を使うようになっていて、地味に更新されているのだなと思いました。ただ QuickWin のサンプルでの日本語…

複素パラメータの定義に、実数パラメータが使えるようになりました。 独仏では小数点にコンマを用いますが、Fortmat 出力でそれに対応できるようになりました。 実行結果 ソースコード PROGRAM test IMPLICIT NONE REAL, PARAMETER :: zero = 0.0, one = 1.0…

Fortran95/2003 Explained 18-5

Fortran の処理系に依存する定数が、いくつか参照できるようになっています。 実行結果 ソースコード PROGRAM test USE iso_fortran_env IMPLICIT NONE ! 18.5 PRINT *, CHARACTER_STORAGE_SIZE PRINT *, ERROR_UNIT PRINT *, FILE_STORAGE_SIZE PRINT *, IN…

ASSOCIATE その他

Fortran90 になってから文法が Pascal っぽく型に厳しくなって、文法エラーが出なくなれば、意味不明な実行時エラーも出にくくなっていたわけですが、Fortran2003 になるとまた実行時エラーが増えそうな微妙な仕様が多くなっています。実行時にバインドされ…

INTERFACE OPERATOR

Fortran95/2003 Explained 17.8 より。 実行結果 ソースコード !===================================== ! 17.8 MODULE m_test INTERFACE OPERATOR(.abe.) MODULE PROCEDURE abe END INTERFACE CONTAINS !----------------------------------- REAL FUNCTION…

Protected 属性

"Fortran95/2003 Explained" より 17.7節の Protected 属性。 モジュールのグローバル変数をモジュールの外からは READ ONLY にする属性です。モジュール内では書き換え可能です。 実行結果 ソース !==================================== 17.7 MODULE m_tes…

Rounding

Fortran95/2003 Explained 19.11 より。I/O時の Rounding 指定。 ROUND = xx RU Up 正無限大方向へ丸め RD Down 負無限大方向へ丸め RZ Zero 0原点方向へ丸め RN Nearest 最近接値に丸め、但しちょうど等距離にある場合はプロセッサ依存。 RC Compatible 最…

SELECT CLASS

Intel Fortran の v.11.1 が出ました。まだ完全ではありませんが、ようやく Fortran2003 のオブジェクト指向部分にも対応が進みました。Fortran95/2003 Explained 16.5 から、サンプル例を実行できるように補完したものば・・ 実行結果 ソース !============…