From: "Yugui (Yuki Sonoda)" Date: 2008-09-01T00:07:02+09:00 Subject: [ruby-dev:36067] Re: Refactoring of enumerating prime numbers This is a multi-part message in MIME format. --------------000908060809060302070306 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Yuguiです。 keiju ISHITSUKA さんは書きました: > 何カ所か変更個所がありましたが, いかがでしょう? > > もし, 問題ないようであれば, すいませんが, それを変更してcomit していた > だけないです? ありがとうございます。コミットしようかと思いましたがテストを書いていたら 2点問題に気づきました。結果としてちょっと変更が必要になりそうですので、 恐れ入りますが再度確認をお願いします。 先にお送りしたprime.rbでは2点問題がありました。 1. Prime.eachが返すenumerator(実際にはgenerator)が、uboundを記憶しない。 Prime.each(100){|p| }は停止するのに、Prime.each(100).each{|p| }は停止 しないという奇妙な結果になります。 2. Prime#nextがない。 互換性にこだわって見せた割にうっかりPrime#nextの実装を書き忘れていました。 また、先のバージョンを元に単純にPrime#nextを実装するとPrime#nextによっ て進んだ内部ポインタとPrime#eachが同期しません。Prime#eachは先立つ Prime#nextに関わらず2から列挙を開始してしまいます。 一方、Prime::eachやPrime::instance.eachのほうは先立つPrimeのインスタン スメソッド呼び出しには影響されずに2から列挙することを期待されると思います。 この2点の問題は解決できましたが、generatorのライフサイクルが少々変わりま した。新しいprime.rbを添付します。これで差し支えないようでしたらPrimeを 削除したバージョンのmathn.rbと併せてコミットしようと思います。いかがで しょうか? -- Yugui http://yugui.jp 私は私をDumpする --------------000908060809060302070306 Content-Type: text/plain; x-mac-type="0"; x-mac-creator="0"; name="prime.rb" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="prime.rb" cmVxdWlyZSAic2luZ2xldG9uIgpyZXF1aXJlICJmb3J3YXJkYWJsZSIKCmNsYXNzIEludGVn ZXIKICAjIFJlLWNvbXBvc2VzIGEgcHJpbWUgZmFjdG9yaXphdGlvbiBhbmQgcmV0dXJucyB0 aGUgcHJvZHVjdC4KICAjCiAgIyBTZWUgUHJpbWUjaW50X2Zyb21fcHJpbWVfZGl2aXNpb24g Zm9yIG1vcmUgZGV0YWlscy4KICBkZWYgSW50ZWdlci5mcm9tX3ByaW1lX2RpdmlzaW9uKHBk KQogICAgUHJpbWUuaW50X2Zyb21fcHJpbWVfZGl2aXNpb24ocGQpCiAgZW5kCiAgCiAgIyBS ZXR1cm5zIHRoZSBmYWN0b3JpemF0aW9uIG9mICtzZWxmKy4KICAjIAogICMgU2VlIFByaW1l I3ByaW1lX2RpdmlzaW9uIGZvciBtb3JlIGRldGFpbHMuCiAgZGVmIHByaW1lX2RpdmlzaW9u KGdlbmVyYXRvciA9IFByaW1lOjpHZW5lcmF0b3IyMy5uZXcpCiAgICBQcmltZS5wcmltZV9k aXZpc2lvbihzZWxmLCBnZW5lcmF0b3IpCiAgZW5kCgogICMgUmV0dXJucyB0cnVlIGlmICtz ZWxmKyBpcyBhIHByaW1lIG51bWJlciwgZmFsc2UgZm9yIGEgY29tcG9zaXRlLgogIGRlZiBw cmltZT8KICAgIFByaW1lLnByaW1lPyhzZWxmKQogIGVuZAoKICAjIEl0ZXJhdGVzIG92ZXIg YWxsIHByaW1lIG51bWJlcnMuIAogICMKICAjIENhbGxzICtibG9jaysgb25jZSBmb3IgZWFj aCBwcmltZSBudW1lciwgcGFzc2luZyBhIHByaW1lIGFzCiAgIyBhIHBhcmFtZXRlci4KICAj ICt1Ym91bmQrOjogVXBwZXIgYm91bmQgb2YgcHJpbWUgbnVtYmVycy4gVGhlIGl0ZXJhdG9y IHN0b3BzIAogICMgICAgICAgICAgICBhZnRlciB5aWVsZHMgYWxsIHByaW1lIG51bWJlcnMg K3AgPD0gdWJvdW5kKy4KICBkZWYgSW50ZWdlci5lYWNoX3ByaW1lKHVib3VuZCwgJmJsb2Nr KSAjIDp5aWVsZHM6IHByaW1lCiAgICBQcmltZS5lYWNoKHVib3VuZCwgJmJsb2NrKQogIGVu ZAplbmQKCiMgVGhlIHNldCBvZiBhbGwgcHJpbWUgbnVtYmVycy4KIwojID09IEV4YW1wbGUK IyAgUHJpbWUuZWFjaCgxMDApIGRvIHxwcmltZXwKIyAgICBwIHByaW1lICAjPT4gMiwgMywg NSwgNywgMTEsIC4uLi4sIDk3CiMgIGVuZApjbGFzcyBQcmltZQogIGluY2x1ZGUgRW51bWVy YWJsZQoKICBkZWYgaW5pdGlhbGl6ZSAjIDpub2RvYzoKICAgIEBnZW5lcmF0b3IgPSBuaWwK ICBlbmQKICBAdGhlX2luc3RhbmNlID0gUHJpbWUubmV3CgogICMgb2Jzb2xldGUuCiAgIwog ICMgVXNlICtQcmltZTo6aW5zdGFuY2UrIG9yIGNsYXNzIG1ldGhvZHMgb2YgK1ByaW1lKy4K ICBkZWYgaW5pdGlhbGl6ZQogICAgQGdlbmVyYXRvciA9IEVyYXRvc3RoZW5lc0dlbmVyYXRv ci5uZXcKICAgIHdhcm4gIlByaW1lOjpuZXcgaXMgb2Jzb2xldGUuIHVzZSBQcmltZTo6aW5z dGFuY2Ugb3IgY2xhc3MgbWV0aG9kcyBvZiBQcmltZS4iCiAgZW5kCgogIGRlZiBzdWNjCiAg ICBAZ2VuZXJhdG9yLnN1Y2MKICBlbmQKICBhbGlhcyBuZXh0IHN1Y2MKCiAgY2xhc3M8PHNl bGYKICAgIGV4dGVuZCBGb3J3YXJkYWJsZQogICAgaW5jbHVkZSBFbnVtZXJhYmxlCiAgICAj IFJldHVybnMgdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgUHJpbWUuCiAgICBkZWYgaW5zdGFu Y2U7IEB0aGVfaW5zdGFuY2UgZW5kCgogICAgZGVmIG1ldGhvZF9hZGRlZChtZXRob2QpICMg Om5vZG9jOgogICAgICAoY2xhc3M8PHNlbGY7c2VsZjtlbmQpLmRlZl9kZWxlZ2F0b3IgOmlu c3RhbmNlLCBtZXRob2QKICAgIGVuZAogIGVuZAoKICAjIGl0ZXJhdGVzIHRoZSBnaXZlbiBi bG9jayBvdmVyIGFsbCBwcmltZSBudW1iZXJzLgogIGRlZiBlYWNoKHVib3VuZCA9IG5pbCwg Z2VuZXJhdG9yID0gbmlsLCAmYmxvY2spCiAgICBnZW5lcmF0b3IgfHw9IChAZ2VuZXJhdG9y IHx8IEVyYXRvc3RoZW5lc0dlbmVyYXRvci5uZXcpCiAgICBvcmlnX3Vib3VuZCA9IGdlbmVy YXRvci51cHBlcl9ib3VuZAogICAgZ2VuZXJhdG9yLnVwcGVyX2JvdW5kID0gdWJvdW5kCiAg ICBnZW5lcmF0b3IuZWFjaCgmYmxvY2spCiAgZW5zdXJlCiAgICBnZW5lcmF0b3IudXBwZXJf Ym91bmQgPSBvcmlnX3Vib3VuZAogIGVuZAoKCiAgIyByZXR1cm5zIHRydWUgaWYgK3ZhbHVl KyBpcyBwcmltZSwgZmFsc2UgZm9yIGEgY29tcG9zaXRlLgogICMKICAjICt2YWx1ZSs6OiBh biBhcmJpdHJhcnkgaW50ZWdlci4KICAjICtnZW5lcmF0b3IrOjogb3B0aW9uYWwuIEEgcHNl dWRvLXByaW1lIGdlbmVyYXRvci4KICBkZWYgcHJpbWU/KHZhbHVlLCBnZW5lcmF0b3IgPSBQ cmltZTo6R2VuZXJhdG9yMjMubmV3KQogICAgZm9yIG51bSBpbiBnZW5lcmF0b3IKICAgICAg cmV0dXJuIHRydWUgaWYgdmFsdWUgPCBudW0gKiBudW0KICAgICAgcmV0dXJuIGZhbHNlIGlm IHZhbHVlICUgbnVtID09IDAKICAgIGVuZAogIGVuZAoKICAjIFJlLWNvbXBvc2VzIGEgcHJp bWUgZmFjdG9yaXphdGlvbiBhbmQgcmV0dXJucyB0aGUgcHJvZHVjdC4KICAjCiAgIyArcGQr OjogQXJyYXkgb2YgYXJyYXlzIG9mIGludGVnZXJzLiBUaGUgZWFjaCBpbnRlcm5hbCAKICAj ICAgICAgICBhcnJheSBjb25zaXN0cyBvZiBhIHByaW1lIG51bWJlciBhbmQgYSBuYXR1cmFs IG51bWJlci4gCiAgIwogICMgRm9yICtbW3BfMSwgZV8xXSwgW3BfMiwgZV8yXSwgLi4uLiwg W3BfbiwgZV9uXV0rLCBpdCByZXR1cm5zCiAgIyArcF8xKiplXzEgKiBwXzIqKmVfMiAqIC4u Li4gKiBwX24qKmVfbisuCiAgZGVmIGludF9mcm9tX3ByaW1lX2RpdmlzaW9uKHBkKQogICAg cGQuaW5qZWN0KDEpe3x2YWx1ZSwgKHByaW1lLCBpbmRleCl8CiAgICAgIHZhbHVlICo9IHBy aW1lKippbmRleAogICAgfQogIGVuZAoKICAjIFJldHVybnMgdGhlIGZhY3Rvcml6YXRpb24g b2YgK3ZhbHVlKy4KICAjCiAgIyBGb3IgYW4gYXJiaXRyYXJ5IGludGVnZXIgCiAgIyArbiA9 IHBfMSoqZV8xICogcF8yKiplXzIgKiAuLi4uICogcF9uKiplX24rLAogICMgK3ByaW1lX2Rp dmlzaW9uKG4pKyByZXR1cm5zCiAgIyArW1twXzEsIGVfMV0sIFtwXzIsIGVfMl0sIC4uLi4s IFtwX24sIGVfbl1dKy4KICAjCiAgIyA9PT0gUGFyYW1ldGVycwogICMgK3ZhbHVlKzo6IEFu IGFyYml0cmFyeSBpbnRlZ2VyLgogICMgK2dlbmVyYXRvcis6OiBPcHRpb25hbC4gQSBwc2V1 ZG8tcHJpbWUgZ2VuZXJhdG9yLgogICMgICAgICAgICAgICAgICArZ2VuZXJhdG9yLnN1Y2Mr IG11c3QgcmV0dXJuIHRoZSBuZXh0IAogICMgICAgICAgICAgICAgICBwc2V1ZG8tcHJpbWUg bnVtYmVyIGluIHRoZSBhc2NlbmRlbnQKICAjICAgICAgICAgICAgICAgb3JkZXIuIEl0IG11 c3QgZ2VuZXJhdGUgYWxsIHByaW1lIG51bWJlcnMsCiAgIyAgICAgICAgICAgICAgIGJ1dCBt YXkgZ2VuZXJhdGUgbm9uIHByaW1lIG51bWJlcnMuCiAgIwogICMgPT09PSBFeGNlcHRpb25z CiAgIyArWmVyb0RpdmlzaW9uRXJyb3IrOjogd2hlbiArdmFsdWUrIGlzIHplcm8uCiAgZGVm IHByaW1lX2RpdmlzaW9uKHZhbHVlLCBnZW5lcmF0b3I9IFByaW1lOjpHZW5lcmF0b3IyMy5u ZXcpCiAgICByYWlzZSBaZXJvRGl2aXNpb25FcnJvciBpZiB2YWx1ZSA9PSAwCiAgICBwdiA9 IFtdCiAgICBmb3IgcHJpbWUgaW4gZ2VuZXJhdG9yCiAgICAgIGNvdW50ID0gMAogICAgICB3 aGlsZSAodmFsdWUxLCBtb2QgPSB2YWx1ZS5kaXZtb2QocHJpbWUpCgkgICAgIG1vZCkgPT0g MAoJdmFsdWUgPSB2YWx1ZTEKCWNvdW50ICs9IDEKICAgICAgZW5kCiAgICAgIGlmIGNvdW50 ICE9IDAKCXB2LnB1c2ggW3ByaW1lLCBjb3VudF0KICAgICAgZW5kCiAgICAgIGJyZWFrIGlm IHByaW1lICogcHJpbWUgID49IHZhbHVlCiAgICBlbmQKICAgIGlmIHZhbHVlID4gMQogICAg ICBwdi5wdXNoIFt2YWx1ZSwgMV0KICAgIGVuZAogICAgcmV0dXJuIHB2CiAgZW5kCgogICMg QW4gYWJzdHJhY3QgY2xhc3MgZm9yIGVudW1lcmF0aW5nIHBzZXVkby1wcmltZSBudW1iZXJz LgogICMKICAjIENvbmNyZXRlIHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHN1Y2MsIG5l eHQsIHJld2luZC4KICBjbGFzcyBQc2V1ZG9QcmltZUdlbmVyYXRvcgogICAgaW5jbHVkZSBF bnVtZXJhYmxlCgogICAgZGVmIGluaXRpYWxpemUodWJvdW5kID0gbmlsKQogICAgICBAdWJv dW5kID0gdWJvdW5kCiAgICBlbmQKCiAgICBkZWYgdXBwZXJfYm91bmQ9KHVib3VuZCkKICAg ICAgQHVib3VuZCA9IHVib3VuZAogICAgZW5kCiAgICBkZWYgdXBwZXJfYm91bmQKICAgICAg QHVib3VuZAogICAgZW5kCgogICAgIyByZXR1cm5zIHRoZSBuZXh0IHBzZXVkby1wcmltZSBu dW1iZXIsIGFuZCBtb3ZlIHRoZSBpbnRlcm5hbAogICAgIyBwb3NpdGlvbiBmb3J3YXJkLiAK ICAgICMKICAgICMgK1BzZXVkb1ByaW1lR2VuZXJhdG9yI3N1Y2MrIHJhaXNlcyArTm90SW1w bGVtZW50ZWRFcnJvcisuIAogICAgZGVmIHN1Y2MKICAgICAgcmFpc2UgTm90SW1wbGVtZW50 ZWRFcnJvciwgIm5lZWQgdG8gZGVmaW5lIGBzdWNjJyIKICAgIGVuZAoKICAgICMgYWxpYXMg b2YgK3N1Y2MrLgogICAgZGVmIG5leHQKICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJv ciwgIm5lZWQgdG8gZGVmaW5lIGBuZXh0JyIKICAgIGVuZAoKICAgICMgUmV3aW5kcyB0aGUg aW50ZXJuYWwgcG9zaXRpb24gZm9yIGVudW1lcmF0aW9uLgogICAgIwogICAgIyBTZWUgK0Vu dW1lcmF0b3IjcmV3aW5kKy4KICAgIGRlZiByZXdpbmQKICAgICAgcmFpc2UgTm90SW1wbGVt ZW50ZWRFcnJvciwgIm5lZWQgdG8gZGVmaW5lIGByZXdpbmQnIgogICAgZW5kCgogICAgIyBJ dGVyYXRlcyB0aGUgZ2l2ZW4gYmxvY2sgZm9yIGVhY2ggcHJpbWUgbnVtYmVycy4KICAgICMg K3Vib3VuZCs6OiAKICAgIGRlZiBlYWNoKCZibG9jaykKICAgICAgcmV0dXJuIHNlbGYuZHVw IHVubGVzcyBibG9jawogICAgICBpZiBAdWJvdW5kCglsb29wIGRvCgkgIHAgPSBzdWNjCgkg IGJyZWFrIGlmIHAgPiBAdWJvdW5kCgkgIGJsb2NrLmNhbGwgcAoJZW5kCiAgICAgIGVsc2UK CWxvb3AgZG8KCSAgYmxvY2suY2FsbCBzdWNjCgllbmQKICAgICAgZW5kCiAgICBlbmQKCiAg ICAjIHNlZSArRW51bWVyYXRvciN3aXRoX2luZGV4Ky4KICAgIGFsaWFzIHdpdGhfaW5kZXgg ZWFjaF93aXRoX2luZGV4CgogICAgIyBzZWUgK0VudW1lcmF0b3Ijd2l0aF9vYmplY3QrLgog ICAgZGVmIHdpdGhfb2JqZWN0KG9iaikKICAgICAgcmV0dXJuIGVudW1fZm9yKDp3aXRoX29i amVjdCkgdW5sZXNzIGJsb2NrX2dpdmVuPwogICAgICBlYWNoIGRvIHxwcmltZXwKCXlpZWxk IHByaW1lLCBvYmoKICAgICAgZW5kCiAgICBlbmQKICBlbmQKICAKICAjIEFuIGltcGxlbWVu dGF0aW9uIG9mICtQc2V1ZG9QcmltZUdlbmVyYXRvcisuCiAgIwogICMgVXNlcyArRXJhdG9z dGhlbmVzU2lldmUrLgogIGNsYXNzIEVyYXRvc3RoZW5lc0dlbmVyYXRvciA8IFBzZXVkb1By aW1lR2VuZXJhdG9yCiAgICBkZWYgaW5pdGlhbGl6ZQogICAgICBAbGFzdF9wcmltZSA9IG5p bAogICAgZW5kCiAgICAKICAgIGRlZiBzdWNjCiAgICAgIEBsYXN0X3ByaW1lID0gQGxhc3Rf cHJpbWUgPyBFcmF0b3N0aGVuZXNTaWV2ZS5pbnN0YW5jZS5uZXh0X3RvKEBsYXN0X3ByaW1l KSA6IDIKICAgIGVuZAogICAgZGVmIHJld2luZAogICAgICBpbml0aWFsaXplCiAgICBlbmQK ICAgIGFsaWFzIG5leHQgc3VjYwogIGVuZAoKICAjIEFuIGltcGxlbWVudGF0aW9uIG9mICtQ c2V1ZG9QcmltZUdlbmVyYXRvcisgd2hpY2ggdXNlcyAKICAjIGEgcHJpbWUgdGFibGUgZ2Vu ZXJhdGVkIGJ5IHRyaWFsIGRpdmlzaW9uLgogIGNsYXNzIFRyaWFsRGl2aXNpb25HZW5lcmF0 b3I8UHNldWRvUHJpbWVHZW5lcmF0b3IKICAgIGRlZiBpbml0aWFsaXplCiAgICAgIEBpbmRl eCA9IC0xCiAgICBlbmQKICAgIAogICAgZGVmIHN1Y2MKICAgICAgVHJpYWxEaXZpc2lvbi5p bnN0YW5jZVtAaW5kZXggKz0gMV0KICAgIGVuZAogICAgZGVmIHJld2luZAogICAgICBpbml0 aWFsaXplCiAgICBlbmQKICAgIGFsaWFzIG5leHQgc3VjYwogIGVuZAoKICAjIEdlbmVyYXRl cyBhbGwgaW50ZWdlciB3aGljaCBhcmUgZ3JlYXRlciB0aGFuIDIgYW5kCiAgIyBhcmUgbm90 IGRpdmlkZWQgYnkgMiBub3IgMy4KICAjCiAgIyBUaGlzIGlzIGEgcHNldWRvLXByaW1lIGdl bmVyYXRvciwgc3VpdGFibGUgb24gCiAgIyBjaGVja2luZyBwcmltYWxpdHkgb2YgYSBpbnRl Z2VyIGJ5IGJydXRlIGZvcmNlIAogICMgbWV0aG9kLgogIGNsYXNzIEdlbmVyYXRvcjIzPFBz ZXVkb1ByaW1lR2VuZXJhdG9yCiAgICBkZWYgaW5pdGlhbGl6ZQogICAgICBAcHJpbWUgPSAx CiAgICAgIEBzdGVwID0gbmlsCiAgICBlbmQKICAgIAogICAgZGVmIHN1Y2MKICAgICAgbG9v cCBkbwoJaWYgKEBzdGVwKQoJICBAcHJpbWUgKz0gQHN0ZXAKCSAgQHN0ZXAgPSA2IC0gQHN0 ZXAKCWVsc2UKCSAgY2FzZSBAcHJpbWUKCSAgd2hlbiAxOyBAcHJpbWUgPSAyCgkgIHdoZW4g MjsgQHByaW1lID0gMwoJICB3aGVuIDM7IEBwcmltZSA9IDU7IEBzdGVwID0gMgoJICBlbmQK CWVuZAoJcmV0dXJuIEBwcmltZQogICAgICBlbmQKICAgIGVuZAogICAgYWxpYXMgbmV4dCBz dWNjCiAgICBkZWYgcmV3aW5kCiAgICAgIGluaXRpYWxpemUKICAgIGVuZAogIGVuZAoKCgoK ICAjIEFuIGltcGxlbWVudGF0aW9uIG9mIHByaW1lIHRhYmxlIGJ5IHRyaWFsIGRpdmlzaW9u IG1ldGhvZC4KICBjbGFzcyBUcmlhbERpdmlzaW9uCiAgICBpbmNsdWRlIFNpbmdsZXRvbgoK ICAgIGRlZiBpbml0aWFsaXplICMgOm5vZG9jOgogICAgICAjIFRoZXNlIGFyZSBpbmNsdWRl ZCBhcyBjbGFzcyB2YXJpYWJsZXMgdG8gY2FjaGUgdGhlbSBmb3IgbGF0ZXIgdXNlcy4gIElm IG1lbW9yeQogICAgICAjICAgdXNhZ2UgaXMgYSBwcm9ibGVtLCB0aGV5IGNhbiBiZSBwdXQg aW4gUHJpbWUjaW5pdGlhbGl6ZSBhcyBpbnN0YW5jZSB2YXJpYWJsZXMuCgogICAgICAjIFRo ZXJlIG11c3QgYmUgbm8gcHJpbWVzIGJldHdlZW4gQHByaW1lc1stMV0gYW5kIEBuZXh0X3Rv X2NoZWNrLgogICAgICBAcHJpbWVzID0gWzIsIDMsIDUsIDcsIDExLCAxMywgMTcsIDE5LCAy MywgMjksIDMxLCAzNywgNDEsIDQzLCA0NywgNTMsIDU5LCA2MSwgNjcsIDcxLCA3MywgNzks IDgzLCA4OSwgOTcsIDEwMV0KICAgICAgIyBAbmV4dF90b19jaGVjayAlIDYgbXVzdCBiZSAx LiAgCiAgICAgIEBuZXh0X3RvX2NoZWNrID0gMTAzICAgICAgICAgICAgIyBAcHJpbWVzWy0x XSAtIEBwcmltZXNbLTFdICUgNiArIDcKICAgICAgQHVsdGljaGVja19pbmRleCA9IDMgICAg ICAgICAgICAjIEBwcmltZXMuaW5kZXgoQHByaW1lcy5yZXZlcnNlLmZpbmQge3xufAogICAg ICAjICAgbiA8IE1hdGguc3FydChAQG5leHRfdG9fY2hlY2spIH0pCiAgICAgIEB1bHRpY2hl Y2tfbmV4dF9zcXVhcmVkID0gMTIxICAgIyBAcHJpbWVzW0B1bHRpY2hlY2tfaW5kZXggKyAx XSAqKiAyCiAgICBlbmQKCiAgICAjIFJldHVybnMgdGhlIGNhY2hlZCBwcmltZSBudW1iZXJz LgogICAgZGVmIGNhY2hlCiAgICAgIHJldHVybiBAcHJpbWVzCiAgICBlbmQKICAgIGFsaWFz IHByaW1lcyBjYWNoZQogICAgYWxpYXMgcHJpbWVzX3NvX2ZhciBjYWNoZQoKICAgICMgUmV0 dXJucyB0aGUgK2luZGV4K3RoIHByaW1lIG51bWJlci4gCiAgICAjCiAgICAjICtpbmRleCsg aXMgYSAwLWJhc2VkIGluZGV4LgogICAgZGVmIFtdKGluZGV4KQogICAgICB3aGlsZSBpbmRl eCA+PSBAcHJpbWVzLmxlbmd0aAoJIyBPbmx5IGNoZWNrIGZvciBwcmltZSBmYWN0b3JzIHVw IHRvIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgcG90ZW50aWFsIHByaW1lcywKCSMgICBidXQg d2l0aG91dCB0aGUgcGVyZm9ybWFuY2UgaGl0IG9mIGFuIGFjdHVhbCBzcXVhcmUgcm9vdCBj YWxjdWxhdGlvbi4KCWlmIEBuZXh0X3RvX2NoZWNrICsgNCA+IEB1bHRpY2hlY2tfbmV4dF9z cXVhcmVkCgkgIEB1bHRpY2hlY2tfaW5kZXggKz0gMQoJICBAdWx0aWNoZWNrX25leHRfc3F1 YXJlZCA9IEBwcmltZXMuYXQoQHVsdGljaGVja19pbmRleCArIDEpICoqIDIKCWVuZAoJIyBP bmx5IGNoZWNrIG51bWJlcnMgY29uZ3J1ZW50IHRvIG9uZSBhbmQgZml2ZSwgbW9kdWxvIHNp eC4gQWxsIG90aGVycwoKCSMgICBhcmUgZGl2aXNpYmxlIGJ5IHR3byBvciB0aHJlZS4gIFRo aXMgYWxzbyBhbGxvd3MgdXMgdG8gc2tpcCBjaGVja2luZyBhZ2FpbnN0CgkjICAgdHdvIGFu ZCB0aHJlZS4KCUBwcmltZXMucHVzaCBAbmV4dF90b19jaGVjayBpZiBAcHJpbWVzWzIuLkB1 bHRpY2hlY2tfaW5kZXhdLmZpbmQge3xwcmltZXwgQG5leHRfdG9fY2hlY2sgJSBwcmltZSA9 PSAwIH0ubmlsPwoJQG5leHRfdG9fY2hlY2sgKz0gNAoJQHByaW1lcy5wdXNoIEBuZXh0X3Rv X2NoZWNrIGlmIEBwcmltZXNbMi4uQHVsdGljaGVja19pbmRleF0uZmluZCB7fHByaW1lfCBA bmV4dF90b19jaGVjayAlIHByaW1lID09IDAgfS5uaWw/CglAbmV4dF90b19jaGVjayArPSAy IAogICAgICBlbmQKICAgICAgcmV0dXJuIEBwcmltZXNbaW5kZXhdCiAgICBlbmQKICBlbmQK CiAgIyBBbiBpbXBsZW1lbnRhdGlvbiBvZiBlcmF0b3N0aGVuZXMncyBzaWV2ZQogIGNsYXNz IEVyYXRvc3RoZW5lc1NpZXZlCiAgICBpbmNsdWRlIFNpbmdsZXRvbgoKICAgIGRlZiBpbml0 aWFsaXplICMgOm5vZG9jOgogICAgICAjIGJpdG1hcCBmb3Igb2RkIHByaW1lIG51bWJlcnMg bGVzcyB0aGFuIDI1Ni4KICAgICAgIyBGb3IgYW4gYXJiaXRyYXJ5IG9kZCBudW1iZXIgbiwg QHRhYmxlW2ldW2pdIGlzIDEgd2hlbiBuIGlzIHByaW1lIHdoZXJlIGksaiA9IG4uZGl2bW9k KDMyKSAuCiAgICAgIEB0YWJsZSA9IFsweGNiNmUsIDB4NjRiNCwgMHgxMjlhLCAweDgxNmQs IDB4NGMzMiwgMHg4NjRhLCAweDgyMGQsIDB4MjE5Nl0KICAgIGVuZAoKICAgICMgcmV0dXJu cyB0aGUgbGVhc3Qgb2RkIHByaW1lIG51bWJlciB3aGljaCBpcyBncmVhdGVyIHRoYW4gK24r LgogICAgZGVmIG5leHRfdG8obikKICAgICAgbiA9IChuLTEpLmRpdigyKSoyKzMgIyB0aGUg bmV4dCBvZGQgbnVtYmVyIG9mIGdpdmVuIG4KICAgICAgaSxqID0gbi5kaXZtb2QoMzIpCiAg ICAgIGxvb3AgZG8KCWV4dGVuZF90YWJsZSB1bnRpbCBAdGFibGUubGVuZ3RoID4gaQoJaWYg IUB0YWJsZVtpXS56ZXJvPwoJICAoai4uLjMyKS5zdGVwKDIpIGRvIHxqfAoJICAgIHJldHVy biAzMippK2ogaWYgIUB0YWJsZVtpXVtqLmRpdigyKV0uemVybz8KCSAgZW5kCgllbmQKCWkg Kz0gMTsgaiA9IDEKICAgICAgZW5kCiAgICBlbmQKCiAgICBwcml2YXRlCiAgICBkZWYgZXh0 ZW5kX3RhYmxlCiAgICAgIG9yaWdfbGVuID0gQHRhYmxlLmxlbmd0aAogICAgICBuZXdfbGVu ID0gW29yaWdfbGVuKioyLCBvcmlnX2xlbisyNTZdLm1pbgogICAgICBsYm91bmQgPSBvcmln X2xlbiozMgogICAgICB1Ym91bmQgPSBuZXdfbGVuKjMyCiAgICAgIEB0YWJsZS5maWxsKDB4 RkZGRiwgb3JpZ19sZW4uLi5uZXdfbGVuKQogICAgICAoMy4uSW50ZWdlcihNYXRoLnNxcnQo dWJvdW5kKSkpLnN0ZXAoMikgZG8gfHB8CglpLCBqID0gcC5kaXZtb2QoMzIpCgluZXh0IGlm IEB0YWJsZVtpXVtqLmRpdigyKV0uemVybz8KCglzdGFydCA9IChsYm91bmQuZGl2KDIqcCkq MisxKSpwICAgICMgb2RkIG11bHRpcGxlIG9mIHAgd2hpY2ggaXMgZ3JlYXRlciB0aGFuIG9y IGVxdWFsIHRvIGxib3VuZAoJKHN0YXJ0Li4udWJvdW5kKS5zdGVwKDIqcCkgZG8gfG58Cgkg IGksIGogPSBuLmRpdm1vZCgzMikKCSAgQHRhYmxlW2ldICY9IDB4RkZGRiBeICgxPDwoai5k aXYoMikpKQoJZW5kCiAgICAgIGVuZAogICAgZW5kCiAgZW5kCmVuZAo= --------------000908060809060302070306 Content-Type: text/plain; x-mac-type="0"; x-mac-creator="0"; name="test_prime.rb" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="test_prime.rb" cmVxdWlyZSAndGVzdC91bml0JwpyZXF1aXJlICdwcmltZScKcmVxdWlyZSAnc3RyaW5naW8n CgpjbGFzcyBUZXN0UHJpbWUgPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQogICMgVGhlIGZpcnN0 IDEwMCBwcmltZSBudW1iZXJzCiAgUFJJTUVTID0gWwogICAgMiwgMywgNSwgNywgMTEsIDEz LCAxNywgMTksIDIzLCAyOSwgMzEsIDM3LAogICAgNDEsIDQzLCA0NywgNTMsIDU5LCA2MSwg NjcsIDcxLCA3MywgNzksIDgzLCAKICAgIDg5LCA5NywgMTAxLCAxMDMsIDEwNywgMTA5LCAx MTMsIDEyNywgMTMxLCAKICAgIDEzNywgMTM5LCAxNDksIDE1MSwgMTU3LCAxNjMsIDE2Nywg MTczLCAxNzksIAogICAgMTgxLCAxOTEsIDE5MywgMTk3LCAxOTksIDIxMSwgMjIzLCAyMjcs IDIyOSwgCiAgICAyMzMsIDIzOSwgMjQxLCAyNTEsIDI1NywgMjYzLCAyNjksIDI3MSwgMjc3 LCAKICAgIDI4MSwgMjgzLCAyOTMsIDMwNywgMzExLCAzMTMsIDMxNywgMzMxLCAzMzcsIAog ICAgMzQ3LCAzNDksIDM1MywgMzU5LCAzNjcsIDM3MywgMzc5LCAzODMsIDM4OSwgCiAgICAz OTcsIDQwMSwgNDA5LCA0MTksIDQyMSwgNDMxLCA0MzMsIDQzOSwgNDQzLCAKICAgIDQ0OSwg NDU3LCA0NjEsIDQ2MywgNDY3LCA0NzksIDQ4NywgNDkxLCA0OTksIAogICAgNTAzLCA1MDks IDUyMSwgNTIzLCA1NDEsCiAgXQogIGRlZiB0ZXN0X2VhY2gKICAgIHByaW1lcyA9IFtdCiAg ICBQcmltZS5lYWNoIGRvIHxwfAogICAgICBicmVhayBpZiBwID4gNTQxCiAgICAgIHByaW1l cyA8PCBwCiAgICBlbmQKICAgIGFzc2VydF9lcXVhbCBQUklNRVMsIHByaW1lcwogIGVuZAoK ICBkZWYgdGVzdF9lYWNoX2J5X3ByaW1lX251bWJlcl90aGVvcmVtCiAgICAzLnVwdG8oMTUp IGRvIHxpfAogICAgICBtYXggPSAyKippCiAgICAgIHByaW1lcyA9IFtdCiAgICAgIFByaW1l LmVhY2ggZG8gfHB8CiAgICAgICAgYnJlYWsgaWYgcCA+PSBtYXgKICAgICAgICBwcmltZXMg PDwgcAogICAgICBlbmQKCiAgICAgICMgUHJpbWUgbnVtYmVyIHRoZW9yZW0KICAgICAgYXNz ZXJ0IHByaW1lcy5sZW5ndGggPj0gbWF4L01hdGgubG9nKG1heCkgIAogICAgICBhc3NlcnQg cHJpbWVzLmxlbmd0aCA8PSAoMi4ubWF4KS5zdGVwKDAuMSkuaW5qZWN0KDApe3xzdW0seHwg c3VtICsgMC4xIC8gTWF0aC5sb2coeCl9ICMgTGkoeCkKCiMgICAgICBhc3NlcnQgUHJpbWUu Y2FjaGUubGVuZ3RoID49IHByaW1lcy5sZW5ndGgKICAgIGVuZAogIGVuZAoKICBkZWYgdGVz dF9lYWNoX3dpdGhvdXRfYmxvY2sKICAgIGVudW0gPSBQcmltZS5lYWNoCiAgICBhc3NlcnQg ZW51bS5yZXNwb25kX3RvPyg6ZWFjaCkKICAgIGFzc2VydCBlbnVtLmtpbmRfb2Y/KEVudW1l cmFibGUpCiAgICBhc3NlcnQgZW51bS5yZXNwb25kX3RvPyg6d2l0aF9pbmRleCkKICAgIGFz c2VydCBlbnVtLnJlc3BvbmRfdG8/KDpuZXh0KQogICAgYXNzZXJ0IGVudW0ucmVzcG9uZF90 bz8oOnN1Y2MpCiMgICAgYXNzZXJ0IGVudW0ucmVzcG9uZF90bz8oOnJld2luZCkKICBlbmQK CiAgZGVmIHRlc3RfbmV3CiAgICBidWYgPSBTdHJpbmdJTy5uZXcoJycsICd3JykKICAgIG9y aWcsICRzdGRlcnIgPSAkc3RkZXJyLCBidWYKCiAgICBlbnVtID0gUHJpbWUubmV3CiAgICBh c3NlcnQgIWJ1Zi5zdHJpbmcuZW1wdHk/CiAgICAkc3RkZXJyID0gb3JpZwoKICAgIGFzc2Vy dCBlbnVtLnJlc3BvbmRfdG8/KDplYWNoKQogICAgYXNzZXJ0IGVudW0ua2luZF9vZj8oRW51 bWVyYWJsZSkKICAgIGFzc2VydCBlbnVtLnJlc3BvbmRfdG8/KDpzdWNjKQoKICAgIGFzc2Vy dCBQcmltZSA9PT0gZW51bQogIGVuc3VyZQogICAgJHN0ZGVyciA9IG9yaWcKICBlbmQKCiAg ZGVmIHRlc3RfZW51bWVyYXRvcl9zdWNjCiAgICBlbnVtID0gUHJpbWUuZWFjaAogICAgYXNz ZXJ0X2VxdWFsIFBSSU1FU1swLCA1MF0sIDUwLnRpbWVzLm1hcHsgZW51bS5zdWNjIH0KICAg IGFzc2VydF9lcXVhbCBQUklNRVNbNTAsIDUwXSwgNTAudGltZXMubWFweyBlbnVtLnN1Y2Mg fQogICAgZW51bS5yZXdpbmQKICAgIGFzc2VydF9lcXVhbCBQUklNRVNbMCwgMTAwXSwgMTAw LnRpbWVzLm1hcHsgZW51bS5zdWNjIH0KICBlbmQKCiAgZGVmIHRlc3RfZW51bWVyYXRvcl93 aXRoX2luZGV4CiAgICBlbnVtID0gUHJpbWUuZWFjaAogICAgbGFzdCA9IC0xCiAgICBlbnVt LndpdGhfaW5kZXggZG8gfHAsaXwKICAgICAgYnJlYWsgaWYgaSA+PSAxMDAKICAgICAgYXNz ZXJ0X2VxdWFsIGxhc3QrMSwgaQogICAgICBhc3NlcnRfZXF1YWwgUFJJTUVTW2ldLCBwCiAg ICAgIGxhc3QgPSBpCiAgICBlbmQKICBlbmQKCiAgY2xhc3MgVGVzdEludGVnZXIgPCBUZXN0 OjpVbml0OjpUZXN0Q2FzZQogICAgZGVmIHRlc3RfcHJpbWVfZGl2aXNpb24KICAgICAgcGQg PSBQUklNRVMuaW5qZWN0KCY6KikucHJpbWVfZGl2aXNpb24KICAgICAgYXNzZXJ0X2VxdWFs IFBSSU1FUy5tYXB7fHB8IFtwLCAxXX0sIHBkCiAgICBlbmQKCiAgICBkZWYgdGVzdF9mcm9t X3ByaW1lX2RpdmlzaW9uCiAgICAgIGFzc2VydF9lcXVhbCBQUklNRVMuaW5qZWN0KCY6Kiks IEludGVnZXIuZnJvbV9wcmltZV9kaXZpc2lvbihQUklNRVMubWFwe3xwfCBbcCwxXX0pCiAg ICBlbmQKCiAgICBkZWYgdGVzdF9wcmltZT8KICAgICAgYXNzZXJ0IDIucHJpbWU/CiAgICAg IGFzc2VydCAzLnByaW1lPwogICAgICBhc3NlcnQgKDIqKjMxLTEpLnByaW1lPwogICAgICBh c3NlcnQgISgyKiozMi0xKS5wcmltZT8KICAgICAgYXNzZXJ0ICEoKDIqKjEzLTEpICogKDIq KjE3LTEpKS5wcmltZT8KICAgIGVuZAogIGVuZAplbmQK --------------000908060809060302070306--