From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Mikael Djurfeldt Newsgroups: gmane.lisp.guile.devel Subject: Re: GNU Guile 2.9.1 Released [beta] Date: Thu, 11 Oct 2018 00:49:36 +0200 Message-ID: References: <87y3b62lni.fsf@pobox.com> Reply-To: mikael@djurfeldt.com NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="000000000000053e740577e7ac19" X-Trace: blaine.gmane.org 1539211677 17466 195.159.176.226 (10 Oct 2018 22:47:57 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Wed, 10 Oct 2018 22:47:57 +0000 (UTC) Cc: guile-users@gnu.org, guile-devel To: Andy Wingo Original-X-From: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Thu Oct 11 00:47:52 2018 Return-path: Envelope-to: guile-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gANGi-0004QF-DQ for guile-devel@m.gmane.org; Thu, 11 Oct 2018 00:47:52 +0200 Original-Received: from localhost ([::1]:59480 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gANIo-000098-Ky for guile-devel@m.gmane.org; Wed, 10 Oct 2018 18:50:02 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:41628) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gANIi-000092-L5 for guile-devel@gnu.org; Wed, 10 Oct 2018 18:49:58 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gANIe-0000YY-F4 for guile-devel@gnu.org; Wed, 10 Oct 2018 18:49:56 -0400 Original-Received: from mail-oi1-f180.google.com ([209.85.167.180]:35766) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1gANIe-0000YB-3b for guile-devel@gnu.org; Wed, 10 Oct 2018 18:49:52 -0400 Original-Received: by mail-oi1-f180.google.com with SMTP id 22-v6so5493418oiz.2; Wed, 10 Oct 2018 15:49:51 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:reply-to :from:date:message-id:subject:to:cc; bh=z1lQ6rbg92/FiNCtqNRJlcnf5xXuwkIwywPHm60999I=; b=Blgf1VZNz/SRicUWE1OpvEJPa8GGrSortO0tY4bEwmBoLVKC0c3XTCHkMq9fyk0S3O N2VIxGnGwo+Nagtgej7T8eGih8tzFU2NVzWOxdXdu+yK3o0qDJYr9gYYOlaMDh6RJelb ZybPtGash1Ta+RsbHCRnZop1OHNyzf9XTR7MZLoR6ojyKDjpbITVRdTd4trD9UCJ6NsR Mxo/6wUyWwB+N8MfmEj2+EptHiiIpKc1OhlEYnZVYx5oPZRcmTt1VM2/fpN5T/6AAwtT Ygc18JFfzPA3sGlG6wOLsi1e2I69q26eJOhaeErVoyhaF+Pvz+otjGkO/l82ekdh1HNV KB4A== X-Gm-Message-State: ABuFfojqMODFEPSarVUmM7VXotkwqvcGKuhgGl1wqMrlMVyA6IdHMAo7 F0n4Z9W9nQcsFUaVRDmTJhF99Q2qnisjCaqAsLE= X-Google-Smtp-Source: ACcGV60MpZ62Iapx/qgSQcAPiXtbHr3I/zYbEJCCT01zXweSHCJ+9q8XpzpaLX17EXLXBXiw7LXL5kFjK0qT5kztlFA= X-Received: by 2002:aca:da56:: with SMTP id r83-v6mr2899666oig.271.1539211790691; Wed, 10 Oct 2018 15:49:50 -0700 (PDT) In-Reply-To: <87y3b62lni.fsf@pobox.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.167.180 X-BeenThere: guile-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Developers list for Guile, the GNU extensibility library" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Original-Sender: "guile-devel" Xref: news.gmane.org gmane.lisp.guile.devel:19670 Archived-At: --000000000000053e740577e7ac19 Content-Type: multipart/alternative; boundary="000000000000053e700577e7ac17" --000000000000053e700577e7ac17 Content-Type: text/plain; charset="UTF-8" Congratulations to fantastic work! I wonder if your evaluator speed estimates aren't too humble? With this email, I attach scheme and python versions of a (maybe buggy---just wrote it) algorithm for finding Ramanujan numbers. It's essentially the same algorithm for both languages, although Scheme invites you to write in a more functional style (which involves more function calls, which shouldn't give Guile any advantage over Python performance wise). I did the following 5 times and took the median of the real time used: time guile -l ramanujan.scm -c '(ramanujan 20)' time python3 -c 'from ramanujan import *; ramanujan(20)' Results (s): guile-1.8: 7.03 guile-2.9.1: 0.91 python-3.5.3: 3.78 Best regards, Mikael D. On Wed, Oct 10, 2018 at 11:32 AM Andy Wingo wrote: > We are pleased to announce GNU Guile release 2.9.1. This is the first > pre-release of what will eventually become the 3.0 release series. > > Compared to the current stable series (2.2.x), Guile 2.9.1 adds support > for just-in-time native code generation, speeding up all Guile programs. > See the NEWS extract at the end of the mail for full details. > > We encourage you to test this release and provide feedback to > guile-devel@gnu.org, and to file bugs by sending mail to > bug-guile@gnu.org. > > The Guile web page is located at http://gnu.org/software/guile/, and > among other things, it contains a copy of the Guile manual and pointers > to more resources. > > Guile is an implementation of the Scheme programming language, with > support for many SRFIs, packaged for use in a wide variety of > environments. In addition to implementing the R5RS Scheme standard, > Guile includes a module system, full access to POSIX system calls, > networking support, multiple threads, dynamic linking, a foreign > function call interface, and powerful string processing. > > Guile can run interactively, as a script interpreter, and as a Scheme > compiler to VM bytecode. It is also packaged as a library so that > applications can easily incorporate a complete Scheme interpreter/VM. > An application can use Guile as an extension language, a clean and > powerful configuration language, or as multi-purpose "glue" to connect > primitives provided by the application. It is easy to call Scheme code > From C code and vice versa. Applications can add new functions, data > types, control structures, and even syntax to Guile, to create a > domain-specific language tailored to the task at hand. > > Guile 2.9.1 can be installed in parallel with Guile 2.2.x; see > > http://www.gnu.org/software/guile/manual/html_node/Parallel-Installations.html > . > > A more detailed NEWS summary follows these details on how to get the > Guile sources. > > Here are the compressed sources: > http://alpha.gnu.org/gnu/guile/guile-2.9.1.tar.lz (10.3MB) > http://alpha.gnu.org/gnu/guile/guile-2.9.1.tar.xz (12.3MB) > http://alpha.gnu.org/gnu/guile/guile-2.9.1.tar.gz (20.8MB) > > Here are the GPG detached signatures[*]: > http://alpha.gnu.org/gnu/guile/guile-2.9.1.tar.lz.sig > http://alpha.gnu.org/gnu/guile/guile-2.9.1.tar.xz.sig > http://alpha.gnu.org/gnu/guile/guile-2.9.1.tar.gz.sig > > Use a mirror for higher download bandwidth: > http://www.gnu.org/order/ftp.html > > Here are the SHA256 checksums: > > 9e1dc7ed34a5581e47dafb920276fbb12c9c318ba432d19cb970c01aa1ab3a09 > guile-2.9.1.tar.gz > f24e6778e3e45ea0691b591ad7e74fdd0040689915b09ae0e52bd2a80f8e2b33 > guile-2.9.1.tar.lz > 01be24335d4208af3bbd0d3354d3bb66545f157959bb0c5a7cbb1a8bfd486a45 > guile-2.9.1.tar.xz > > [*] Use a .sig file to verify that the corresponding file (without the > .sig suffix) is intact. First, be sure to download both the .sig file > and the corresponding tarball. Then, run a command like this: > > gpg --verify guile-2.9.1.tar.gz.sig > > If that command fails because you don't have the required public key, > then run this command to import it: > > gpg --keyserver keys.gnupg.net --recv-keys > 4FD4D288D445934E0A14F9A5A8803732E4436885 > > and rerun the 'gpg --verify' command. > > This release was bootstrapped with the following tools: > Autoconf 2.69 > Automake 1.16.1 > Libtool 2.4.6 > Gnulib v0.1-1157-gb03f418 > Makeinfo 6.5 > > > Changes in alpha 2.9.1 (since the stable 2.2 series): > > * Notable changes > > ** Just-in-time code generation > > Guile programs now run up to 4 times faster, relative to Guile 2.2, > thanks to just-in-time (JIT) native code generation. Notably, this > brings the performance of "eval" as written in Scheme back to the level > of "eval" written in C, as in the days of Guile 1.8. > > See "Just-In-Time Native Code" in the manual, for more information. JIT > compilation will be enabled automatically and transparently. To disable > JIT compilation, configure Guile with `--enable-jit=no' or > `--disable-jit'. The default is `--enable-jit=auto', which enables the > JIT if it is available. See `./configure --help' for more. > > In this release, JIT compilation is enabled only on x86-64. In future > prereleases support will be added for all architectures supported by GNU > lightning. Intrepid users on other platforms can try passing > `--enable-jit=yes' to see the state of JIT on their platform. > > ** Lower-level bytecode > > Relative to the virtual machine in Guile 2.2, Guile's VM instruction set > is now more low-level. This allows it to express more advanced > optimizations, for example type check elision or integer > devirtualization, and makes the task of JIT code generation easier. > > Note that this change can mean that for a given function, the > corresponding number of instructions in Guile 3.0 may be higher than > Guile 2.2, which can lead to slowdowns when the function is interpreted. > We hope that JIT compilation more than makes up for this slight > slowdown. > > ** By default, GOOPS classes are not redefinable > > It used to be that all GOOPS classes were redefinable, at least in > theory. This facility was supported by an indirection in all "struct" > instances, even though only a subset of structs would need redefinition. > We wanted to remove this indirection, in order to speed up Guile > records, allow immutable Guile records to eventually be described by > classes, and allow for some optimizations in core GOOPS classes that > shouldn't be redefined anyway. > > Thus in GOOPS now there are classes that are redefinable and classes > that aren't. By default, classes created with GOOPS are not > redefinable. To make a class redefinable, it should be an instance of > `'. See "Redefining a Class" in the manual for more > information. > > * New deprecations > > ** scm_t_uint8, etc deprecated in favor of C99 stdint.h > > It used to be that Guile defined its own `scm_t_uint8' because C99 > `uint8_t' wasn't widely enough available. Now Guile finally made the > change to use C99 types, both internally and in Guile's public headers. > > Note that this also applies to SCM_T_UINT8_MAX, SCM_T_INT8_MIN, for intN > and uintN for N in 8, 16, 32, and 64. Guile also now uses ptrdiff_t > instead of scm_t_ptrdiff, and similarly for intmax_t, uintmax_t, > intptr_t, and uintptr_t. > > * Incompatible changes > > ** All deprecated code removed > > All code deprecated in Guile 2.2 has been removed. See older NEWS, and > check that your programs can compile without linker warnings and run > without runtime warnings. See "Deprecation" in the manual. > > In particular, the function `scm_generalized_vector_get_handle' which > was deprecated in 2.0.9 but remained in 2.2, has now finally been > removed. As a replacement, use `scm_array_get_handle' to get a handle > and `scm_array_handle_rank' to check the rank. > > ** Remove "self" field from vtables and "redefined" field from classes > > These fields were used as part of the machinery for class redefinition > and is no longer needed. > > ** VM hook manipulation simplified > > The low-level mechanism to instrument a running virtual machine for > debugging and tracing has been simplified. See "VM Hooks" in the > manual, for more. > > * Changes to the distribution > > ** New effective version > > The "effective version" of Guile is now 3.0, which allows parallel > installation with other effective versions (for example, the older Guile > 2.2). See "Parallel Installations" in the manual for full details. > Notably, the `pkg-config' file is now `guile-3.0'. > --000000000000053e700577e7ac17 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Congratulation= s to fantastic work!

I wonder if your evaluator speed estimate= s aren't too humble?

With this email, I attach scheme and python= versions of a (maybe buggy---just wrote it) algorithm for finding Ramanuja= n numbers. It's essentially the same algorithm for both languages, alth= ough Scheme invites you to write in a more functional style (which involves= more function calls, which shouldn't give Guile any advantage over Pyt= hon performance wise).

I did the following 5 times and took th= e median of the real time used:

time guile -l ramanujan.scm -c '= (ramanujan 20)'
time python3 -c 'from ramanujan import *; ramanu= jan(20)'

Results (s):

guile-1.8: 7.= 03
guile-2.9.1: 0.91
python-3.5.3: 3.78

=
Best regards,
Mikael D.

<= div class=3D"gmail_quote">
On Wed, Oct 10, 2018 at 11:32 AM= Andy Wingo <wingo@pobox.com> = wrote:
We are pleased to announce G= NU Guile release 2.9.1.=C2=A0 This is the first
pre-release of what will eventually become the 3.0 release series.

Compared to the current stable series (2.2.x), Guile 2.9.1 adds support
for just-in-time native code generation, speeding up all Guile programs. See the NEWS extract at the end of the mail for full details.

We encourage you to test this release and provide feedback to
guile-devel@gnu.or= g, and to file bugs by sending mail to
bug-guile@gnu.org.

The Guile web page is located at
http://gnu.org/software/guile/, a= nd
among other things, it contains a copy of the Guile manual and pointers
to more resources.

Guile is an implementation of the Scheme programming language, with
support for many SRFIs, packaged for use in a wide variety of
environments.=C2=A0 In addition to implementing the R5RS Scheme standard, Guile includes a module system, full access to POSIX system calls,
networking support, multiple threads, dynamic linking, a foreign
function call interface, and powerful string processing.

Guile can run interactively, as a script interpreter, and as a Scheme
compiler to VM bytecode.=C2=A0 It is also packaged as a library so that
applications can easily incorporate a complete Scheme interpreter/VM.
An application can use Guile as an extension language, a clean and
powerful configuration language, or as multi-purpose "glue" to co= nnect
primitives provided by the application.=C2=A0 It is easy to call Scheme cod= e
>From C code and vice versa.=C2=A0 Applications can add new functions, data<= br> types, control structures, and even syntax to Guile, to create a
domain-specific language tailored to the task at hand.

Guile 2.9.1 can be installed in parallel with Guile 2.2.x; see
http://www.gnu.org/sof= tware/guile/manual/html_node/Parallel-Installations.html.

A more detailed NEWS summary follows these details on how to get the
Guile sources.

Here are the compressed sources:
=C2=A0 http://alpha.gnu.org/gnu/guile/guile-2.9.1.t= ar.lz=C2=A0 =C2=A0(10.3MB)
=C2=A0 http://alpha.gnu.org/gnu/guile/guile-2.9.1.t= ar.xz=C2=A0 =C2=A0(12.3MB)
=C2=A0 http://alpha.gnu.org/gnu/guile/guile-2.9.1.t= ar.gz=C2=A0 =C2=A0(20.8MB)

Here are the GPG detached signatures[*]:
=C2=A0 http://alpha.gnu.org/gnu/guile/guile-2.9= .1.tar.lz.sig
=C2=A0 http://alpha.gnu.org/gnu/guile/guile-2.9= .1.tar.xz.sig
=C2=A0 http://alpha.gnu.org/gnu/guile/guile-2.9= .1.tar.gz.sig

Use a mirror for higher download bandwidth:
=C2=A0 http://www.gnu.org/order/ftp.html

Here are the SHA256 checksums:

=C2=A0 9e1dc7ed34a5581e47dafb920276fbb12c9c318ba432d19cb970c01aa1ab3a09=C2= =A0 guile-2.9.1.tar.gz
=C2=A0 f24e6778e3e45ea0691b591ad7e74fdd0040689915b09ae0e52bd2a80f8e2b33=C2= =A0 guile-2.9.1.tar.lz
=C2=A0 01be24335d4208af3bbd0d3354d3bb66545f157959bb0c5a7cbb1a8bfd486a45=C2= =A0 guile-2.9.1.tar.xz

[*] Use a .sig file to verify that the corresponding file (without the
.sig suffix) is intact.=C2=A0 First, be sure to download both the .sig file=
and the corresponding tarball.=C2=A0 Then, run a command like this:

=C2=A0 gpg --verify guile-2.9.1.tar.gz.sig

If that command fails because you don't have the required public key, then run this command to import it:

=C2=A0 gpg --keyserver keys.gnupg.net --recv-keys 4FD4D288D445934E0A14F9A5A= 8803732E4436885

and rerun the 'gpg --verify' command.

This release was bootstrapped with the following tools:
=C2=A0 Autoconf 2.69
=C2=A0 Automake 1.16.1
=C2=A0 Libtool 2.4.6
=C2=A0 Gnulib v0.1-1157-gb03f418
=C2=A0 Makeinfo 6.5


Changes in alpha 2.9.1 (since the stable 2.2 series):

* Notable changes

** Just-in-time code generation

Guile programs now run up to 4 times faster, relative to Guile 2.2,
thanks to just-in-time (JIT) native code generation.=C2=A0 Notably, this brings the performance of "eval" as written in Scheme back to the= level
of "eval" written in C, as in the days of Guile 1.8.

See "Just-In-Time Native Code" in the manual, for more informatio= n.=C2=A0 JIT
compilation will be enabled automatically and transparently.=C2=A0 To disab= le
JIT compilation, configure Guile with `--enable-jit=3Dno' or
`--disable-jit'.=C2=A0 The default is `--enable-jit=3Dauto', which = enables the
JIT if it is available.=C2=A0 See `./configure --help' for more.

In this release, JIT compilation is enabled only on x86-64.=C2=A0 In future=
prereleases support will be added for all architectures supported by GNU lightning.=C2=A0 Intrepid users on other platforms can try passing
`--enable-jit=3Dyes' to see the state of JIT on their platform.

** Lower-level bytecode

Relative to the virtual machine in Guile 2.2, Guile's VM instruction se= t
is now more low-level.=C2=A0 This allows it to express more advanced
optimizations, for example type check elision or integer
devirtualization, and makes the task of JIT code generation easier.

Note that this change can mean that for a given function, the
corresponding number of instructions in Guile 3.0 may be higher than
Guile 2.2, which can lead to slowdowns when the function is interpreted. We hope that JIT compilation more than makes up for this slight
slowdown.

** By default, GOOPS classes are not redefinable

It used to be that all GOOPS classes were redefinable, at least in
theory.=C2=A0 This facility was supported by an indirection in all "st= ruct"
instances, even though only a subset of structs would need redefinition. We wanted to remove this indirection, in order to speed up Guile
records, allow immutable Guile records to eventually be described by
classes, and allow for some optimizations in core GOOPS classes that
shouldn't be redefined anyway.

Thus in GOOPS now there are classes that are redefinable and classes
that aren't.=C2=A0 By default, classes created with GOOPS are not
redefinable.=C2=A0 To make a class redefinable, it should be an instance of=
`<redefinable-class>'.=C2=A0 See "Redefining a Class" i= n the manual for more
information.

* New deprecations

** scm_t_uint8, etc deprecated in favor of C99 stdint.h

It used to be that Guile defined its own `scm_t_uint8' because C99
`uint8_t' wasn't widely enough available.=C2=A0 Now Guile finally m= ade the
change to use C99 types, both internally and in Guile's public headers.=

Note that this also applies to SCM_T_UINT8_MAX, SCM_T_INT8_MIN, for intN and uintN for N in 8, 16, 32, and 64.=C2=A0 Guile also now uses ptrdiff_t instead of scm_t_ptrdiff, and similarly for intmax_t, uintmax_t,
intptr_t, and uintptr_t.

* Incompatible changes

** All deprecated code removed

All code deprecated in Guile 2.2 has been removed.=C2=A0 See older NEWS, an= d
check that your programs can compile without linker warnings and run
without runtime warnings.=C2=A0 See "Deprecation" in the manual.<= br>
In particular, the function `scm_generalized_vector_get_handle' which was deprecated in 2.0.9 but remained in 2.2, has now finally been
removed. As a replacement, use `scm_array_get_handle' to get a handle and `scm_array_handle_rank' to check the rank.

** Remove "self" field from vtables and "redefined" fie= ld from classes

These fields were used as part of the machinery for class redefinition
and is no longer needed.

** VM hook manipulation simplified

The low-level mechanism to instrument a running virtual machine for
debugging and tracing has been simplified.=C2=A0 See "VM Hooks" i= n the
manual, for more.

* Changes to the distribution

** New effective version

The "effective version" of Guile is now 3.0, which allows paralle= l
installation with other effective versions (for example, the older Guile 2.2).=C2=A0 See "Parallel Installations" in the manual for full d= etails.
Notably, the `pkg-config' file is now `guile-3.0'.
--000000000000053e700577e7ac17-- --000000000000053e740577e7ac19 Content-Type: text/x-scheme; charset="US-ASCII"; name="ramanujan.scm" Content-Disposition: attachment; filename="ramanujan.scm" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_jn3qk5oa0 Ozs7OyByYW1hbnVqYW4uc2NtIC0tIENvbXB1dGUgdGhlIE46dGggUmFtYW51amFuIG51bWJlcgo7 Ozs7Cjs7OzsgQ29weXJpZ2h0IChDKSAyMDE4IE1pa2FlbCBEanVyZmVsZHQKOzs7Owo7Ozs7IFRo aXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv b3IgbW9kaWZ5Cjs7OzsgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKOzs7OyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCjs7OzsgYW55IGxhdGVy IHZlcnNpb24uCjs7OzsgCjs7OzsgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCjs7OzsgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKOzs7OyBNRVJDSEFOVEFCSUxJ VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCjs7OzsgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KOzs7OyAKOzs7OyBZb3Ug c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZQo7Ozs7IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93 d3cuZ251Lm9yZy9saWNlbnNlcy8+Lgo7Ozs7CgwKCihkZWZpbmUgKHJhbWFudWphbiBuKQogICJS ZXR1cm4gdGhlIE46dGggUmFtYW51amFuIG51bWJlciAoc3VtIG9mIHR3byBjdWJlcyBpbiBtb3Jl IHRoYW4gb25lIHdheSkiCiAgCiAgKGRlZmluZSAocmFtYW51amFuPyB3IGIwKQogICAgOzsgSXMg dyBhIFJhbWFudWphbiBudW1iZXI/CiAgICAobGV0IGxvb3AgKChhIDEpIChiIGIwKSAoY291bnQg MCkpCiAgICAgIChvciAoPiBjb3VudCAxKQoJICAoYW5kICg8PSBhIGIpCgkgICAgICAgKGxldCAo KHMgKCsgKCogYSBhIGEpICgqIGIgYiBiKSkpKQoJCSAoY29uZCAoKDwgcyB3KSAobG9vcCAoKyAx IGEpIGIgY291bnQpKSA7IHRvbyBzbWFsbCA9PiBpbmMgYQoJCSAgICAgICAoKD4gcyB3KSAobG9v cCBhICgtIGIgMSkgY291bnQpKSA7IHRvbyBsYXJnZSA9PiBkZWMgYgoJCSAgICAgICAoZWxzZSAo bG9vcCBhICgtIGIgMSkgKCsgMSBjb3VudCkpKSkpKSkpKSA7IGZvdW5kIGEgc3VtIQogIAogIChk ZWZpbmUgKGl0ZXIgdyBiMCBuKQogICAgOzsgdyBpcyBhIFJhbWFudWphbiBjYW5kaWRhdGUKICAg IDs7IGIwIGlzIHRoZSBmaXJzdCBzZWNvbmQgdGVybSB0byB0cnkKICAgIDs7IG4gaXMgdGhlIG51 bWJlciBvZiBSYW1hbnVqYW4gbnVtYmVyIHN0aWxsIHRvIGZpbmQKCiAgICA7OyBXZSBmaXJzdCBp bmNyZWFzZSBiMCB1bnRpbCAxICsgYjBeMyA+IHcKICAgIChsZXQgKChiMCAobGV0IGxvb3AgKChi IGIwKSkKCQkoaWYgKD49ICgrIDEgKCogYiBiIGIpKSB3KQoJCSAgICBiCgkJICAgIChsb29wICgr IDEgYikpKSkpKQogICAgICAKICAgICAgKGNvbmQgKCh6ZXJvPyBuKSAoLSB3IDEpKSA7IGZvdW5k IHRoZSBsYXN0IG51bWJlciEKCSAgICAoKHJhbWFudWphbj8gdyBiMCkgKGl0ZXIgKCsgMSB3KSBi MCAoLSBuIDEpKSkKCSAgICAoZWxzZSAoaXRlciAoKyAxIHcpIGIwIG4pKSkpKSA7IHRyeSBuZXh0 IGNhbmRpZGF0ZQogIAogIChpdGVyIDIgMSBuKSkK --000000000000053e740577e7ac19 Content-Type: text/x-python; charset="US-ASCII"; name="ramanujan.py" Content-Disposition: attachment; filename="ramanujan.py" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_jn3qkh4c1 IyEvdXNyL2Jpbi9weXRob24zCgojICByYW1hbnVqYW4ucHkgLS0gQ29tcHV0ZSB0aGUgTjp0aCBS YW1hbnVqYW4gbnVtYmVyCiMgIAojICBDb3B5cmlnaHQgKEMpIDIwMTggTWlrYWVsIERqdXJmZWxk dAojCiMgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0 ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgIHRoZSBGcmVlIFNvZnR3YXJlIEZv dW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCiMgIChhdCB5b3Vy IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1 dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgIGJ1dCBXSVRIT1VUIEFO WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgIE1FUkNI QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUK IyAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojICBZb3Ug c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZQojICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3 LmdudS5vcmcvbGljZW5zZXMvPi4KIwoKIyByZXR1cm4gdGhlIE46dGggUmFtYW51amFuIG51bWJl ciAoc3VtIG9mIHR3byBjdWJlcyBpbiBtb3JlIHRoYW4gb25lIHdheSkKIwpkZWYgcmFtYW51amFu IChuKToKICAgIHcgPSAwICMgUmFtYW51amFuIG51bWJlciBjYW5kaWRhdGUKICAgIGIwID0gMSAj IGZpcnN0IHNlY29uZCB0ZXJtIHRvIHRyeQogICAgd2hpbGUgbiA+IDA6CiAgICAgICAgdyArPSAx ICMgdHJ5IG5leHQgY2FuZGlkYXRlCgogICAgICAgICMgaW5jcmVhc2UgaW5pdGlhbCBiMCB1bnRp bCAxICsgYjBeMyA+IHcKICAgICAgICB3aGlsZSAxICsgYjAgKiBiMCAqIGIwIDwgdzoKICAgICAg ICAgICAgYjAgKz0gMQogICAgICAgICAgICAKICAgICAgICBhID0gMQogICAgICAgIGIgPSBiMAog ICAgICAgIGNvdW50ID0gMCAjIG51bWJlciBvZiB3YXlzIHRvIHdyaXRlIHcKICAgICAgICB3aGls ZSBhIDw9IGI6CiAgICAgICAgICAgIHMgPSBhICogYSAqIGEgKyBiICogYiAqIGIKICAgICAgICAg ICAgaWYgcyA8IHc6CiAgICAgICAgICAgICAgICBhICs9IDEgIyBpZiBzdW0gaXMgdG9vIHNtYWxs LCBpbmNyZWFzZSBhCiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBlbGlmIHMg PT0gdzoKICAgICAgICAgICAgICAgIGNvdW50ICs9IDEgIyBmb3VuZCBhIHN1bSEKICAgICAgICAg ICAgICAgIGlmIGNvdW50ID4gMToKICAgICAgICAgICAgICAgICAgICBuIC09IDEKICAgICAgICAg ICAgICAgICAgICBicmVhawogICAgICAgICAgICBiIC09IDEgIyBpbmNyZWFzZSBiIGJvdGggaWYg c3VtIHRvbyBsYXJnZSBhbmQgdG8gZmluZCBuZXh0IHdheSB0byB3cml0ZSB3CiAgICByZXR1cm4g dwo= --000000000000053e740577e7ac19--