fortran66のブログ

fortran について書きます。

2012-12-01から1ヶ月間の記事一覧

Problem 16

2^1000を求めるのに手抜きして多倍長整数ライブラリ FMLIB を利用させていただきました。2^1000〜10^300なので300桁強の文字列を用意しました。 ソース・プログラム program PEuler016 use fmzm implicit none character(len = 350) :: str integer :: k(350…

Problem 15

をパスカルの三角形で求めます。4バイト整数ではオーバーフローします。 ソース・プログラム program PEuler015 implicit none integer, parameter :: ki = selected_int_kind(15), n = 20 integer :: i integer(ki), allocatable :: ipascal(:) ipascal = …

Problem 14

工夫せず素朴に求めます。4バイト整数ではオーバーフローしました。 ソース・プログラム program PEuler014 implicit none integer :: i, k, kk(1e6) integer(8) :: m do i = 1, 1e6 k = 1 m = i do if (mod(m, 2) == 0) then m = m / 2 else m = 3 * m + 1 …

Problem 013

多倍長計算が面倒なので、既存のライブラリ FMLIB を利用することにします。MPFUN とどっちがいいのかよくわかりません。 数字列はファイルから読み取った方が楽だと思いましたが、まぁ整形してソース・プログラム中にべたうちすることにしました。 ソース・…

Problem 012

i番目の三角数は i(i+1)/2 素因数分解は i, i+1, 2 についてやって足し引きする。約数の数は素因数に1足して積。 ソース・プログラム program PEuler012 implicit none integer :: i, k1, k2, n integer, allocatable :: ipfac(:), ipfac0(:), ipfac1(:) i =…

Problem 011

めんどくさいw 美しくない。 ソース・プログラム この入力だと配列の列と行が反対になってる。 program PEuler011 implicit none integer, parameter :: n = 20 integer, parameter :: itab(n, n) = [ & ! transpose [08,02,22,97,38,15,00,40,00,75,04,05,…

problem 006

ソース・プログラム program PEuler6 implicit none integer :: i, k(100) = [(i, i = 1, 100)] print *, sum(k)**2 - sum(k**2) ! !print *, sum([1:100])**2 - sum([1:100]**2) ! non-standard stop end program PEuler6 実行結果 25164150 続行するには何…

problem 005

ソース・プログラム program PEuler5 implicit none integer, parameter :: n = 20 integer, allocatable :: itab(:), ipow(:) integer :: k itab = ieratos(n) ipow = log(real(n)) / log(real(itab)) ! max prime power print *, product(itab**ipow) ! lc…

problem 004

これは2,3秒かかる。ソートして大きい数から探せば早くなろう。 ソース・プログラム program PEuler4 implicit none integer, parameter :: n = 999 integer :: itab(n, n) = 0 integer, allocatable :: q(:) integer :: i, j forall(i = 1:n, j = 1:n, i…

problem 003

ソース・プログラム program PEuler3 implicit none integer, parameter :: ki = selected_int_kind(12) integer(ki), parameter :: nx = 600851475143 !13195 integer, allocatable :: iptab(:) iptab = ieratos( int(sqrt(real(nx))) ) ! prime numbers up…

problem 002

ソース・プログラム program PEuler2 implicit none integer :: ifib0, ifib1, ifib2, isum ifib0 = 1 ifib1 = 2 isum = ifib1 do ifib2 = ifib0 + ifib1 if (ifib2 > 4 * 10**6) exit if (mod(ifib2, 2) == 0) isum = isum + ifib2 ifib0 = ifib1 ifib1 = i…

problem 001

あんまりやる気もしないが、たまに暇つぶしに。 http://projecteuler.net/ ソース・プログラム program PEuler1 implicit none integer, parameter :: nn = 1000 - 1 integer :: i, num(nn) num = [(i, i = 1, nn)] print *, sum(num, mask = mod(num, 3) ==…

problem 010

素数の総和は4バイト整数からオーバーフローしてしまいました。 ソース・プログラム program PEuler010 implicit none print *, sum( int(ieratos(2 * 10**6), kind = 8) ) ! int4 overflow stop contains function ieratos(n) ! thieve of Eratostenes int…

problem 009

テキトーw ソース・プログラム program PEuler009 implicit none integer :: ia, ib, ic ! a^2 + b^2 = c^2 do ic = 1, 1000 do ib = 1, ic - 1 if (ib > ic) exit ia = 1000 - ib - ic if (ia > ib) cycle if (ia <= 0) exit if (ia * ia + ib * ib == ic …

problem 008

ソース・プログラム program PEuler008 implicit none character(len = 1000) :: fig = & '73167176531330624919225119674426574742355349194934& &96983520312774506326239578318016984801869478851843& &858615607891129494954595017379583319528532088055…

problem 007

ガウスの素数定理によって大体の値の見当をつけてそこまでの素数をやや大目に求めます。 ソース・プログラム program PEuler007 implicit none integer, parameter :: np = 10001 integer, allocatable :: iptab(:) integer :: n ! np ~ n / log(n) ! approx…

エイトクィーン問題ふたたび

エイトクィーンの解を配列の配列に保存するようにします。以前はI/Oで出力しておりました。 参照 2012-05-19 8クイーン http://d.hatena.ne.jp/fortran66/20120519 2012-12-19 配列の配列 http://d.hatena.ne.jp/fortran66/20121219再帰を使うと簡潔に書け…

エラトステネスのふるい

昔のをもう少し整理しました。1からnmaxまでの整数列を生成するところでスタックがすぐあふれるのが難点。 素数は小さい方から逐次求めるので普通のDO..LOOPを、ふるいで表を埋めるのは順序に依らないのでコロン三つ組みを用いることにします。 実行結果 2 …

リスト構造のようなもの

配列の配列が欲しくなる時があるのですが、実行時にしかサイズの決まらない場合 Fortran では面倒になります。ポインタを使ってリスト構造を定義してもいいのですが、Fortran の世界ではポインタを使ったら負けに近いので、動的確保や後処理とかをちゃんとや…

A FORTRAN Coloring Book, by Roger E. Kaufman

「FORTRAN ぬりえ」という本がかつてあったようです。実際は塗り絵ではなく、Dr.Suess(スース先生)風の絵入り本のようです。wikipedia http://en.wikipedia.org/wiki/Dr._Seuss 出版年が70年代末なので、FORTRAN66で書かれていると思われます。 http://www…

Sn(3)群

群の積を中値演算子 .o. と定義。逆演算子は単項演算子にしてもいいが関数のままに。f2008の findloc 関数が使えると便利なんですが、無いので do..loop にて処理。 実行結果 : 1 2 3 4 5 6 - 1: 1 2 3 4 5 6 2: 2 3 1 5 6 4 3: 3 1 2 6 4 5 4: 4 6 5 1 3 2 …

Fortran 2008 status

Ian D. Chivers と Jane Sleightholme の記事によると、Cray が Fortran 2008 に完全対応したようです。まぁ coarray は元々 Cray がやっていた物なので有利だとは思いますが・・・ [http://dl.acm.org/citation.cfm?id=2408749&CFID=142464621&CFTOKEN=1032…

Tutorial: Introduction to Intel Visual Fortran

http://software.intel.com/en-us/articles/tutorial-introduction-to-intel-visual-fortran

Fortran 2003/2008 PATC CSC Course

EUのコンピュータ学習プログラムに講座がありました。 http://www.training.prace-ri.eu/training_material/?tx_pracetmo_pi1[uid]=214 Fortran 2003/2008 Lectures (6M)

しつこく自己記述プログラム

マルチ・ステートメント版 character(51)::f="('character(51)::f=',a1,a,a1';print f,34,f,34;end')";print f,34,f,34;end 改行版 character(53)::f="('character(53)::f=',a1,a,a1/'print f,34,f,34'/'end')" print f,34,f,34 end