[#35719] Windows-31J <-> UTF-8 roundtrip — Tanaka Akira <akr@...>
以下のように Windows-31J と UTF-8 が roundtrip するかどうか
成瀬です。
In article <48932335.7010209@airemix.jp>,
成瀬です。
In article <48935EBD.3010603@airemix.jp>,
成瀬です。
[#35724] $SAFE=4の場合のReadline::HISTORY.each — Takao Kouji <kouji@...7.net>
knu さんへ
[#35726] "\x01\x00\x00\x00\x00\x00\x00\x21".encode("utf-8", "utf-32be", :invalid=>:replace) — Tanaka Akira <akr@...>
UTF-32BE で、文字として正しくない 4バイトと、文字として正し
[#35733] Re: [ruby-core:18078] We'll release 1.8.6/1.8.7 this Friday, #2 — Urabe Shyouhei <shyouhei@...>
というわけでそろそろリリースしようと思います。予定日は8月8日です。問題点
[#35745] [Bug:1.9] default_external depends on the order of -K and -E — sheepman <sh@...>
こんにちは sheepman です。
成瀬です。
Yuguiです。
[#35763] 文字コードがシンボルでないのは何故? — take_tk <ggb03124@...>
たけ(tk)です。
なかだです。
たけ(tk)です
[#35789] [Ruby 1.9 - Bug #407] (Open) String#<< — Shyouhei Urabe <redmine@...>
チケット #407 が報告されました。 (by Shyouhei Urabe)
まつもと ゆきひろです
Yukihiro Matsumoto さんは書きました:
まつもと ゆきひろです
成瀬です。
At 08:00 08/09/20, NARUSE, Yui wrote:
まつもと ゆきひろです
[#35811] fail to build extension libraries that includes some ruby header files — "Yusuke ENDOH" <mame@...>
遠藤です。
[#35834] 「サポートレベル」の定義、1.9.1のサポート予定プラットフォーム、メンテナ募集 — "Yugui (Yuki Sonoda)" <yugui@...>
Yuguiです。
[#35845] [Bug #437] test_strftime(TestTime) fails on Solaris — Shugo Maeda <redmine@...>
Bug #437: test_strftime(TestTime) fails on Solaris
前田です。
さとうふみやす @ OSS テクノロジです。
まつもと ゆきひろです
前田です。
まつもと ゆきひろです
前田です。
前田です。
まつもと ゆきひろです
前田です。
[#35851] [Feature:1.9] name referencing in sprintf — "Yusuke ENDOH" <mame@...>
遠藤です。
[#35863] Refactoring of enumerating prime numbers — "Yugui (Yuki Sonoda)" <yugui@...>
Yuguiです。
けいじゅ@いしつかです.
Yuguiです。
けいじゅ@いしつかです.
なかだです。
けいじゅ@いしつかです.
なかだです。
けいじゅ@いしつかです.
Yuguiです。
けいじゅ@いしつかです.
[#35899] [Bug #466] test_str_crypt(TestM17NComb) failed — Kazuhiro NISHIYAMA <redmine@...>
Bug #466: test_str_crypt(TestM17NComb) failed
[#35904] [Feature:1.9] pack format 'm' based on RFC 4648 — "Yusuke ENDOH" <mame@...>
遠藤です。
チケット #471 が更新されました。 (by Yuki Sonoda)
遠藤です。
In article <e0b1e5700809220338g5f3b5627p95e94744d5c10505@mail.gmail.com>,
遠藤です。
In article <e0b1e5700809231144n376fd4eencfe06c49ed66665e@mail.gmail.com>,
遠藤です。
[#35906] %N for Time#strftime — "Shugo Maeda" <shugo@...>
前田です。
In article <704d5db90808210811p7f3aef73h97913ade156323f3@mail.gmail.com>,
なかだです。
まつもと ゆきひろです
[#35922] [Bug #475] cgi.rbにNKFに依存したコードが入っている — Takeyuki Fujioka <redmine@...>
Bug #475: cgi.rbにNKFに依存したコードが入っている
[#35945] Re: [ruby-list:45386] Re: [ANN] REXMLのDoS脆弱性 — "Shugo Maeda" <shugo@...>
前田です。
前田です。
In message <704d5db90809010656k2042969bx3d8a4abdafeeea8e@mail.gmail.com>
[#35954] Re: [ruby-cvs:26052] Ruby:r18834 (trunk): * compile.c (defined_expr): should handle NODE_{AND,OR} as — SASADA Koichi <ko1@...>
ささだです.
まつもと ゆきひろです
ささだです.
まつもと ゆきひろです
ささだです.
まつもと ゆきひろです
[#35977] block parameter for Delagator — keiju@... (Keiju ISHITSUKA)
けいじゅ@いしつかです.
[#35986] 1.9と1.8で、delegateのインスタンスのクラス名の違う — Fujioka <fuj@...>
xibbarこと藤岡です。
まつもと ゆきひろです
けいじゅ@いしつかです.
藤岡です。
けいじゅ@いしつかです.
こんにちは、なかむら(う)です。
[#36008] [Bug #505] 1.upto 2 {|i| p i } — Shyouhei Urabe <redmine@...>
Bug #505: 1.upto 2 {|i| p i }
[#36028] [Bug #513] Tempfile yields [BUG] Stack consistency error — Shyouhei Urabe <redmine@...>
Bug #513: Tempfile yields [BUG] Stack consistency error
[#36033] [Bug #515] String#rindexが期待通りに動かない — Takeyuki Fujioka <redmine@...>
Bug #515: String#rindexが期待通りに動かない
[#36048] TypeError from Encoding.compatible? (r18920) — Yukihiro Matsumoto <matz@...>
まつもと ゆきひろです
[#36066] Numeric#scalar? — Tadayoshi Funaba <tadf@...>
1.9 の Numeric#scalar? について、適当でないのでは (real? などのほうがい
原です。
> やはり、scalar? はずれているんじゃないかな。real? の方がいい
原です。
> ここで、scalar? を疑問視する理由を復習すると、たとえば、「複
1.9.1 までに時間がないので scalar? だけ何とかしたいと思っていましたが、
前田です。
原です。
[ruby-dev:35983] Re: Refactoring of enumerating prime numbers
Yuguiです。
石塚圭樹 さんは書きました:
>>> 私もそうなのかなぁ? と思いつつも, では, 元のクラスの名前はどうするんだ?
>>> と思ったりもしてます.
>> class << (Prime = Object.new); end で。
私が送ったコードも既存のPrime.newしているコードに配慮してはいますが、
互換性をより確実に提供するという意味ではPrimeがクラスで有り続けたほうが
良いかもしれません。
ただ、その意味では石塚さんの、Primeを完全にシングルトンパターンにしてし
まうのはPrime.newできないので困ると思います。
もう一度整理します。
1. 素数全体を表すEnumerableなオブジェクトは唯一であるべき(yugui)
互換性のためにPrime.newできるのは仕方がないが、非推奨としたい
=> Primeを特異クラスを持つオブジェクトか、singletonパターン的なクラスに
2. 素数全体を表すものはインスタンスであるべき(石塚さん)
=> Primeがクラスというのはまずい。
Primeへのメソッド呼び出しをPrimeのインスタンスへ委譲するならばありえる。
3. 素数列挙の途中の状態を保持する外部イテレータが必要
4. 疑似素数列を生成するGeneratorもほしい
=> Prime::Generator, Prime::Generator23, Prime::EratosthenesGenerator
Prime::*の定数スコープを提供するためにもPrimeは、私が書いたような
singletonなオブジェクトよりは、石塚さんのようなsingletonパターンのほうが
良さそうに思えます。
ただし、互換性のためにPrime.newも許容するようにしてみました。このバー
ジョンのprime.rbを添付します。
この他、
a) エラトステネスのふるいでGeneratorを書いてみたらとても速くなったので、
Prime::EratosthenesGeneratorを加えてあります。
user system total real
trial division
17.060000 22.580000 39.640000 ( 39.556764)
eratosthenes
2.270000 0.010000 2.280000 ( 2.277945)
b) Prime.eachが上界をとるようにしてみました。そこに到達したら列挙を打ち
切ります。
c) Prime.eachの第2引数にgeneratorを指定できるようにしてみました。
d) Prime.eachとPrime.each.eachが同じオブジェクトであるために列挙状態を共
有してしまいます。generatorがselfではなくself.dupを返すようにしました。
e) Enumeratorに合わせて、Generatorにwith_indexとnextとrewindを足しました。
> * Prime::IncreaseSuperPrimeGenerator
> 上記2つのgeneratorの抽象スーパークラス
> 名前はいまいちなんですが, 昇順で, 素数集合のスーパーセットになる
> generator ということろからとっています.
> よい名前募集中
確かにこの名前には違和感がありますね。
PseudoPrimeGeneratorあたりではどうでしょうか。Generator23みたいに「疑
似」の精度が悪くても、逆に真にprimeであってもPseudoのサブセットにはなる
と思います。
--
Yugui <yugui@yugui.jp>
http://yugui.jp
私は私をDumpする
Attachments (2)
require "singleton"
require "forwardable"
class Integer
def Integer.from_prime_division(pd)
Prime.int_from_prime_division(pd)
end
def prime_division(generator = Prime::Generator23.new)
Prime.prime_division(self, generator)
end
def prime?
Prime.prime?(self)
end
def Integer.each_prime(ubound, &block)
Prime.each(ubound, &block)
end
end
class Prime
include Enumerable
@the_instance = Prime.new
def initialize
warn "Prime::new is obsolete. use Prime::instance or class methods of Prime."
end
class<<self
extend Forwardable
include Enumerable
def instance; @the_instance end
def method_added(method)
#puts "method add: #{method}"
(class<<self;self;end).def_delegator :instance, method
end
end
def each(ubound = nil, generator = Generator.new, &block)
generator.each(ubound, &block)
end
def prime?(value, generator = Prime::Generator23.new)
for num in generator
return false if value % num == 0
return true if value > num * num
end
end
def int_from_prime_division(pd)
pd.inject(1){|value, (prime, index)|
value *= prime**index
}
end
def prime_division(value, generator= Prime::Generator23.new)
raise ZeroDivisionError if self == 0
pv = []
for prime in generator
count = 0
while (value1, mod = value.divmod(prime)
mod) == 0
value = value1
count += 1
end
if count != 0
pv.push [prime, count]
end
break if prime * prime >= value
end
if value > 1
pv.push [value, 1]
end
return pv
end
class IncreaseSuperPrimeGenerator
include Enumerable
def succ
raise NotImplementedError, "need to define `succ'"
end
def next
raise NotImplementedError, "need to define `next'"
end
def rewind
raise NotImplementedError, "need to define `rewind'"
end
def each(ubound = nil, &block)
return self.dup unless block
if ubound
loop do
p = succ
break if p > ubound
block.call p
end
else
loop do
block.call succ
end
end
end
alias with_index each_with_index
end
ISPG = IncreaseSuperPrimeGenerator
class Generator<ISPG
def initialize
@index = -1
end
def succ
PrimeSet.instance[@index += 1]
end
def rewind
initialize
end
alias next succ
end
class EratosthenesGenerator <ISPG
def initialize
@last_prime = nil
end
def succ
@last_prime = @last_prime ? EratosthenesSieve.instance.next_to(@last_prime) : 2
end
def rewind
initialize
end
alias next succ
end
class Generator23<ISPG
def initialize
@prime = 1
@step = nil
end
def succ
loop do
if (@step)
@prime += @step
@step = 6 - @step
else
case @prime
when 1; @prime = 2
when 2; @prime = 3
when 3; @prime = 5; @step = 2
end
end
return @prime
end
end
alias next succ
def rewind
initialize
end
end
class PrimeSet
include Singleton
def initialize
# These are included as class variables to cache them for later uses. If memory
# usage is a problem, they can be put in Prime#initialize as instance variables.
# There must be no primes between @primes[-1] and @next_to_check.
@primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101]
# @next_to_check % 6 must be 1.
@next_to_check = 103 # @primes[-1] - @primes[-1] % 6 + 7
@ulticheck_index = 3 # @primes.index(@primes.reverse.find {|n|
# n < Math.sqrt(@@next_to_check) })
@ulticheck_next_squared = 121 # @primes[@ulticheck_index + 1] ** 2
end
# Return the prime cache.
def cache
return @primes
end
alias primes cache
alias primes_so_far cache
def [](index)
while index >= @primes.length
# Only check for prime factors up to the square root of the potential primes,
# but without the performance hit of an actual square root calculation.
if @next_to_check + 4 > @ulticheck_next_squared
@ulticheck_index += 1
@ulticheck_next_squared = @primes.at(@ulticheck_index + 1) ** 2
end
# Only check numbers congruent to one and five, modulo six. All others
# are divisible by two or three. This also allows us to skip checking against
# two and three.
@primes.push @next_to_check if @primes[2..@ulticheck_index].find {|prime| @next_to_check % prime == 0 }.nil?
@next_to_check += 4
@primes.push @next_to_check if @primes[2..@ulticheck_index].find {|prime| @next_to_check % prime == 0 }.nil?
@next_to_check += 2
end
return @primes[index]
end
end
class EratosthenesSieve
include Singleton
def initialize
# bitmap for odd prime numbers less than 256.
# for an odd number n, @table[i][j] is 1 when n is prime, where i,j = n.divmod(32) .
@table = [0xcb6e, 0x64b4, 0x129a, 0x816d, 0x4c32, 0x864a, 0x820d, 0x2196]
end
# returns the least odd prime number which is greater than +n+.
def next_to(n)
n = (n-1).div(2)*2+3 # the next odd number of given n
i,j = n.divmod(32)
loop do
extend_table until @table.length > i
if !@table[i].zero?
(j...32).step(2) do |j|
return 32*i+j if !@table[i][j.div(2)].zero?
end
end
i += 1; j = 1
end
end
private
def extend_table
orig_len = @table.length
new_len = [orig_len**2, orig_len+256].min
lbound = orig_len*32
ubound = new_len*32
@table.fill(0xFFFF, orig_len...new_len)
(3..Integer(Math.sqrt(ubound))).step(2) do |p|
i, j = p.divmod(32)
next if @table[i][j.div(2)].zero?
start = (lbound.div(2*p)*2+1)*p # odd multiple of p which is greater than or equal to lbound
(start...ubound).step(2*p) do |n|
i, j = n.divmod(32)
@table[i] &= 0xFFFF ^ (1<<(j.div(2)))
end
end
end
end
end
require 'prime.rb'
require 'benchmark'
max = 0x100000
Benchmark.bm do |x|
x.report("trial division") { c = 0; Prime.each(max, Prime::Generator.new){|x| c+=1 }; p c}
x.report("eratosthenes") { c = 0; Prime.each(max, Prime::EratosthenesGenerator.new){|x| c+=1 }; p c}
end