From: keiju@... (Keiju ISHITSUKA) Date: 1996-12-03T18:04:32+09:00 Subject: [ruby-list:1174] Rational and Complex けいじゅ@SHLジャパンです. またまた, 1週間ほど外に出ていました. rubyのメイルがいっぱい溜っていて 読むのが大変です(^^;;; RationalとComplexができましたのでリリースします. rational.rb -- Rational関係のファイル complex.rb -- Complex関係のファイル mathn.rb -- 数に関してより頑張っている関数群 1. rational.rb 分数関係の計算を主にサポートしています. 定義されているものは以下の通りです. 関数 Rational(a, b) --> a/b クラスRational Rational#+ Rational#- Rational#* Rational#/ Rational#** Rational#% Rational#divmod Rational#abs Rational#<=> Rational#to_i Rational#to_f Rational#to_s クラスInteger Integer#gcd Integer#lcm Integer#gcdlcm Integer#to_r クラスFixnum Fixnum#** クラスBignum Bignum#** Fixnum#** と Bignum#**は 指数がマイナスの時の対応で再定義しています. オリジナル**は power!にエイリアスされます. 2. Complex.rb 分数関係の計算を主にサポートしています. rational.rbとは独立に動作しま す(インクルードしていればそれなりに動作します). 定義されているものは以下の通りです. Complex(x, y) --> x + yi y.im --> 0 + yi Complex::I -- クラス定数 i(sqrt(-1))です. Complex::polar -- 極座標から複素数を生成します. Complex#+ Complex#- Complex#* Complex#/ Complex#** Complex#% Complex#divmod Complex#abs Complex#abs2 -- 絶対値の2乗を帰します. Complex#arg -- 極座標の角度 Complex#polar -- 極座標系での原点からの長さ Complex#conjugate -- 複素共役. Complex#<=> Complex#== Complex#to_i Complex#to_f Complex#to_r Complex#to_s 以下は, Complexとプロトコルを一致させるために追加しました. Numeric#im Numeric#arg Numeric#polar Numeric#conjugate 複素数に対応しています. 逆関数はいい加減です(主値をとっていない??). オ リジナルの関数は, Math.sqrt!の様になっています. Math.sqrt Math.exp Math.cos Math.sin Math.tan Math.log Math.log10 Math.atan 3. Mathn.rb Ratinal.rb, Complex.rb をインクルードしただけでは: Rational(1)/Rational(2) -> 1/2(Rational) となるのですが, 1/2 -> 0(Fixnum) 2*Rational(1,2) -> 1/1(Rational) となります. 1/2が0になるのは, rubyの動作を根本的に変えてしまうことにな りかねないので, Rational.rbをインクルードしただけでは, その挙動を変更 しないようになっています. 後者は, 2*Rational(1,2) が 1(Fixnum) となると, 2 * Rational(1,2) / 2 -> 0(Fixnum) となり少々困ります. ただ, 本来 Floatととは異なり, Ratinalは誤差がないので, 1/2 -> 1/2(Rational) 2 * Rational(1,2) -> 1(Fixnum) となってほしいこともあるかと思います. つまり, rubyのBignumとFixnumの様 な関係ですね. rubyではこれらの型変換は勝手に行なっています. mathn.rbをインクルードするとこの様な動作を行ないます. つまり, Ratinal とComplexをBignumとFixnumと同等な関係にします. また, **とsqrtについてですが, 現状では, Math.sqrt(4) -> 2(Float) Math.sqrt(Rational(1,4)) -> 0.5(Float) ですが, Mathn.rbをインクルードすると Math.sqrt(4) -> 2(Fixnum) Math.sqrt(1/4) -> 1/2(Rational) の様に計算する様に関数を再定義します. 定義されているメソッドは以下の通りです. Intefer#prime_division 素因数分解を行ないます. 例: 12 -> [[2, 2], [3, 1]] Integer::from_prime_division 素因数分解された結果から, 元の数を帰します. 例: [[2, 2], [3, 1]] -> 12 Intefer#gcd2 最大公約数を帰します. 素因数分解を用いています. Prime: 素数を帰すストリームです. エラトステネスのふるいを用いてい ます. Prime#succ -- 次の素数を帰します. Prime#each -- 素数を次々と帰すイテレータです. Rational#** ベキを帰します. RationalになるようであればRationalで帰します. ただ, 現行は純代数的方法(素因数分解を用いている)いてとても遅いので, そのうち改良したいです. Rational#power2 作りかけです(^^;; 気にしないで下さい. Math.sqrt(a) これはなかなかの傑作だと思っています. sqrtとそのサブルーチンの rsqrtはどういう動作しているか理解するのがむずかしいに違いありませ ん(^^;;; この他にaliasがかなり行なわれています. -- ここから. begin 644 mathn.rb.tgz M'XL( )'JHS( ^T<:7/;-C9?I5\!V767HD1==MRI&KO9HYUFN]O929O]DDDS ME$3;;"5*)25']J_?=P @ )*RI22]EIC$$A[>A8>'\P%*PW6\3,)Y+YT\^5AI M.!BFX=EP.$30V?GIZ=G@]!Q @\].AT_$X*-I9*1-M@Y3 M(9[\',4_;7X-@;^O=-P\AC9(^I^$07 MWL8,'?:&&OJ/*8P)G?B6S2T>/']-R]^^/[5 MMW_UOO_F7^*?X2I,Q(MDVFLW4:,@(/1767@=C>GK=!YFF7@I]13/Q'>;193& M4RJ$Y,7)=+Z91>+OR\4J3*-P,H^8E]!47M@5DS8POQ1A?^(4CL<=)Q\X>=_) M]]UR%^'$R<_BV\5RY@##2>9 GEU<.I#U\FU_G.)F] M75Y]Z2F4MOCT4\0!I"8V7 A_HWD64>:E]L-HMIE&W&"(D,R:^!\D5CJ"$*8F MB@-HVX6"1"E%:F'^F1@TV74 !4H#^) 1@_@@P L6 BP%( !K0??/"AE?DR. M8&A?#XH8S$S@KPV6TK'Z: A0.4ZBV9?>JR2^NFOG&K%D91< 1>]:NC)M0R]I M%J?V%GI>=P!;3"SB.(G7<3B/[R-'T,$6 T*TB_8!Z6!M$28S,DVA1/)[GF"C MANMERJ958*!9+N)$%FAQN9ENNB.AK:Q@*^K8-(OF6"G;18#SL(+\Z_DR M7"MBRGC(H@T\0M?L6]$5=U2YZ3)*H=L1IB[LB+LJ*P>_!RL'95;V#[5Q\ %L M'.QMXZ#:QO[[V%CGK*Z^RQU++&R.6H\QH?\!3.CO;4*_VH3]#^NF%49T;?T^ M)NQ_ !/V]S9A?X<7@ALNUS=*35"!KK9&=:]P#.FV M*_,I[QX[^L>)U;:WX7P3 3-/>B(7Y;-M&JTW::)&2[:$SU0N8UXS'\"[\][55A)N;HUC3; MK%3U7?UU-Y-BC.Y &QW+LPM;#*VY086PODFFZN=2YIW4V@;DXZ7--'-KY11W MCOI''5=N5C7 T9:8;,/VL@IOPNS&J9;XT>U*FB)][D VLC=9F+@!CA/IHSB0D%^J M<11/ *!4YAF'SP4F7<#&Q0>,#A-5]NXFGD=0W+K0 \+M,IYU!2_DY0PP40YM ML#(:2SMZZ.HZGRX>K:O:Y(>TQ96C(PT[O"S/@@8?DZ M\MBH+;A$2WYR2^!9PW*M#U3H'' >;;E%B&JU?!>E+5C&?&&Q)(NEALGX1+': M:/+$T>TE%C593V-6UU=AT!&+/ HBLWEM+&SP][L2?[H%-Q[R#^-QJ"CA/\^?^_P MGU 10#D@F0% 0I!P#Z=:#O'1L3.'S>YZ\4+HA(4#66C2CL>KY3Q,76#'S@9V MUK>S?:?4*3ZQLT9 4,-4/- $C!Q(>EVJMPF:+I.?-M?0'C98Q18UX.+"SNM0 MHPFY*D#2 B1S[?9" F0[CMDOZ3K/1=M5GIDN,P,O3O+,.C0R M\^6UE1D.\FP(F",4Q_%)Y1UR[S HABF)GPN1Y->4RV%&2A#5_;T.!Y3 M^,XDX!E8EN/T6XAE-JL<6B\#%/5UE&#!E^8D7['I%W)O5WJBH H]O=3,@[)8 MK:KS):6UHQ9YG9=V!9"MY>FX,G3JJY;TN+0K) C:4X)V!2#-AH)M=1J%<]PR M<2Y>P+B 6T"70>>!$S/5R')UE"(3YMV1J)B1I3&=IK$L54PY6:ZK&G4!U]PT M[6JWG,X2W)62BENE]XFL'6B,8+18">KQE,W@);E;P466Y%1%7TOP]H*:-6'G MET:^F@);7HJQ8Z3TS6$9B)1@^O119 ?Q+%+;\'* 3T#KQ."U?_1M*P_$FHU[ M^+9M-A)5+]!UV&SP 6#"!X -=2#HP>JH*V!]A.$'=0HX:C<;#0;2[-#@5KW( MUW]D07^K>NR63>?+SZX8^1I%#C+$@R[KQ+>8P>:$CWOAD[)8%E!TC@KN914Y MD&&^+,C([O[2X5W.=.U?6"@ M2 X<.';TII/]!@Z[LY\8O4'W^!.S+QPZ8IXXP\C)814_J:YX,6+Y\+A KIZR MKY.>/9,+F4%W+<*-)2Y5PD8VS%,8L%@0LH"6UT"@[9(.!QK5DM_NEFG5WM/ MBOBN765F=9BN-Q,MC[7QU<)*3KUR+4%1I<*24T](.T@+-+#]TI)IH^')&J.( MKFS 4G%YOU31BDG6E0PMQ'S[5K!V5P3Y\L@B5 MBW%SPJ+=@UJ6%Z>LQSB4S=5A.-BS=P+)/N'7!X95JPO15DXY^J&Q4[OW(%AW M&LQ4ATT+A%=-8OR&UW>;Z6HAWLHCYE)LD#R>1T1MS1#,/8>V/)NN0ZLU%JQJ5; MM&1 (>S&EW)QHUL@ZQQUO*-.W@H :,='^=K Q P TPN,H4PCYTL%M2#9)="1 M5RFN*,T1EJ]+HH]ENZ,RZYAU=:OBJ%:<,_(X/37\CZ(XP+\PUI*#+BWPFRI M+]?FG%&4YEF.?14]7ECN/>#QHN"0>L5?%K//!]%!U30$=J=5Y&5AFU(8-B7< MF+B&&( [J[+7@=.549&RB+4;8]+K9J1](*Q6W*/Q12!==7.8WGWCK7SI;L?9 M&J5!-MUE=L8S"UVS(EQ7YK%E091VM&N_ M+RR(E5)AC2'+8W%7.*5H<%U:J1GPN&EY<@7' K9XCY^^!=MVNS_J M%<878%U"%.PFP@/?Q]B :U5I UEIJJ7/VFL3\/PO5-49AY6M-H19JT:^BA26"E,1H(* M MV>-!K$!(H" (*NF!X6,]2%;@WKDM*SW4//5D>[$C=X>%VG+K&P>7$P*81Y:J MU^.U[= /H5H3'T/-4"&ESLPNZW"9XTY29V\*Y30;3'W\>M8;^$#:!A\;X=>\ M#TJS>L%,4 H2/O0<#M7UF"\=_2DDJ2 M*C@9CQ='?^Z;30M8\R4?]?;/@^__1T_/!_S^?S0\_>SI9WC_9W1V6M__^342 MW\A07O Q;O^,#GG\KU^7I]$OFSB-Q)'Q$P5'.32_N'3D7HMOZMO9HSWN9E=< M5)=3V&HF7Y>NTG@1O9W%; =51I1E9?2'KWWS8X6K92I689R";&*JIM(,@S? MJ &/L:\*LV4!&/FB101%N;U_#M^&;+C&$+V]ZBSAQMS/V)7G\ M60!GW2#-UKM*EXNW=A6\E7R\KIY>&75 Q"[48A9MN2Y2,*."EH3A^X1AJ5+Z M%*O,KFB3_R ?N!Q7-K-BSJS0I9:OQ<@G<,,W92ZPNFWFAP3Z=Q7(SI!5OZ;Q%1^P M3N:1ZD_&6Q3D]CR+HMRMGY.J6=X8SZF.&F!O,#?3*=7 M*3'<7#'T1@VBNL?8*$#;8#TZ?.AJM0;M^)F>D2Z55J_C-W3PJ7-()T53&05\ M\425Z* 1;4(I1Q\'R7J4'9/*3U4O:A_B:EK) &,,2A?+%E, (Z(0A=,;N6%8 MKL1L*<7>Q=%\EMNW]%RI^(#$OOW.X#[%!9M5D4T]G#JWW2<2KL*K9C7"[J2H M3?&J_@YM##KC$(RNX('<'UZ^^HJ=S#WK:A[X$-D\96PX$56^4S]H[WHTS..& M\Q"/CEXM9))1CCNHPAWNYJL=47XDJYGU1+1LK@(C,989[2G%LU]%R[KJ*PX@ MJRM9S?!KLG)[A58+A^QHOL !&[&@0RU@'@-"^44_U@:)+895_*B(+"P&$TJ? M>N:OP*FG.V+-WP[9I?+L#Z(ROP_>-<\G:J)7OU"P"WF6(\L/Z^<*]/MT65P_ MVO^]/-I72RT<%T?_KR/A+*)?;8KGVE)J)G,>(IM=*HG"=%:%2//*L#?HLPW= MXOSPDF=J'!@\8B@#1CWG5;,KA):B4NTHC.B.&BT5RQ8$+B0ZWXSD#_R=)WEY,E27RHYUPV(H$BC+AHIC MU1%#-W!V[-ITJR1[N*S8O=EP)9&G09(^ZD8;*]D M4IOC8Y%N)G=_R<1D;EGZ9A^40'?T0%W^Y M)*DY1^-6-54YH/O6VOB>_ ;F&YZW%3]I0-AY,Q-?C K-J&S((SNSL3JEY?AE M%S":>\1^J!.4/.ER]Z2$\5N?]]:I3G6J4YWJ5*I4ISK5J4YU =JE.=ZE2G.M6I3G6J4YWJ5*<_7_H?,VN1RP!X Z end __ .........................................石塚 圭樹@SHLジャパン(株)... ------------>アドレス変わりました!! e-mail: keiju@shljapan.co.jp <----