¸¶¤Ç¤¹¡£ >ÀµÌڤǤ¹¡£ >¸¶ ¿®°ìϺÍÍ¡¢¸æ¶µ¼¨ÍÆñ¤¦¤´¤¶¤¤¤Þ¤¹¡£ >"Ruby ¥×¥í¥°¥é¥ß¥ó¥°ÆþÌç" ¤Ïʬ¤«¤ê¤ä¤¹¤¯¤Æ¡¢°¦ÆÉ¤·¤Æ¤¤¤Þ¤¹¡£ ¤¢¤ê¤¬¤È¤¦¤´¤¶¤¤¤Þ¤¹¡£ >¤¿¤À DelayedList ¤Î½ê¤ÏÍý²ò¤¹¤ë¤Î¤Ë¶ìÏ«¤·¤Þ¤·¤¿¡£ ¤¢¤½¤³¤ÏÅâÆÍ¤ËÆñ¤·¤¯¤Ê¤Ã¤Æ¤¤¤ë¤Î¤Ç¡¢º£¡ÖÀµÌÚ¡ÝÀÄÌڡפˤè¤ë Sequence ¤ÎÎã¤ò¡¢¤¢¤ÎÁ°¤Ë¾Ò²ð¤¹¤Ù¤¤À¤Ã¤¿¤È¸å²ù¤·¤Æ¤¤¤Þ¤¹¡£²þÄû¤Î»þ¤ÏÆþ¤ì¤Þ¤· ¤ç¤¦¡£ >(¤Û¤«¤Ë¤ÏÌäÂê¤Î instance_eval) instance_eval ¤Ë¤Ä¤¤¤Æ¤Ï¤Û¤È¤ó¤É²òÀ⤷¤Þ¤»¤ó¤Ç¤·¤¿¡£¤³¤ì¤â¼êÍî¤Á¡£ >¤³¤ì¤Ï»ä¤Î script ¤Ç $mod=2 ¤È¤·¤¿¤â¤Î¤ÈËܼÁŪ¤Ë¤ÏƱ¤¸¤â¤Î¤À¤È¨Â¤ª¤â¤¤¤Þ¤¹¤¬¡¢ >break ¹Ô¤Î 100 ¤ò m ¤ËÊѤ¨¤ë¤È°Õ¿ÞÄ̤ê¤Ë¤Ïư¤¤Þ¤»¤ó¡£ >¤³¤ì¤ÏÃ×̿Ū¤Ê·ç´Ù¤À¤È»×¤Ã¤ÆºÎÍѤ·¤Ê¤«¤Ã¤¿¤ï¤±¤Ç¤¹¡£ >Prime ¤ÎÄêµÁ¤Î¤Ê¤«¤Ç¤Î m ¤ÏËÜÍè dummy(¾¤ÎÊÑ¿ô̾¤È¤Ö¤Ä¤«¤é¤Ê¤±£ëu >²¿¤ò»È¤Ã¤Æ¤â¤¤¤¤)ÊÑ¿ô¤ÎȦ¤Ê¤Î¤Ë¡¢¤³¤Î¾ì¹ç¤Ï¤³¤Î block ¤¬ mai >n ¤Î >context ¤Çɾ²Á¤µ¤ì¤ë¤¿¤á dummy ¤Ë¤Ê¤ê¤Þ¤»¤ó¡£ >¤³¤¦¤¤¤¦¾ì¹ç¤Ï¾¤Ç¤ÏÀäÂФ˻Ȥï¤Ê¤¤¤è¤¦¤ÊÊÑ¿ô̾¤ò»È¤¤¤Ê¤µ¤¤¤È¤¤¤¦ >²ò·èºö¤Ï¡¢Programming ¤Î´ðËܤËÈ¿¤¹¤ë(dummy ¤Ï dummy ¤Ç¤¢£ëuñâ¥é¤¤À >¤¤¤¦°ÕÌ£¤Ç)¤È»×¤¦¤Î¤Ç¼õ¤±Æþ¤ì¤é¤ì¤Þ¤»¤ó¡£ ¤Ê¤ë¤Û¤É¡£¡Ê½ê¡¹Ê¸»ú²½¤±¤·¤Æ¤¤¤ë¤Î¤ÇŬÅö¤ËÁÛÁü¤·¤ÆÊÖ»ö¤·¤Þ¤¹¡£¡Ë ¥Ö¥í¥Ã¥¯¤ò´Ø¿ô¤Î¥ª¥Ö¥¸¥§¥¯¥È²½¤À¤È»×¤Ã¤Æ»È¤¦¤È¡¢¤³¤³¤¬µ¤»ý¤Á°¤¤¤Ç¤¹¤Í¡£ ³Î¤«¤Ë¤½¤ÎÄ̤ê¤Ç¤¹¡£¤³¤ì¤Ë¤Ä¤¤¤Æ¤Ï¤³¤Î ML ¤Ç¤â²¿ÅÙ¤«ÏÃÂê¤Ë¤Ê¤Ã¤¿¤È»×¤¤ ¤Þ¤¹¡£ >Âè2°ú¿ô¤ÎɬÍ×À¤Ë¤Ä¤¤¤Æ¤Ç¤¹¤¬¡¢¡Ä¡Ä > >p (Prime*Power[2])[m] > >¤È¤ä¤ì¤ÐÅöÁ³ error ¤Ë¤Ê¤ê¤Þ¤¹¡£ ¤³¤ì¤Ï Prime*Power[2] ¤¬ p ¤Î°ú¿ô¤È²ò¼á¤µ¤ì¤Æ¤¤¤ë¤«¤é¤Ç¤¹¡£¡Ê¡ÖÆþÌç¡× ¤Î p.75 ¤Ë¤â¾¯¤·²òÀ⤷¤Þ¤·¤¿¤¬¡£¡Ë p() ¤ÎÌá¤êÃÍ nil ¤Ë [] ¤¬»Ü¤µ¤ì¤Æ ¤¤¤Þ¤¹¡£ ¤µ¤Æ¡¢¥í¡¼¥«¥ëÊÑ¿ô¤ò¥Ö¥í¥Ã¥¯¤Ë¸ÂÄꤷ¤Æ»È¤¦¤³¤È¤Ï instance_eval ¤ò¤â ¤Ã¤Æ¤·¤Æ¤â¤Ç¤¤Þ¤»¤ó¡£¤³¤³¤Ï¤ä¤Ï¤ê´Ø¿ô¤òÄêµÁ¤·¤Æ¤½¤ì¤òÅϤ¹¤·¤«¤Ê¤¤¤Ç ¤·¤ç¤¦¡£ class Sequence include Enumerable def initialize( list, &block ) @list = list @proc = block end def []( n ) @list[n] ||= @proc.call( self, n ) end def each i = 0 loop do yield self[i]; i += 1 end end def *(y) x=self Sequence.new([]){|seq,n| x[n]*y[n]} end end m = ARGV[0].to_i def (Power = {}).[]( x ) super || Power[x] = Sequence.new([1]) {|seq, n| x * seq[n-1] } end def self.sieve(seq, n) m = seq[n - 1] + 2 m += 2 while seq.find{|k| break if k * k > m m % k == 0 } m end Prime = Sequence.new([2,3], &method(:sieve)) p((Power[2]*Prime)[m]) ¤³¤³¤Ç¤Ï method ¤Ç Method ¥ª¥Ö¥¸¥§¥¯¥È¤òÀ¸À®¤·¤Æ¡¢¤½¤ì¤òÅϤ·¤Æ¤¤¤Þ¤¹¤¬¡¢ ¤¢¤Ã¤µ¤ê :sieve ¤ò¥·¥ó¥Ü¥ë¤È¤·¤Æ¤½¤Î¤Þ¤ÞÅϤ·¤Æ send ¤·¤Æ»È¤¦¤Î¤â·Ú¤¯¤Æ ¤¤¤¤¤«¤È»×¤¤¤Þ¤¹¡£ ¤Ç¤â sieve ¤È¤¤¤¦¥á¥½¥Ã¥É̾¤Îº¯Àפ¬¥È¥Ã¥×¥ì¥Ù¥ë¤Î self Æâ¤Ç´³¾Ä¤¹¤ë¤Î¤Ç¡¢ ¤¢¤ª¤¤µ¤ó¤Ê¤é¡¢ Prime = Sequence.new([2,3], & Object.new.instance_eval{ def sieve(seq, n) m = seq[n - 1] + 2 m += 2 while seq.find{|k| break if k * k > m m % k == 0 } m end self}.method(:sieve)) ¤È¤³¤³¤Þ¤Ç¤ä¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£(^^; ¤Ê¤ª¡¢¤³¤Î°ì»þŪ¤Ê´Ä¶¤Î¤¿¤á¤Î instance_eval ¤ÎÍøÍÑË¡¤Ï http://www1.u-netsurf.ne.jp/~brew/mine/ja/ruby/iter.html ¤Ë¤¢¤ê¤Þ¤¹¡£°ø¤ß¤Ë¡¢¤µ¤Þ¤¶¤Þ¤ÊưŪ¤Ê¼ê³¤¤ÎÍøÍÑË¡¤Î¥³¥ì¥¯¥·¥ç¥ó¤¬ http://blade.nagaokaut.ac.jp/~sinara/ruby/rubynyumon-2000/programing1.html ¤Ë¤¢¤ê¤Þ¤¹¡£»²¹Í¤Ë¤Ê¤ë¤«¤â¡£¡Ê¤Ê¤é¤Ê¤¤¤«¤â¡£¡Ë >̵¸Â¿ôÎó¤äµé¿ô¤Ë»È¤¦¤Î¤¬¼ç¤ÊÌÜŪ¤Ê¤Î¤Ç¤³¤ì¤¬½ÐÍè¤Ê¤¤¤È»È¤¤Êª¤Ë¤Ê¤ê¤Þ >¤»¤ó¡£(Cauchy Îó¤Þ¤¿¤Ïµé¿ô¤È¤·¤Æ¼Â¿ô¤½¤Î¤â¤Î¤òɽ¤¹ Real class £ëul >¤Æ¤¤¤Þ¤¹¤¬¼Â¹Ô®ÅÙ¤ËÌäÂ꤬¤¢¤ê¼ÂÍÑŪ¤Ê¤â¤Î¤Ï̤¤À½ÐÍè¤Þ¤»¤ó¡£) ÆÃÄê¤Î¿ô¤òɽ¸½¤¹¤ë Cauchy Îó¤òºî¤ë¤³¤È¤Ï¤Ç¤¤ë¤Ç¤·¤ç¤¦¤¬¡¢°ìÈÌ¤Ë¤Ï Î㤨¤Ð¤¢¤ë¿ôÎó¤¬ Cauchy Îó¤Ç¤¢¤ë¤«Èݤ«¤òÅú¤¨¤ë½Ò¸ì¤ÎÍͤʤâ¤Î¤Ïºî¤ì ¤Ê¤¤¤Î¤Ç¤Ï¤Ê¤¤¤È»×¤¤¤Þ¤¹¡£ >¤³¤ì¤ÏÊØÍø¤À¤È»×¤Ã¤Æ¤¯¤ì¤¿¿Í¤¬°ì¿Í¤â¤¤¤Ê¤«¤Ã¤¿¤Î¤¬¤Á¤ç¤Ã¤È»Äǰ¤À¤Ã¤¿ >¤Î¤Ç¡¢ºÇ¸å¤Ë»ÈÍÑÎã¤ò¾¯¤·¤À¤±: ¤¤¤¨¡¢ÂçÊѶ½Ì£¿¼¤¤¤Ç¤¹¡£¿ô¤½¤Î¤â¤Î¤Ç¤Ï¤Ê¤¯¡¢¿ô¤òµá¤á¤ë¥¢¥ë¥´¥ê¥º¥à¤ò·×»» ÂоݤȤ¹¤ë¤³¤È¤Ç¡¢Ìµ¸ÂÀºÅ٤η׻»¤¬¤Ç¤¤Þ¤¹¤Í¡£ ¿ô³Ø¤¬¤«¤é¤ó¤Ç¤¯¤ë¤ªÏäʤéÀ§Èó ruby-math ¤Ø¤ª±Û¤·¤¯¤À¤µ¤¤¡£