pax_global_header00006660000000000000000000000064147442134360014522gustar00rootroot0000000000000052 comment=5766200075e6090fc7c0b752f08f6c3ffc06822a eclib-20250122/000077500000000000000000000000001474421343600130375ustar00rootroot00000000000000eclib-20250122/.github/000077500000000000000000000000001474421343600143775ustar00rootroot00000000000000eclib-20250122/.github/workflows/000077500000000000000000000000001474421343600164345ustar00rootroot00000000000000eclib-20250122/.github/workflows/c-cpp.yml000066400000000000000000000011341474421343600201600ustar00rootroot00000000000000name: C/C++ CI on: push: branches: [ master ] pull_request: branches: [ master ] jobs: build: runs-on: ubuntu-latest strategy: matrix: cc: [gcc, clang] mpfp: [enable-mpfp] steps: - uses: actions/checkout@v4 - name: configure run: | sudo apt-get install libpari-dev pari-gp2c libntl-dev libflint-dev ./autogen.sh ./configure --with-boost="no" --with-flint --disable-allprogs --${{ matrix.mpfp }} env: CC: ${{ matrix.cc }} - name: make run: make - name: make check run: make check eclib-20250122/.github/workflows/conda-c-cpp.yml000066400000000000000000000016401474421343600212440ustar00rootroot00000000000000name: conda C/C++ CI on: push: branches: [ master ] pull_request: branches: [ master ] jobs: build: name: ${{ matrix.os }} with ${{ matrix.mpfp }} runs-on: ${{ matrix.os }} strategy: matrix: os: ["macos-latest"] mpfp: [enable-mpfp] steps: - uses: actions/checkout@v4 - uses: conda-incubator/setup-miniconda@v2 with: miniforge-version: latest mamba-version: "*" activate-environment: eclib-deps - name: configure shell: bash -el {0} run: | mamba install pari ntl libflint compilers automake autoconf m4 libtool conda activate eclib-deps echo PATH=$PATH ./autogen.sh ./configure --with-boost="no" --with-flint --disable-allprogs --${{ matrix.mpfp }} - name: make shell: bash -el {0} run: make - name: make check shell: bash -el {0} run: make check eclib-20250122/.gitignore000066400000000000000000000034421474421343600150320ustar00rootroot00000000000000# use glob syntax. syntax: glob *~ *.old configure Makefile Makefile.in eclib.pc */Makefile */Makefile.in autom4te.cache ar-lib compile m4/* !m4/ax_* libsrc/Makefile.jc */.deps */.libs */*.o */*.lo */*.la bin/* include/* lib/* share/* newforms progs/newforms progs/smallnf progs/curves tests/newforms tests/smallnf eclib*.tar.gz eclib*.tar.bz2 aclocal.m4 config.guess config.sub config.log config.status depcomp install-sh ltmain.sh missing libtool *.testout # Mac cache files .DS_Store # Temporary swap files .*.swp # Program executables progs/aplist progs/checkap progs/cubics progs/ecnf progs/h1bsd progs/h1bsdcurisog progs/h1clist progs/h1curve progs/h1first progs/indep_test progs/list_cubics progs/moreap progs/mwrank progs/nfcount progs/nfhpcurve progs/nfhpcurve_prof progs/nfhpmcurve progs/pcurve progs/point_search progs/qexp progs/quartic_points progs/reduce_cubics progs/reduce_quartics progs/solve_conic progs/solve_legendre tests/allisog tests/bigrattest tests/checkgens tests/comptest tests/conductor tests/d2 tests/hecketest tests/homtest tests/mattest1 tests/mattest2 tests/mattest3 tests/mhcount tests/mmattest tests/modtest tests/mptest tests/mspace tests/mvectest tests/nftest tests/oftest tests/ptest tests/rattest tests/smattest1 tests/smattest2 tests/smattest3 tests/space1 tests/space2 tests/space3 tests/svectest1 tests/svectest2 tests/svectest3 tests/tate tests/tbessel tests/tcon2 tests/tcurve tests/tdivpol tests/tegr tests/telog tests/tequiv tests/theight tests/thilbert tests/threading tests/thtconst tests/tilll tests/timing tests/tlegcert tests/tlatconst tests/tmanin tests/tmanin_prof tests/tmrank tests/tnfd tests/torsion tests/tp2points tests/tperiods tests/tpoints tests/tsatbnd tests/tsat tests/tsat2 tests/tsat3 tests/tversion tests/twist tests/vectest1 tests/vectest2 tests/vectest3 eclib-20250122/.hgignore000066400000000000000000000005351474421343600146450ustar00rootroot00000000000000# use glob syntax. syntax: glob *~ *.old configure Makefile Makefile.in */Makefile */Makefile.in autom4te.cache m4 libsrc/Makefile.jc */.deps */.libs */*.o */*.lo */*.la bin/* include/* lib/* share/* newforms/* tests/Makefile.jc eclib*.tar.gz aclocal.m4 config.guess config.sub config.log config.status depcomp install-sh ltmain.sh missing libtool eclib-20250122/.travis.yml000066400000000000000000000025601474421343600151530ustar00rootroot00000000000000language: generic os: - osx - linux osx_image: xcode9.4 dist: xenial env: - CONFIGURE_OPTS="" - CONFIGURE_OPTS="--disable-mpfp" install: - | MINICONDA_URL="https://repo.continuum.io/miniconda" if [[ "${TRAVIS_OS_NAME}" == "osx" ]]; then MINICONDA_FILE="Miniconda3-latest-MacOSX-x86_64.sh" else MINICONDA_FILE="Miniconda3-latest-Linux-x86_64.sh" fi curl -L -O "${MINICONDA_URL}/${MINICONDA_FILE}" bash $MINICONDA_FILE -b source ~/miniconda3/bin/activate root conda config --add channels conda-forge conda config --set show_channel_urls true conda config --set always_yes yes - export PREFIX=$HOME/local - conda create --yes --quiet -p $PREFIX automake libtool gmp mpfr ntl libflint pari script: - export CPPFLAGS="-I$PREFIX/include $CPPFLAGS" - export LDFLAGS="-L$PREFIX/lib -Wl,-rpath,$PREFIX/lib $LDFLAGS" - if [[ "${TRAVIS_OS_NAME}" == "osx" ]]; then export CC=clang; export CXX=clang++; fi - chmod +x autogen.sh - ./autogen.sh - chmod +x configure - ./configure --prefix="$PREFIX" --with-ntl="$PREFIX" --with-pari="$PREFIX" --with-flint="$PREFIX" --with-boost="no" $CONFIGURE_OPTS - make - | if [[ "${TRAVIS_OS_NAME}" == "osx" ]]; then make check; else make check; fi eclib-20250122/AUTHORS000066400000000000000000000000461474421343600141070ustar00rootroot00000000000000John Cremona eclib-20250122/CITATION.cff000066400000000000000000000005161474421343600147330ustar00rootroot00000000000000cff-version: 1.2.0 message: "If you use this software, please cite it as below." authors: - family-names: "Cremona" given-names: "J E" orcid: "https://orcid.org/0000-0002-7212-0162" title: "eclib" version: 20241112 doi: "https://doi.org/10.5281/zenodo.593635" date-released: 2024-11-12 url: "https://github.com/JohnCremona/eclib" eclib-20250122/COPYING000066400000000000000000000432541474421343600141020ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. eclib-20250122/ChangeLog000066400000000000000000000000001474421343600145770ustar00rootroot00000000000000eclib-20250122/INSTALL000066400000000000000000000366261474421343600141050ustar00rootroot00000000000000Installation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2017, 2020-2021 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell command './configure && make && make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the 'README' file for instructions specific to this package. Some packages provide this 'INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The 'configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a 'Makefile' in each directory of the package. It may also create one or more '.h' files containing system-dependent definitions. Finally, it creates a shell script 'config.status' that you can run in the future to recreate the current configuration, and a file 'config.log' containing compiler output (useful mainly for debugging 'configure'). It can also use an optional file (typically called 'config.cache' and enabled with '--cache-file=config.cache' or simply '-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how 'configure' could check whether to do them, and mail diffs or instructions to the address given in the 'README' so they can be considered for the next release. If you are using the cache, and at some point 'config.cache' contains results you don't want to keep, you may remove or edit it. The file 'configure.ac' (or 'configure.in') is used to create 'configure' by a program called 'autoconf'. You need 'configure.ac' if you want to change it or regenerate 'configure' using a newer version of 'autoconf'. The simplest way to compile this package is: 1. 'cd' to the directory containing the package's source code and type './configure' to configure the package for your system. Running 'configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type 'make' to compile the package. 3. Optionally, type 'make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type 'make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the 'make install' phase executed with root privileges. 5. Optionally, type 'make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior 'make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing 'make clean'. To also remove the files that 'configure' created (so you can compile the package for a different kind of computer), type 'make distclean'. There is also a 'make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type 'make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide 'make distcheck', which can by used by developers to test that all other targets like 'make install' and 'make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the 'configure' script does not know about. Run './configure --help' for details on some of the pertinent environment variables. You can give 'configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU 'make'. 'cd' to the directory where you want the object files and executables to go and run the 'configure' script. 'configure' automatically checks for the source code in the directory that 'configure' is in and in '..'. This is known as a "VPATH" build. With a non-GNU 'make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use 'make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple '-arch' options to the compiler but only a single '-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the 'lipo' tool if you have problems. Installation Names ================== By default, 'make install' installs the package's commands under '/usr/local/bin', include files under '/usr/local/include', etc. You can specify an installation prefix other than '/usr/local' by giving 'configure' the option '--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option '--exec-prefix=PREFIX' to 'configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like '--bindir=DIR' to specify different values for particular kinds of files. Run 'configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of '${prefix}', so that specifying just '--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to 'configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the 'make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, 'make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of '${prefix}'. Any directories that were specified during 'configure', but not in terms of '${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the 'DESTDIR' variable. For example, 'make install DESTDIR=/alternate/directory' will prepend '/alternate/directory' before all installation names. The approach of 'DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of '${prefix}' at 'configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving 'configure' the option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'. Some packages pay attention to '--enable-FEATURE' options to 'configure', where FEATURE indicates an optional part of the package. They may also pay attention to '--with-PACKAGE' options, where PACKAGE is something like 'gnu-as' or 'x' (for the X Window System). The 'README' should mention any '--enable-' and '--with-' options that the package recognizes. For packages that use the X Window System, 'configure' can usually find the X include and library files automatically, but if it doesn't, you can use the 'configure' options '--x-includes=DIR' and '--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of 'make' will be. For these packages, running './configure --enable-silent-rules' sets the default to minimal output, which can be overridden with 'make V=1'; while running './configure --disable-silent-rules' sets the default to verbose, which can be overridden with 'make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX 'make' updates targets which have the same timestamps as their prerequisites, which makes it generally unusable when shipped generated files such as 'configure' are involved. Use GNU 'make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its '' header file. The option '-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put '/usr/ucb' early in your 'PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in '/usr/bin'. So, if you need '/usr/ucb' in your 'PATH', put it _after_ '/usr/bin'. On Haiku, software installed for all users goes in '/boot/common', not '/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features 'configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, 'configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the '--build=TYPE' option. TYPE can either be a short name for the system type, such as 'sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file 'config.sub' for the possible values of each field. If 'config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option '--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with '--host=TYPE'. Sharing Defaults ================ If you want to set default values for 'configure' scripts to share, you can create a site shell script called 'config.site' that gives default values for variables like 'CC', 'cache_file', and 'prefix'. 'configure' looks for 'PREFIX/share/config.site' if it exists, then 'PREFIX/etc/config.site' if it exists. Or, you can set the 'CONFIG_SITE' environment variable to the location of the site script. A warning: not all 'configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to 'configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the 'configure' command line, using 'VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified 'gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an Autoconf limitation. Until the limitation is lifted, you can use this workaround: CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash 'configure' Invocation ====================== 'configure' recognizes the following options to control how it operates. '--help' '-h' Print a summary of all of the options to 'configure', and exit. '--help=short' '--help=recursive' Print a summary of the options unique to this package's 'configure', and exit. The 'short' variant lists options used only in the top level, while the 'recursive' variant lists options also present in any nested packages. '--version' '-V' Print the version of Autoconf used to generate the 'configure' script, and exit. '--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally 'config.cache'. FILE defaults to '/dev/null' to disable caching. '--config-cache' '-C' Alias for '--cache-file=config.cache'. '--quiet' '--silent' '-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to '/dev/null' (any error messages will still be shown). '--srcdir=DIR' Look for the package's source code in directory DIR. Usually 'configure' can determine that directory automatically. '--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. '--no-create' '-n' Run the configure checks, but stop before creating any output files. 'configure' also accepts some other, not widely useful, options. Run 'configure --help' for more details. eclib-20250122/Makefile.am000066400000000000000000000002041474421343600150670ustar00rootroot00000000000000ACLOCAL_AMFLAGS = -I m4 SUBDIRS = libsrc tests progs doc man pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = eclib.pc eclib-20250122/NEWS000066400000000000000000000003601474421343600135350ustar00rootroot00000000000000News: this is the first version of eclib to (1) not use four separate directories for sources, and build four separate libraries; instead all the library sources are here (in ./libsrc) and the programs are in ./tests. (2) use autotools! eclib-20250122/README000066400000000000000000000065561474421343600137330ustar00rootroot00000000000000In addition to the generic installation instructions given in the INSTALL file, note the following. You can see all options to configure by typing ./configure --help. 1. DEPENDENCIES (a) Both NTL and PARI are required. If they have not been installed in a place where the system will find them automatically (such as /usr/local) then you will need to specify where they are when you configure, like this: ./configure --with-pari= --with-ntl= If you have Sage installed in SAGE_ROOT then you can use $SAGE_ROOT/local for both of these. Note that when you specify these locations, no check is done that a usable version exists in that place: it will be assumed that /include and /lib contain appropriate include files and libraries, and the build will fail if not. (b) FLINT is optional (from eclib-2013-01-01) and only used for one part of sparse matrix reduction, which is used in the modular symbol code but not mwrank or other elliptic curve programs. If a suitable FLINT version is found (which must be at least version 2.3, to contain the nmod_mat module) it will be used. If in addition you have the optional FLINT module hmod_mat (which does modular matrix operations using 32-bit data types) this can be activated by setting the environment valriable FLINT_LEVEL to 2 before running configure, or adding "FLINT_LEVEL=2" to the end of the configure invocation. Both of these have the effect of adding the compiler flag "-DFLINT_LEVEL=2$. The advantage of this is that the modular symbol code will require less RAM to run. (c) Boost is optional (from eclib-2013-09-00) and provides parallel capabilities in the form_finder class. Configure with --with-boost specifying location of a fully built version of Boost, i.e. not just the header files. After initial configure, if an error occurs, run autoreconf and configure again. Autotools will initiate the macros in m4/ directory and look for Boost.asio, Boost.thread, and Boost.system. Refer ti ./configure --help for more configuration options. 2. By default a lot of programs, including test programs, are built and will be installed by "make install". But if you configure with --disable-allprogs then the only program built will be mwrank. (The whole eclib library will always be built). 3. By default most of the real and complex floating point arithmetic is done using NTL's RR class and a complex class CC built on that. But if you configure with --disable-mpfp ("mpfp" = multi-precision floating point) then only standard C doubles and complexes will be used. This makes some code run much faster but of course the results are different. In future it is planned to refactor the code so that both standard and multi-precision functions are available simultaneously. 4. After running make, "make check" will build and run a lot of test programs (in the subdirectory tests) and check that they give the expected output (using test input files in tests/in and comparing with the expected outputs in tests/out). The test output (and in a few cases input) differs slightly if the --disable-mpfp is used. 5. "make install" will install header files, library files, and test program binaries in subdirectories include, lib, bin in /usr/local by default, so that you would need to run "make install" with superuser privileges). You can specify an alternative place either by adding --prefix= to the ./configure command line. eclib-20250122/README.md000066400000000000000000000004211474421343600143130ustar00rootroot00000000000000eclib ===== [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/JohnCremona/eclib/master?urlpath=lab) The eclib package includes mwrank (for 2-descent on elliptic curves over Q) and modular symbol code used to create the elliptic curve database. eclib-20250122/autogen.sh000077500000000000000000000004351474421343600150420ustar00rootroot00000000000000#! /bin/sh aclocal # Support for Linux and Mac OS X # libtoolize is given the name glibtoolize # when installing GNU libtool via # Homebrew or MacPorts on Mac if hash libtoolize 2>&- then libtoolize --automake else glibtoolize --automake fi automake --add-missing autoconf eclib-20250122/binder/000077500000000000000000000000001474421343600143025ustar00rootroot00000000000000eclib-20250122/binder/environment.yml000066400000000000000000000001741474421343600173730ustar00rootroot00000000000000name: eclib channels: - conda-forge dependencies: - automake - libtool - gmp - mpfr - ntl - libflint - pari eclib-20250122/binder/postBuild000066400000000000000000000014611474421343600161740ustar00rootroot00000000000000#!/bin/bash # Our conda env has the necessary dependencies, so propagate them # for the build below export PREFIX="$CONDA_DEFAULT_ENV" # For now, we need an alpha version of JupyterLab. Can be removed later. pip install --pre -U jupyterlab echo "configuring eclib with PREFIX=$PREFIX" # Configure eclib with autotools export CONFIGURE_OPTS="--disable-mpfp" export CPPFLAGS="-I$PREFIX/include $CPPFLAGS" export LDFLAGS="-L$PREFIX/lib -Wl,-rpath,$PREFIX/lib $LDFLAGS" echo "environment" echo "===========" env | sort echo chmod +x autogen.sh ./autogen.sh chmod +x configure ./configure --prefix="$PREFIX" --with-ntl="$PREFIX" --with-pari="$PREFIX" --with-flint="$PREFIX" --with-boost="no" $CONFIGURE_OPTS # Build and install so Binder users have a fully installed environment make && make check && make install eclib-20250122/binder/start000077500000000000000000000004151474421343600153650ustar00rootroot00000000000000#!/bin/bash # We need to set the base url locally when not deployed on binder. BASEURL="${user/${JUPYTERHUB_USER}:-/}" # Import the workspace into JupyterLab jupyter lab workspaces import binder/workspace.json \ --NotebookApp.base_url=$BASEURL --name="" exec "$@" eclib-20250122/binder/workspace.json000066400000000000000000000012411474421343600171710ustar00rootroot00000000000000{"data":{"terminal:1":{"data":{"name":"1"}},"markdownviewer-widget:README.md":{"data":{"path":"README.md","factory":"Markdown Preview"}},"layout-restorer:data":{"main":{"dock":{"type":"split-area","orientation":"vertical","sizes":[0.3,0.7],"children":[{"type":"tab-area","currentIndex":0,"widgets":["markdownviewer-widget:README.md"]},{"type":"tab-area","currentIndex":0,"widgets":["terminal:1"]}]},"mode":"multiple-document","current":"terminal:1"},"left":{"collapsed":false,"current":"filebrowser","widgets":["filebrowser","running-sessions","command-palette","tab-manager"]},"right":{"collapsed":true,"widgets":[]}}},"metadata":{"id":"/user/fperez-eclib-vwhedwkp/lab"}} eclib-20250122/configure.ac000066400000000000000000000153031474421343600153270ustar00rootroot00000000000000 # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) # The version is the concatenation of 'v' and the year, month, date: vyyyymmdd # To access this as a string or integer triple, see libsrc/eclib/version.h AC_INIT([eclib], [20250122], [john.cremona@gmail.com]) AM_INIT_AUTOMAKE([-Wall]) AC_MSG_NOTICE([Configuring eclib...]) AC_CONFIG_SRCDIR([libsrc]) #AC_CONFIG_HEADERS([config.h]) AC_CONFIG_MACRO_DIR([m4]) AM_PROG_AR # Initialise libtools: LT_INIT # The version of the libtool library is of the form current:revision:age # # See # http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html # # # When doing a release, they should be updated like this (in sequence): # # 1. If any code has changed, whether or not interfaces have changed: # increment revision. (c,r,a) -> (c,r+1,a) # # 2. If interfaces were added, removed or changed: now increment # current and set revision to zero. (c,r,a) -> (c,r+1,a) -> (c+1,0,a) # # 3. If interfaces were added: now increment age: # (c,r,a) -> (c,r+1,a) -> (c+1,0,a) -> (c+1,0,a+1) # or if interfaces were removed or changed (breaking backward compatibility): # now set age to zero. (c,r,a) -> (c,r+1,a) -> (c+1,0,a) -> (c+1,0,0) # # NB The suffix of the library name (libec.so here) is (c-a).a.r LT_CURRENT=14 LT_REVISION=1 LT_AGE=0 AC_SUBST(LT_CURRENT) AC_SUBST(LT_REVISION) AC_SUBST(LT_AGE) # Checks for programs: AC_PROG_CXX AC_PROG_CC AC_PROG_INSTALL LT_INIT # Checks for system features and libraries, via macros defined in m4/ directory AX_CXX_COMPILE_STDCXX([14],,mandatory) # NB At present if configure finds boost on your system then it WILL # define ECLIB_MULTITHREAD which you may not want, if you have not put # --with-boost on the configure line. This should be fixed. Until # then, if your system has boost but you do not want to use # multithreading, manually edit out the lines in configure which # define ECLIB_MULTITHREAD=1. # # Boost 1.35.0+ required for Asio (1.25.0 for Thread) AX_BOOST_BASE([1.35.0], [ AX_BOOST_SYSTEM AX_BOOST_ASIO AX_BOOST_THREAD ]) if [test "$ax_cv_boost_system" = "yes"] && [test "$ax_cv_boost_asio" = "yes"] && [test "$ax_cv_boost_thread" = "yes"]; then AC_DEFINE([ECLIB_MULTITHREAD],[1],[Define if multithreading available and requested]) fi AX_PTHREAD # Check for libraries # The following AC_ARG_WITH section were written by Volker Braun dnl Find PARI AC_ARG_WITH(pari, [AS_HELP_STRING([--with-pari=], [prefix of PARI installation. e.g. /usr/local or /usr])], [], [AC_CHECK_LIB([pari], [pari_kernel_init],[ ], AC_MSG_ERROR([Pari library not found. Maybe you want to call configure with the --with-pari= option? This tells configure where to find the PARI library and headers. e.g. --with-pari=/usr/local or --with-pari=/usr]),[ ])] ) case "$with_pari" in ""|yes) PARI_LDFLAGS="" PARI_CFLAGS="" GP="gp" ;; no) AC_MSG_ERROR([Compiling without libpari impossible (but --without-pari given)]) ;; *) PARI_LDFLAGS="-L${with_pari}/lib" PARI_CFLAGS="-I${with_pari}/include" GP="${with_pari}/bin/gp" ;; esac PARI_LIBS="-lpari" AC_SUBST(PARI_LIBS) AC_SUBST(PARI_CFLAGS) AC_SUBST(PARI_LDFLAGS) AC_SUBST(GP) dnl Find the NTL Library AC_ARG_WITH(ntl, [AS_HELP_STRING([--with-ntl=], [prefix of NTL installation. e.g. /usr/local or /usr])], [], [] ) case "$with_ntl" in ""|yes) NTL_LDFLAGS="" NTL_CFLAGS="" ;; no) AC_MSG_ERROR([Compiling without libntl impossible (but --without-ntl given)]) ;; *) NTL_LDFLAGS="-L${with_ntl}/lib" NTL_CFLAGS="-I${with_ntl}/include" ;; esac AC_LANG_PUSH(C++) CPPFLAGS_save="$CPPFLAGS" LDFLAGS_save="$LDFLAGS" CPPFLAGS="$CPPFLAGS $NTL_CFLAGS" LDFLAGS="$LDFLAGS $NTL_LDFLAGS" dnl We first check for NTL/ZZ.h with a plain c++ compiler. dnl if it fails we unset the cache, check if we have a c++11 dnl capable compiler and try again with c++11 enabled, in case dnl NTL has been compiled with c++11 threads AC_CHECK_HEADER(NTL/ZZ.h, [], [AC_MSG_ERROR([Could not find NTL, you might want to use --with-ntl= to point to its location])] ) LDFLAGS="$LDFLAGS_save" CPPFLAGS="$CPPFLAGS_save" AC_LANG_POP(C++) NTL_LIBS="-lntl" AC_SUBST(NTL_LIBS) AC_SUBST(NTL_CFLAGS) AC_SUBST(NTL_LDFLAGS) dnl Find the FLINT Library and determine if it has the nmod_mat module dnl (in FLINT from version 2.3) dnl dnl First set defaults for when no suitable FLINT is found dnl AC_ARG_WITH(flint, [AS_HELP_STRING([--with-flint=],[prefix of FLINT installation.])], [ if test "$withval" = "no"; then want_flint=no elif test "$withval" = "yes" -o "$withval" = ""; then want_flint=yes AC_CHECK_LIB([flint], [fmpz_init, nmod_mat_rref], [FLINT_CFLAGS="-DFLINT=1"; FLINT_LIBS="-lflint"; AC_MSG_NOTICE([Building with FLINT support from system install])], [AC_MSG_NOTICE([No suitable FLINT Library (version >=2.3) found])], []) else want_flint=yes FLINT_CFLAGS="-DFLINT=1 -I$withval/include" FLINT_LDFLAGS="-L$withval/lib"; FLINT_LIBS="-lflint" fi ], [want_flint=no] ) if test "x$want_flint" = "xno"; then FLINT_CFLAGS="-DFLINT=0" FLINT_LDFLAGS="" FLINT_LIBS="" fi AC_SUBST(FLINT_LIBS) AC_SUBST(FLINT_CFLAGS) AC_SUBST(FLINT_LDFLAGS) # Checks for header files. AC_FUNC_ALLOCA AC_CHECK_HEADERS([stdlib.h string.h unistd.h]) # Checks for typedefs, structures, and compiler characteristics. AC_HEADER_STDBOOL AC_C_INLINE AC_TYPE_INT64_T AC_C_RESTRICT AC_TYPE_SIZE_T # Checks for library functions. AC_CHECK_FUNCS([floor memmove memset pow sqrt strchr]) # use --disable-allprogs to prevent building any executable programs except mwrank AC_ARG_ENABLE([allprogs], AS_HELP_STRING([--disable-allprogs], [only build the library and mwrank, otherwise build all programs and tests]), [case "${enableval}" in yes) allprogs=true ;; no) allprogs=false ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-allprogs]) ;; esac],[allprogs=true]) AM_CONDITIONAL([ALLPROGS], [test x$allprogs = xtrue]) # use --disable-mpfp to use standard C doubles only, not NTL RR AC_ARG_ENABLE([mpfp], AS_HELP_STRING([--enable-mpfp], [use NTL RR for floating point instead of standard C doubles]), [case "${enableval}" in yes) mpfp=true ;; no) mpfp=false ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-mpfp]) ;; esac],[mpfp=true]) AM_CONDITIONAL([NO_MPFP], [test x$mpfp = xfalse]) AC_CONFIG_FILES([ libsrc/Makefile tests/Makefile progs/Makefile doc/Makefile man/Makefile Makefile eclib.pc ]) AC_OUTPUT eclib-20250122/doc/000077500000000000000000000000001474421343600136045ustar00rootroot00000000000000eclib-20250122/doc/Makefile.am000066400000000000000000000002131474421343600156340ustar00rootroot00000000000000nobase_dist_doc_DATA = g0n.txt howto.txt progs.txt mwrank/mwrank.changes mwrank/mwrank.info mwrank/mwrank.options mwrank/mwrank.readme eclib-20250122/doc/g0n.txt000066400000000000000000000641071474421343600150410ustar00rootroot00000000000000Documentation for the modular symbol programs in the eclib library (guide to source code) % created 20070125 % Time-stamp: <2016-01-02 15:46:35 jec> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Note that until March/April 2012 my source code was split into four subdirectories (procs, qcurves, qrank and g0n) only the last of which contained modular symbol code for computing elliptic curves. The notes here are mostly about the latter. In the current distribution, there are library headers and implementation files in libsrc/eclib and libsrc/ respectively, test programs in tests/ and user programs in progs/. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Level 0: functionality provided from other libraries Basic arithmetic, including polynomials and PARI/NTL interfacing (PARI is only used for integer factorization), linear algebra (including sparse LA), various utilities some of which are independently useful (reduction of cubics and quartics, solving conics, ...). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Level 1: low-level classes probably not useful for users to use directly. NB The efficiency of the implementations here is of crucial importance! ---------------------------------------------------------------------- file: moddata class: level Holds the current level N ("modulus"), its prime factors and divisors, some "global" flags and a reduce() function for reduction modulo N. ---------------------------------------------------------------------- file: moddata class: moddata (derived from level) Holds precomputed arithmetic data for the level, including lookup tables of gcds with N and inverse modulo N Test program: modtest (also tests symb class) ---------------------------------------------------------------------- file: symb class: symb Class for (c:d) or M-symbols. Also holds a pointer to a moddata. Functions for equality testing, normalization. ---------------------------------------------------------------------- file: symb class: modsym Class for {a,b} or modular symbols, where a,b are rational. Includes constructor from a symb. ---------------------------------------------------------------------- file: symb class: symblist Class for an array of symbs with hash function for fast index lookup. ---------------------------------------------------------------------- file: symb class: symbdata (derived from moddata) Class for full M-symbol data. Includes a symblist of "specials" (M-symbols not of the form (c:1) or (1:d)), bijections from the set of M-symbols to/from indices in the range 0..nsymb-1, and implementation of matrix operations (rof, rsof, sof, tof) applied to symb indices. ---------------------------------------------------------------------- file: oldforms class: oldforms Class for retrieving oldforms from stored data files for all levels properly dividing the current level. Computes multiplicities of these. Used for one purpose: in searching for newforms recursively, at any point we will have restricted to some subspace cut out by eigenvalues [a2, a3, a5, ...] and the oldforms member function dimoldpart() will tell us how much of the current dimension is accounted for by oldforms. This enables us to abandon the current recursive branch if it is all old, and for the same reason results in oldforms being discarded and only newforms kept. [NB for this to work it is crucial that before running the newforms search, date for the dividing levels is available. This is handled automatically by the newforms class functions.] ---------------------------------------------------------------------- file: cusp class: cusplist Class to hold an array of inequivalent cusps (=rationals), insert and locate cusps in the list, and test for cusp equivalence (using a moddata pointer to know the level and also whether or not plusflag is set, in which case the equivalence test is affected). ---------------------------------------------------------------------- file: homspace class: mat22 Class to hold a 2x2 matrix, with functions to allow them to act on rationals and symbs ---------------------------------------------------------------------- file: homspace class: matop Class to hold a formal sum of mat22s. Constructors include: Hecke operators T_p, W_q, Heilbronn matrices %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Level 3: high-level classes useful for users to use directly. I would expect these to be wrapped for Sage (eventually) ---------------------------------------------------------------------- file: homspace class: homspace (derived from symbdata) The main class for holding a "modular symbols space". The constructor does a lot of work: homspace(long n, // the level int hp, // plus-space flag (0 or 1 or -1) int hcusp, // cuspidal flag (0 or 1) int verbose // verbosity (0 : no output // 1 : basic short output // 2 : lots of detail) ); The plus-space flag switches between working on H_1^+ (by quotienting out extra relations (c:d)=(-c:d)), H_1^-, or the full H_1. If the cupsidal flag is 1 then the space computed is the kernel of the boundary map to the cusps, and all operators are restricted to that subspace. However the "restricted" operators which compute directly the action of Tp etc on a subspace only work properly (1) for subspaces of the dual and (2) for the full (including non-cuspidal) homology. Functionality (most useful class functions only): long h1cuspdim() // returns dim of cuspidal subspace long h1dim() // returns dim of whole space long h1ncusps() // returns number of cusp classes svec schain(const symb& s) // returns coordinates of symb s svec schaincd(long c, long d) // returns coords of symb (c:d) svec schain(long nn, long dd) // returns coords of modsym {0,nn/dd} svec schain(const rational& r) // returns coords of modsym {0,r} vec cycle(long n, long d) // as schain(n,d) but cuspidal only, result is a coordinate vector w.r.t. the basis for cuspidal homology vec cycle(const rational& r) // as schain(r) but cuspidal vec cycle(const modsym& m) // as schain(b)-schain(a) but cuspidal, m={a,b} mat heckeop(long p, int dual, int display=0) // p'th Hecke operator (Tp or W_p according as p does not / does divide level) NB (1) if cuspidal==1, restricts to cuspidal subspace (2) if dual==1, transposes mat heckeop_restricted(long p, const subspace& s, int dual, int display=0) // as previous but restricted to *dual* subspace s, so dual==1 is // mandatory else results are not guaranteed to be meaningful smat s_heckeop(long p, int dual, int display=0) smat s_heckeop_restricted(long p, const ssubspace& s, int dual, int display=0) // Exactly as previous two but returns a sparse matrix mat newheckeop(long p, int dual, int display=0) // Tp computation using Heilbronn matrices. Faster than heckeop(), but not currently implemented in a "restricted" version, hence not used in the main newform-finding programs. *But* for a one-off calculation of a Hecke op on the whole space you should use this one! mat wop(long q, int dual, int display=0) // returns W_q matrix smat s_wop(long q, int dual, int display=0) // returns W_q sparse matrix mat fricke(int dual, int display=0) // returns Fricke involution matrix mat conj(int dual,int display=0) // returns conjugation matrix (=identity if plusflag==1!) mat conj_restricted(const subspace& s, int dual,int display=0) // ditto, restricted to subspace s smat s_conj(int dual, int display=0) // as above, returning sparse mat smat s_conj_restricted(const ssubspace& s, int dual, int display=0) // as above, returning sparse mat vec maninvector(long p) // for good p, returns sum_{a mod p}{0,a/p} vec manintwist(long p) // for good p, returns sum_{a mod p}chi(a){0,a/p} ---------------------------------------------------------------------- file: newforms classes: newform and newforms Overview: newform holds an individual newform, with a pointer to the parent newforms for "global" data; newforms (which is derived from level) contains a vast anout of stuff, explained below, including an array of individual newform-s. ---------------------------------------------------------------------- class: newform For more details see newforms.h Main data fields: newforms *nf; // the "parent" int plusflag; // 1 for old-style newform, 0 for old-style h1newform vec bplus,bminus; // DUAL eigenvectors (bminus only used if plusfalg==0) scalar type; // 2 for rectangular, 1 for triangular // period lattice vector aplist, aqlist; // aplist is a vector of Fourier coefficients, indexed by all primes // aqlist is a vector of the Wq eigenvalues // Bother are needed since (a) the q'th Fourier coefficient is 0 when // q^2|N so does not determine the eigenvalue; (b) the range of the // aplist may not go ar enough to include all bad primes, but we really // want to have all aq (to get the sign of the functional equation, // analytic rank parity etc.) long ap0; // Eigenvalue of first "good" p long sfe; // sign of functional equation rational loverp; // L(f,1)/x where x = least real part of a period // =np0/dp0 // The bext few are technical, needed for computing periods. long cuspidalfactor; // pdot =cuspidalfactor*np0 long pdot,np0,dp0,qdot; // np0=1+p0-ap0, pdot = maninvector(p0).bplus, // = cuspidalfactor*dp0 // qdot={q,infinity}.bplus long lplus, lminus; // primes = +1, -1 mod 4 long mplus, mminus; // mplus*x=sqrt(lplus)*L(fxlplus,1) // mminus*yi=sqrt(-lminus)*L(fxlminus,1) long a,b,c,d,dotplus,dotminus; // matrix for period integration // Either type=1, lattice=[2x,x+yi] // Or type=2, lattice=[x,yi] // & integral over [a,b;Nc,d] is dotplus*x+dotminus*yi long degphi; // degree of Weil parametrization // Not currently being set or used, since our algorithm was too slow // for large levels and we just use MW's programs instead (externally). vec coords; // vector components of each freegen (will // become one column of homspace::projcoord) // Used in mass-production of ap after newforms have been found Member function for newform class: Constructors: newform(const vector& data, const vector& aq, const vector& ap, newforms* nfs); // To be used when constructing from stored data, so no basis vector // -- since we do not compute the H1 space unless we have to newform(const vec& vplus, const vec& vminus, const vector& ap, newforms* nfs,long ind=-1); // To be used when constructing from the recursive search, including basis vector(s) (vminus only relevant when plusflag==0); all the technical data fields will be computed in this constructor, using the parent newforms's homspace. // New constructor(s) needed, from an elliptic curve and/or the data [level, aplist, aqlist] which will need to find the basis vector(s) from splitting off a 1D eigenspace from the appropriate homspace and then use the first constructor above. void add_more_ap(int nap); // Extends the aplist (if necessary) until it contains atleast nap terms. Only used in the second constructor after all the newforms for a given level have been found, so that they all have apslists of the same length. Format of stored data: newforms are stored in files in a directory whose name is set via the environment variable NF_DIR which defaults to "newforms". Filenames within that dir are the level (in decimal) preceded by 'x', e.g. newforms/x11 holds the data for level 11. The filename is constructed by the fiunction nf_filename(), in moddata.h/cc. The filename is constructed by the function char* nf_filename(long n, char c) // use c='x' where it is the callers responsibility to delete[] the result after use. The data files are written by newforms::output_to_file(). The file format is binary (for speed of input/output and compact size -- my definitive newforms dirsctory is 8GB for levels to 130000). The following description is taken from newforms.h: /* Data stored in a newform (and in data files newforms/x$N): (Numbers refer to lines of data file) Items 1-18 are "int" while the ap and aq are "short" 3. sfe : sign of functional equation (=-product of aq) 4. ap0 : p0'th Hecke eigenvalue, p0=smallest good prime 5. np0 : np0=1+p0-ap0 6. dp0 : dp0/np0=L/P=L(f,1)/2x 7. lplus : prime =1 (mod 4) with L(f,lplus,1) nonzero 8. mplus : L(f,lplus,1)*sqrt(l)=mplus*x 9. lminus : prime =3 (mod 4) with L(f,lminus,1) nonzero 10. mminus : L(f,lminus,1)*sqrt(-l)=mminus*yi 11-14. a, b, c, d : entries of a matrix M=[a,b;N*c,d] in Gamma_0(N) s.t. 15. dotplus : the integral of f over {0,M(0)} is 16. dotminus : dotplus*x+dotminus*yi 17. type : type 1 if period lattice = [2x,x+yi], type 2 if [x,yi] 18. degphi : degree of modular parametrization aq : list of Wq-eigenvalues at bad primes ap : list of Tp- & Wq-eigenvalues at all primes */ There are some shell scripts for viewing the stored data: nnf N : returns number of newforms at level N (on file -- no computation!) nap N : returns number of ap stored at level N (on file -- no computation!) showdata N : shows just the technical data, not all the ap showeigs N : shows all the aq and ap shownf N : shows all data for level N (pipe through more or less!) NB At present these scripts assume NF_DIR="newforms" ---------------------------------------------------------------------- class: newforms (derived from level and splitter_base) For more details see newforms.h Parent classes: level provides... the level, bad primes. splitter_base provides facilities for (a) recursive searching for Hecke eigenspaces from scratch using only the ability to compute a sequence of operators (optionally, restricted to the current space), with a known finite set of possible eigenvalues for each; and (b) splitting of the eigenspace for any given (valid) sequence of eigenvalues. The reason this is done in a virtual base class way over in ../procs is that I use the *exact* same functionality of the code for modular symbols over imaginary quadratic fields. Constructor: newforms(long n, int plus, int cuspidalflag, int disp) // just sets the flags, and the of and h1 pointers to 0 // the real work is done by calling either createfromscratch() or // createfromdata(), see below. Main data fields: int verbose; // controls output verbosity level (*none* if 0) long maxdepth, // bound on recursion depth in search cuspidal, // flags whether or not to use cuspidal homology plusflag; // flags whether or not to work in + space int basisflag; // flag to determine how much work ::use() does. // use() is what the base class does with eigenspaces when found. // flag==0 for a recursive search, where use() will call the newform // constructor; // flag==1 for recovering newforms in a plusspace from existing data, // where all use() has to do is set the newforms's basis vector, as the // newform will already have been constructed with all the other data // needed. vec mvp; // the "manin vector" sum_{a mod p} {0,a/p} for p=p0, the // smallest good prime map mvlplusvecs, mvlminusvecs; // arrays of quadratic-twisted manin vectors, indexed by // good primes l where l=1(4) for plusvecs and l=3(4) for // minusvecs. Each newform has one of each (determined by // its own lplus and lminus primes); but we store these // vectors in the newforms class for efficiency when more than // one newform shares the same lplus or lminus! oldforms* of; // pointer to oldforms whcih provde the dimoldpart() // facility to enable old spaces to be discarded // during the recursive search homspace* h1; // pointer to homspace for the level. We make this a // member rather than deriving the newforms class from // homspace, which would be more natural, as for some // functionality (e.g. reading the newforms data from // files and recomputing the elliptic curves) we do // not need the homology information, so don't want to // compute it. Basically, createfromscratch() make // the homspace (by calling ::makeh1()) and // createfromdata() does not. int j0; long nq, dq; // data used for ap computation std::set jlist; long n1ds, // the number of newforms j1ds; // index used when recreating newforms vector nflist; // the actual newform-s. // These just call the similar function in the associated homspace // Here i is the index of the prime to use mat opmat(int i, int d, int v=0) mat opmat_restricted(int i, const subspace& s, int d, int v=0) smat s_opmat(int i, int d, int v=0) smat s_opmat_restricted(int i, const ssubspace& s, int d, int v=0) // The next 3 functions are to provide functionality needed by the // base splitter class // the dimension of the underlying homspace long matdim(void) {return h1->dimension;} // The list of possible eigenvalues for the i'th operator vector eigrange(int i) // Given an initial sequence of eigenvalues [a2,a3,...], uses the // oldforms member to return the corresponding dimension of oldforms long dimoldpart(const vector l); void display(void) // Output to stdout void output_to_file(int binflag=1) // output to data file in NF_DIR // add newform with basis b1, eiglist l to current list (b2 not used): void use(const vec& b1, const vec& b2, const vector l); // find newforms using homology; ntp is number of eigenvalues to use // for oldforms, *not* the number computed via homology (use addap() // for that): void createfromscratch(long ntp); // read newforms from file, if it exists, otherwise (perhaps) revert // to createfromscratch: void createfromdata(long ntp, int create_from_scratch_if_absent=1); // Construct bases (homology eigenvectors) from eigenvalue lists: void makebases(); // computes vector of ap, one for for each newform vector apvec(long p); // compute ap for all primes up to the last'th, insert them into each // newforms own aplist: void addap(long last); // adds ap for primes up to the last'th prime // Sort newforms void sort(int oldorder=0); // next three functions() implemented in periods.cc // Given newform with no intdata, compute least real (part of) // period -- unless sfe=-1 and n=square, in which case return 0 int get_real_period(long i, bigfloat& x, int verbose=0) const; // Given all data, compute the periods as a Cperiods Cperiods getperiods(long i, int method=-1, int verbose=0); // Given all data & Cperiods, compute the curve Curve getcurve(long i, int method, bigfloat& rperiod, int verbose=0); // next two implemented in pcprocs.cc // Computes x0, y0 (real & imag parts of periods) & a matrix which // gives these scaled by dotplus & dotminus. rp_known is set if we // know x0 to be the least real part of a period (usually true) int find_matrix(long i, long dmax, int&rp_known, bigfloat&x0, bigfloat&y0); // Given an imaginary period y1, finds a prime lminus =3(mod 4) and // <=lmax for which L(f,lminus,1) is nonzero and hence a multiple // mminus of y1. // if lmax==0 it carries on until a suitable lminus is found int find_lminus(long i, long lmax, const bigfloat& y1); ---------------------------------------------------------------------- file: periods class: character Precomputes values of a quadratic character modulo a prime (or trivial) ---------------------------------------------------------------------- file: periods class summer Base class for several others all of which compute sums of the form sum_{n=1}^{\infty} a_n f(n) for various real or complex-values f(n), where the a_n are the coefficients of a newform. Using the usual Buhler-Gross-Zagier recursion. Data fields: see periods.h ---------------------------------------------------------------------- file: periods class periods_via_lfchi (derinved from summer) Class to compute the periods of a newform using the values of L(f,chi,1) for suitable quadratic characters chi. Constructor: periods_via_lfchi (const level* iN, const newform* f); Member functions: void compute(void); // does the work bigfloat rper(void) // return the real period bigfloat iper(void) // return the imaginary period Cperiods getperiods() // return the period lattice ---------------------------------------------------------------------- file: periods class: periods_direct (derived from summer) Class to compute the periods of a newform by integrating over {0,g(0)} for a matrix g in Gamma_0(N); from the real and imaginary parts of the result and the integer scaling factors stored in the newform class (and the lattice type) we can recover the full period lattice. Constructor: periods_direct (const level* iN, const newform* f); Member functions: void compute(void); // Computes integral over {0,g(0)} where g is // the matrix in Gamma_0(N) stored in the newform void compute(long a, long b, long c, long d); // Computes integral over {0,g(0)} where g is [a,b;N*c,d] bigfloat rper(void) // return the real period bigfloat iper(void) // return the imaginary period Cperiods getperiods() // return the period lattice ---------------------------------------------------------------------- file: periods class: part_period (derived from summer) Class to compute the integral of a newform over {z,\infty} for any z in the upper half plane -- for example, to compute Heegner points. Constructor: part_period (const level* iN, const newform* f); Member functions: void compute(const bigcomplex& z0); // do the work bigcomplex getperiod() // get the answer ---------------------------------------------------------------------- file: periods class: ldash1 (derived from summer) Class to compute the analytic rank r and value L^(r)(f,1) for a newform f. The parity of r comes from the newform's s.f.e., and whether or not r=0 is also determined from the newform's data. This gives an initial guess of r\in{0,1,2}. If the value is very small then r is increased by 2 and the value recomputed. (Tested ok for lots of rank 3 curves and the rank 4 curve at N=234446.) Constructors: ldash1 (const level* iN, const newform* f); ldash1 (const newforms* nf, long i); // the i'th newform Member functions: void compute(void); // does the work long rank() // returns the rank bigfloat value() // returns the value ---------------------------------------------------------------------- file: periods class: lfchi (derived from summer) Class to compute L(f,chi,1) for a newform f and quadratic character chi (modulo an odd prime l not dividing the level) Constructor: lfchi (const level* iN, const newform* f); (Does nothing specific to the prime l) Member functions: void compute(long ell); // does the work for the prime l bigfloat value(void) // gives the value bigfloat scaled_value(void) // gives the value * sqrt(l) ---------------------------------------------------------------------- file: pcprocs Contains two new functions plus implementations of newforms class functions newforms::find_matrix() and newforms::find_lminus() described above // returns a rational approximation a/b to real x void ratapprox(bigfloat x, long& a, long& b); int get_curve(long n, long fac, long maxnx, long maxny, const bigfloat& x0, const bigfloat& y0, long& nx, long& ny, int& type, int detail=0); Input n: target conductor of E fac: known factor of c6(E) x0, y0: reals known to be multiples of least real/imag periods of E maxnx, maxny: bounds on these multiples detail: verbose flag Output: nx, ny, type If type==1 then [2*x,x+y*i] or if type==2 then [x,y*i], where x=x0/nx, y=y0/ny, is the period lattice of an elliptic curve of conductor n (whose c6 is divisible by fac). ---------------------------------------------------------------------- files: nfd.h, nfd.cc, tnfd.cc class: nfd Class which implements d-dimensional newforms (i.e. with Hecke eigenvalues of degree d over Q). Program tnfd is a test program for this. Experimental, not currently working. ---------------------------------------------------------------------- files: fixc6.h, fixc6.cc; (optional) fixc4.data, fixc6.data class: fixc6 These can be completely ignored, since I gave up using them after N=130000 and just use multiprecision floating point always, even though it is slower, with some cleverness to automatically increase precision as needed. The standard double precision code is all still here (and runs when the --deisable-mpfp option is given on configuration). In future the code will use that where possible and sensible, for speed and flexibility. // Background: for curves with large c6 (or c4), the value cannot be computed // with sufficient precision without using multiprecision floating // point arithmetic, which slows down all the other cases // unnecessarily. To avoid this, after first computing the "correct" // c6 value once in multiprecision, we add that value to a table // indexed by (level, form#), and look up in the table when we need // the value. // The fixc6 class has two static data members, of type map< // pair, bigint> such that an entry ((N,i),c6) or ((N,i),c4) // says that the c6 or c4 value for form i at level N is c6 or c4. Of // course, for most (N,i) pairs this is blank -- and we must avoid // inserting wrong dummy entries of the form ((N,i),0). // April 2005: added facility for fixing c4 as well as c6, but the // class name is unchanged NB For levels up to 130000 these files are quite big: 443 1329 10319 fixc4.data 25808 77424 679655 fixc6.data 26251 78753 689974 total That is, out of 570226 (optimal) curves, 25808 require this "fixing" of c6 and 443 also for c4. NB This is *not used* when the programs are compiled with multiprecision floating point (i.e. without --disable-mpfp) so can be ignored for Sage. But the programs which produce tables of curves from stored data *do* recompute the periods of the newforms and hence get the curves from their periods, and this is *much* faster using standard C doubles! eclib-20250122/doc/howto.txt000066400000000000000000000167101474421343600155120ustar00rootroot00000000000000Documentation for the eclib library (building and running) % Time-stamp: <2023-11-10 15:16:50 john> 0. Prerequisites: gmp, pari, ntl, flint are all available for example as ubuntu packages. Configure will complain if it cannot find them. 1. Download, build and install: (a) Get the latest version of eclib from GitHub, e.g. wget https://github.com/JohnCremona/eclib/releases/download/v20230424/eclib-20230424.tar.bz2 (b) Unpack it using tar jxf eclib-20230424.tar.bz2 (c) Change into that directory: cd eclib-20230424 (d) Configure using ./configure after reading the README file to see if you will need non-default options. (e) make; make check; [make install] For the make install step, do it as superuser if you did not specify something non-default as --prefix in the ./configure step, otherwise make sure that the bin subdirectory of the install directory (say INSTALL_DIR) is in your PATH. 2. To run the modular symbols code to find modular elliptic curves: (a) Make your own working directory, say mkdir ~/g0n cd ~/g0n (b) Make a subdirectory which will hold newform data (as binary files). The default is mkdir newforms and if you use any other name you will need to set the environment variable NF_DIR to this directory. (c) Modular elliptic curve programs are in $INSTALL_DIR/bin. Several expect to read & write files in the newforms directory $NF_DIR. Beware: if you change the source code and run the resulting programs, this may well overwrite the data files in $NF_DIR with garbage. So when testing it is a good idea to create a new testing copy of $NF_DIR, leaving your master one untouched. My master newforms directory (containing all data to 235000) is >23G. Question: why would you want or need to copy or use old newforms data? Answer: to find the newforms at level N, the program will need to knw about newforms at all levels M rank). May 1998 ========= 18. Fixed various memory leaks. April 1998 ========== 17. Bug fixes to mrank1.cc: (a) added braces {...} to correct compiler parsing resulting in "wrong type" messages, (b) correct computation of Selmer rank when rank>0. (Latter caused wrong Selmer rank of 2 for curve 0,0,1,0,929]; thanks again to Fermigier. Feb/March 1998 ============== 15. Added autoconfigure to source distribution, thanks to Thomas Papanikolaiou. [Redesigned in 2005 mainly by WIlliam Stein] 16. Bug fix in flag initialization in mrank1.cc, to correctly handle C2xC2 primes when one value of z is negative (failed on [0,0,0,0,-50800]). Thanks to Fermigier. Nov 1997 ======== 8. Descent via 2-isogeny made much more efficient by better book-keeping. File(s) affected: mrank2.h/cc 9. Added second descent on to descent via 2-isogeny. For hard cases the multiprecision version is better here, but is also slower in general so the released version is NOT multi. File(s) affected: mrank2.h/cc 10. Improved bounds in quartic search. This speeds things up well when disc<0 (only relevant when no 2-torsion) File(s) affected: mrank1.h/cc 11. Added version.h/cc so that program always displays its date of compilation. File(s) affected: version.h/cc 12. Added options.h to give command-line option support. See file mwrank.options for details, or try "mwrank -h" for a summary. File(s) affected: options.h, mwrank.options 13. Added so-called p-adic filtration to descent without isogeny, making fuller use of sieving primes to use the explicit image of a quartic in E(Qp)/2E(Qp) when this is C2 or C2xC2. File(s) affected: mrank1.h/cc 14. Added PARI/GP output option "-o". Also made mrank redundant as "-c 0" (= default) turns off the infinte descent step, while "-c -1" as before gives automatic computation of bound. File(s) affected: options.h, mwrank.cc, mrank.cc 13 May 1996 =========== Important changes to mwrank since summer 1995 See preprint "Classical Invariant Theory and 2-descent on elliptic curves" [Journal of Symbolic Computation (Proceedings of the Second Magma Conference, Milwaukee, May 1996), Jan/Feb 2001, pages 71-87] for details of the theory behind these changes. 1. Transferring points from quartics to the curve: Now uses one fixed model for the curve E: y^2=x^3-27Ix-27J, and any rational point on a quartic (yz)^2=g(x,z) with invariants I,J maps directly to a point on E. One can compute once and for all the isomorphism between E and the original/minimal model to transfer these points back. Result: simpler code and no wasting time minimising many different models for E File(s) affected: qc.h/cc 2. Sieving for quartics: now uses a 2-D sieve on (a,h) where h=8ac-b^2 instead of a 3-D sieve on (a,b,c), based on the seminvariant syzygy. Given an (a,b,c) triple which passes the sieve, now compute the seminvariant r and hence solve for d,e algebraically. Result: simpler code, less dependent on precision as no floating point arithmetic used to solve for d,e. File(s) affected: mrank1.h/cc 3. Testing equivalence of quartics: (a) store with each quartic a hash value coding the number of roots mod p for several primes p; equivalent quartics must have same hash value, giving a quick necessary condition for equivalence. (b) quartic equivalence testing now done algebraically, testing whether a third quartic has a root. Vastly simpler code and much more robust, not dependent on floating point precision. File(s) affected: mequiv.h/cc 4. Using group structure to avoid/curtail searching for type 1 quartics. When \Delta>0 the number of type 1 quartics is either 0 or equal to the number of type 2s, according as there are no / are rational points on the "egg" component of the real locus. So one can avoid searching for type 1s altogether if one knows in advance the existence of such points, and in any case once a single type 1 quartic is found one does not need to complete the search as one then knows exactly how many tere are (assuming one has searched for type 2 quartics first). File(s) affected: mrank1.h/cc 5. Searching for point on quartics: (a)add infinity to mod-p sieve, so do not try denominators divisible by a prime p such that a is a non-square mod p. This eliminates many denominators very quickly. (Suggested by J. Gebel, Saarbruecken). (b) For quartics of type ax^4+cx^2+e, only search for x>0. This saves half the time when there are no points found, but does not necessarily save anything if a point is found. File(s) affected: msoluble.h/cc 7. (Theory still under construction! [See #20 above]) Avoid / curtail search for quartics with "large" invariants (16I,64J), by careful study of E(Q_2)/2E(Q_2). 7/8/95 ====== 1. Testing of equivalence of quartics (a) Uses a sieving idea of Samir Siksek's: each quartic is given a code based on how many roots it has modulo 5 small (good) primes; since equivalent quartics must have the same code this eliminates a lot of equivalence tests. For example, the 7 non-trivial quartics for the famous curve [0,0,1,-7,6] all have different codes as can be seen by running this curve with verbose=1. (b) Uses an entirely algebraic equivalence test instead of using floating point approximations to the roots, which regularly caused problems with precision. Now each pair of quartics determines a third quartic with integer coefficients, which has an integer root iff the original pair was equivalent. This third quartic is NOT the "product" of the first two in the Selmer group (it does not have the same invariants), but is related to it. 2. From quartics to curves This now uses a much simpler formula arising from the work used in 1(a) to give a point on the "IJ-curve" y^2=x^3-27Ix-J from a quartic with invariants I,J and a rational point. Previously each quartic gave a new (isomorphic) curve with a point on it, and time was spent reducing this to the standard model. -------------------------------------------------------------------- eclib-20250122/doc/mwrank/mwrank.info000066400000000000000000000320371474421343600172640ustar00rootroot00000000000000Program mwrank: uses 2-descent (via 2-isogeny if possible) to determine the rank of an elliptic curve E over Q, obtain a set of points which generate E(Q) modulo 2E(Q), and finally "saturate" to a full Z-basis for E(Q). For details of (some) algorithms see the author's book. Please acknowledge use of this program in published work, and send problems (and preprints!) to John.Cremona@nottingham.ac.uk. For changes since first distribution the file mwrank.changes. For command line options, see the file mwrank.options. MWRANK vs. MRANK There used to be two separate programs called mwrank and mrank; they both did the same 2-descent, but mwrank also went on to enlarge the subgroup of rank r found to give the full Mordell-Weil group by searching for rational points on E up to a certain naive height. This latter procedure was not very efficient, and to avoid reports of known problems at this stage I put a ceiling on this search at 15 (=logarithmic naive height). This means that in many cases the points finally output were NOT guaranteed to be a basis for E(Q) (but the output should say this). As of Jan 2005, the saturation stage is done much more efficiently using the "saturation sieve" method. Now there is only one program, mwrank. Saturation is done unless the generating points are not going to be output (e.g. with command-line flags -v 0 and neither -l nor -o). A HOW TO USE MWRANK 1. Options All options and parameter adjustments are now made via command line options: see the file mwrank.options for details, or run mwrank -h which displays the options briefly and exit. 2. Curve input The input consists of one or more curves, in the format a1 a2 a3 a4 a6 (separated by whitespace), or [a1,a2,a3,a4,a6] These can of course be from a file, as in mwrank < curves.in To end the input either use a "null curve" [0,0,0,0,0] or EOF (e.g. Control-d at the terminal). The input coefficients must be integers or rationals. If they are not integral, the program will convert to an integral model for the descent and point-finding, but will list the generators at the end on the original model. The curves are prompted for, unless verbosity is set to 0. For example, given the input file r5.in containing 0 0 1 -79 342 0 0 1 -169 930 0 1 1 -30 390 0 0 1 -301 2052 0 0 1 -457 3786 the command mwrank -q -v 0 < r5.in produces the output (the first line and time format may be different) === Curve [0,0,1,-79,342] : Rank = 5 Curve [0,0,1,-169,930] : Rank = 5 Curve [0,1,1,-30,390] : Rank = 5 Curve [0,0,1,-301,2052] : Rank = 5 Curve [0,0,1,-457,3786] : Rank = 5 === adding "-l" to the parameters will cause the generators and regulator to be output; adding "-o" results in an abbreviated form of output to be output also for post-processing by Pari; for the first curve above it gives [[5],[[3,11],[43,276],[45,296],[62,483],[92,878]]] 3. There are two types of point search carried out by mwrank. (a) On the homogeneous spaces which represent elements of the appropriate Selmer group, called "quartics" in the program (they have equations y^2=g(x) where g is quartic). Here existence of rational points is necessary for the homogeneous space to come from a point on the curve rather than an element of the Tate-Shafarevitch group. The bound used is a bound on the logarithmic height. If (x,y)=(u/w,v/w^2) it is a bound on max(log|u|,log|w|). The default value is 10; to change the default to (say) 12 use command-line option "-b 12". Warning: increasing this bound even by 1 can increase the running time considerably when there really are homogeneous spaces with no rational point (but with points everywhere locally, of course). I would not recommend setting this to more than 15: even if you are "sure" that the quartic has a rational point, other methods such as higher descents are probably better to find such large points. For entirely logical reasons it can also happen that reducing the value of this parameter can increase the running time -- and vice versa. So while 10 is the default it is sometimes worth running with a smaller value. (In the above examples, -b 1 works just as well, in the same time). If the curve has rational 2-torsion, then the search on the first descent curves has a bound of at most 6 (less if you set it using -b), and then a second descent is used if necessary, where the full bound is used. NB During the second descent, part of the quartic reduction process works much better using multi-precision floating point arithmetic, but the distributed (executable) version of the program does not have this. The reason: my programs currently either use multi-fp for ALL fp arithmetic, or for NONE; and turning it on (which is a simple compiler switch) slows down other parts of the program a lot, so for most curves it is better to have it off. B. WHAT IT DOES There are two main sub-cases depending on whether the curve has a point of order 2 or not. If so, it uses the 2-isogeny in the well-known way, and can list the quartics to be considered with little trouble. Then the only difficulty is finding rational points on them. I have successfully run curves of rank 13, such as Fermigier's [0,36861504658225,0,1807580157674409809510400,0] and also his rank 14 curve [0,2429469980725060,0,275130703388172136833647756388,0] and more recently (2001) Dujella's rank 15 curve [1,0,1,34318214642441646362435632562579908747,3184376895814127197244886284686214848599453811643486936756] all of which take less than 30 seconds with default parameters on an 800MHz Athlon. If there is no 2-torsion it goes back to the original Birch-Swinnerton-Dyer method, which involves searching for the quartics, and eliminating equivalent ones. The search region can be very large if the curve coefficients are large. Also the search is divided into between 1 and 4 sub-searches. Recent developments make this rather more efficient, (a) by improving the bounds, (b) by using a quadratic sieve in the search for quartics, and (c) by using maps to E(Qp)/2E(Qp) for certain auxiliary primes p. NB One effect of the last-named feature is that the program usually finds generators for E(Q)/2E(Q) rather than a complete set of coset representatives. In general, it will express E(Q)/2E(Q) as a direct sum A+B, and will give all nonzero elements of A and generators for B (the output will explain this when it occurs). The points in A are those which lie in 2E(Qp) for all the auxiliary primes used. For curves of higher rank one can increase the number of primes used from the default of 6 to something a little higher than the suspected rank, using the option "-x 8" say. This does carry a little overhead. Example: The curve [0,0,0,-9217,300985] has rank 7 and runs very quickly. With the default ("-x 6") we find three nonzero points in A, so rank(A)=2, and 5 generators of B, so rank(B)=5 and the total rank is 2+5=7. With "-x 9" this becomes 1+6=7, and with "-x 10" we have A=0. (These runs all took approx 3.8 seconds on my P90). After this stage we know the rank (either certainly, if all the everywhere-locally-soluble homogeneous spaces have rational points, or conditionally, if we have decided that some of them do not but have not proved that). Next, from each homogeneous space with a point we compute a point on the original curve. This gives a set of between r and 2^r-1 points (depending on how the rank is divided between the groups A and B defined above) covering the non-trivial cosets of 2E in E (when there is no 2-torsion), and a more complicated set of points when there is 2-torsion, also covering these cosets. [If nothing else, this gives one way of finding points on curves. For example the curve [0,0,0,0,-618] has rank 2, generated (up to finite odd index) by [19 : -79 : 1] of height 3.21143 and [550688955674 : 2182722347909 : 31136956136] of height 19.2662. A simple point search would take a very long time to find that second generator!] The third stage is to "saturate", i.e. enlarge the group of points found to a basis for the full Mordell-Weil group (so far we have a subgroup of finite ODD index). This stage (the "infinite descent") is now much more efficient than it used to be, but might still take a little time especially for curves of larger rank. It is possible that saturation might fail at some primes (i.e. at some prime p which could divide the index) in which case a warning will be output. The command-line flag -S may be used to change the default saturation behaviour: see file mwrank.options. Note that if the 2-descent has not been entirely conclusive (e.g. non-trivial III[2]) then the subgroup of points found will be saturated within the MW group, but saturation will never increase the rank. There are two ingredients in the saturation process: (1) determine an upper bound for the "saturation index", i.e. the index of (subgroup generated by) the known points in its saturation, and (2) for each prime p up to this bound, either prove that the points are already p-saturated, or enlarge by index p (repeatedly if necessary) until p-saturated. For some curves (notably those of high rank, such as the rank 15 curve in the test data) the index bound computed by the program is much too large for stage (2) to be practical (in that example the bound is nearly 10^50, for example). In this case the program will by default issue a warning (containing the index bound computed) and only saturate at primes up to 100. That bound can be increased using the command-line option -S. Alternatively, saturation can be turned off entirely using "-S 0". Also, if no points are to be output (i.e. with option -v 0 and neither -l nor -o) then no saturation is done as there is obviously no point. For stage (2) there is usually no problem, but if the program determines that the points are not p-saturated then it constructs a rational point P which is (probably) p times another rational point Q, and tries to divide P by p using the elliptic logarithm and exponential functions. This may fail if the precision is not high enough (for example with the rank 15 curve, the points found are not 3-saturated and require 2 steps of 3-saturation to gain index 9; but this only works with the LiDIA multi-precision version and at least 100 decimals (-p 100)). Saturation was implemented during 2004 and added to mwrank in January 2005; bug reports are of course welcome. ARITHMETIC mwrank and friends need to use a multi-precision integer package. The only one now supported is NTL. When you compile the source code, the configuration program will need to know where NTL is installed. The binaries will tell you when they start up which arithmetic they are using (unless you use the quiet flag "-q"). I no longer distribute binaries. It is recommended that you use the multi-precision floating point version for curves with large coefficients; otherwise results may be wrong. This is the default and requires no special configuration. You can aid the factorization of large integers in several ways: (a) Pari (i.e. the library libpari) is now a requirement, and is used to factorization of integers greater than a bound set to 10^8 in libsrc/marith.cc. This is the only use made of the Pari library. By default the pari library is initialized with parisize=1000000. If you see an error message saying " [hint] set 'parisizemax' to a non-zero value in your GPRC" do not follow the hint (which is wrong, we are not using gp at all) but instead set the environment variable PARI_SIZE to some larger value (e.g. do "export PARI_SIZE=100000000" but this will depend on your system). (b) By default the programs initialise an array of primes < 10^6, so will succeed in factoring all numbers < 10^8 by trial division. This default can be increased as follows: create a file called MAXPRIME containing a single integer, such as 2000000 or 10000000. Then this will be used instead of the default for the upper bound on precomputed primes. (c) If a file called PRIMES exists in the current directory, containing zero or more prime numbers (separated by whitespace, e.g. one per line), then the programs read this in at the start and use these for trial division as well as the main prime array. No check is made that these numbers are prime. This is an advantage if you make several runs with the same curve which has a discriminant which is hard to factor, since you can avoid doing the hard work more than once. Any other primes found during the run are added to the list, and the updated list is output to PRIMES at the end. NB This will cause problems if you do not have write permission in the current directory! DISCLAIMER You are welcome to use the program as is. There have been bugs and certainly there still are some. The program can and will be improved. Please report strange behaviour to me in a reasonable way (you must say when you got your copy of the program and include an input file which gives the problem); I do not guarantee to do anything about it -- I am busy and this is not a commercial package! -- but I will do my best. John Cremona (john.cremona@gmail.com) 3 February 1995, updated 12 January 1998, 25 September 2000, 5 July 2001, 12 November 2003, 5 January 2005, 10 May 2005, 31 December 2011, 2 January 2016, 15 August 2017. eclib-20250122/doc/mwrank/mwrank.options000066400000000000000000000070111474421343600200160ustar00rootroot00000000000000 COMMAND LINE OPTIONS FOR MWRANK Since December 1997, mwrank supports command-line options instead of prompting the user. All options have reasonable defaults. List of command line options, their meaning and default values (set in options.h) [q, l, t take no parameters; the others take an integer parameter "n"] -h help Displays a summary of this info and quits -q quiet mode flag Suppresses the header information (including the date of compilation) which is otherwise output and should be included in any problem/bug reports). Default is off (i.e. not quiet). Also suppresses prompting for curves -v n verbosity level Controls amount of output. Range 0..3. Default=1. Level 0 only outputs the rank. Use "-q -v 0" for minimal output, but note that if you also have "-c n" with nonzero n then you will cause a point search to be carried out, but you will not see its results! (Unless -o is used). Details of point search only shown if verbosity is > 1. -o output pari Outputs a very terse summary of the results for use by PARI/GP with suitable interface. Format: Either [[r],[P1,P2,...,Pr]] where r is the rank and P1,...,Pr are r independent points; or [[r,r'],[P1,P2,...,Pr]] where r and r' are lower and upper bounds on the rank and P1,...,Pr are r independent points; Can be used in addition to other output options (controlled by -v); for minimal useful output use "-q -v 0 -o" -p n precision (#bits) Only relevant for the multiprecision floating point version. Range 1..large, default 50. This is bit precision. Stringly recommended to increase for curves with 2-torsion where a second descent is used since then the reduction applied to second descent quartics is more effective. -b n height bound for quartic point search. Range 1..15, default 10. -x n number of auxiliary primes used for syzygy sieving. Range 0..,default 15. Only relevant for curves with no 2-torsion. Worth increasing either for curves with large discriminant, or for curves with suspected large rank r, for which r+1 or r+2 are suitable values. -l points output flag. Controls whether generating points are output. Defaults to value of "verbosity", so the only function is to turn this part of the output on when verbosity is 0 (i.e. -v 0 -l). -t quartic equivalence test flag. For debugging only. Default off. -s selmer_only If set, does local tests on homogeneous spaces only, which can be much quicker for curves with 2-torsion. NB for curves with no 2-torsion this computes the 2-Selmer rank exactly; for curves with 2-torsion it computes an upper bound for the rank based on various Selmer groups, possibly less than that from the 2-Selmer group itself. If unset (the default) then rational points are sought, to give a lower bound for the rank also. -d skip_2nd_descent Only relevant for curves with 2-torsion; unset by default. If set, does no second descent either locally or globally, which in general gives a larger upper bound for the rank and a smaller lower bound. I recommend setting this if using mwrank with no multiprecision floating point arithmetic. -S saturation_bound (non-negative integer or -1) controls saturation 0: do no saturation at all n: use n as upper bound for saturation primes -1: allow progam to determine upper bound automatically (but that will be reduced to a default maximum of 100 if it is greater) Last update: 2016-01-02 eclib-20250122/doc/mwrank/mwrank.readme000066400000000000000000000100011474421343600175510ustar00rootroot00000000000000README file for programs mwrank, findinf, ratpoint There are three main programs for elliptic curves in this distribution: mwrank, point_search and quartic_points. The first two work on elliptic curves over Q given by Weierstrass equations with standard coefficients [a1,a2,a3,a4,a6]. If the input curve is non-minimal or non-standard (where standard means a1,a3 in {0,1} and a2 in {-1,0,1}) the input curve is replaced by a standard minimal model, and points found are transferred back to the original input model. The programs tell you when the model is changed. In all cases there are 2 possible input formats for curves: [a1,a2,a3,a4,a6] a1 a2 a3 a4 a6 So if the first character read is '[' it expects a single non-space delimiter between coefficients and one at the end; otherwise it expects 5 integers separated by space. If the input is invalid the programs stop, so you can use 0 0 0 0 0 to end the input stream. point_search searches for points on the curves up to a given bound on the logarithmic height, using sieving. One can opt for either seeing all points as they are found (verbose=1) or nothing until a final report (verbose=0); also, if verbose=1 then one can opt for a simple list of the points found, with no post-processing, or a full processing of the points to find linear dependencies between them using the height pairing. The "regulator" output is just the regulator of the subgroup of points found. Currently the sieve is based on Michael Stoll's programme (which originated with a program of Elkies, with developments by Stoll and Colin Stahlke). Added in Jan 2005: the subgroup of points found is (by default) automatically saturated at the end. mwrank is described more fully in the file mwrank.info. Briefly, mwrank does a 2-descent to determine the rank and gives points covering the cosets of 2E(Q) in E(Q); it then goes on to complete to a Mordell-Weil basis via a sieve-based saturation process after determining an upper bound for the index. quartic_points works with quartics g(x) with integer coefficients, g(x)=a*x^4+b*x^3+c*x^2+d*x+e. It finds the Jacobian E of the curve C:y^2=g(x), searches C for rational points and maps any point found to E using the 2-covering map. Current version quits as soon as one point on C is found. Other programs: tmrank is a version of mwrank designed for testing with the input file tmrank.in. Each line of tmrank.in contains a curve and its correct rank, and tmrank uses mwrank to compute the rank and checks the result. tate: Runs Tate's algorithm, outputs detail of reduction types etc. conductor: just output conductor torsion: outputs number (and optionally structure) of torsion points allisog: find the complete isogeny class of the input curve by computing a succession of isogenies of prime degree. WARNING: this is unreliable and causes lots of warning messages if run in standard precision. With higher precision (under LiDIA) it is reliable, though a lot slower. I also have a Pari/GP program to do the same thing, available on request. These four can be run interactively (by entering "tty" for the input filename at the prompt) or in batch mode by entering the filename. The file should contain a list of curves in the standard format, with [0,0,0,0,0] to terminate cleanly. twist: computes quadratic twists of a given curve, giving their minimal models etc. Interactive. indep: tests whether given points on a curve are independent, using 2-descent NOT heights. Test with "indep < e23". Systems supported: no binaries are now provided, only source. Sources: Available from https://github.com/JohnCremona/eclib/ It requires pre-installation of Pari and NTL. John Cremona john.cremona@gmail.com original: 6/2/95 updated: 7/8/95, 12/1/98, 20/4/00, 16/8/00, 5/7/01, 7/1/05, 10/5/05, 31/12/11, 2/1/16 eclib-20250122/doc/progs.txt000066400000000000000000000131451474421343600155030ustar00rootroot00000000000000User programs and documentation ================================================================================ A: Two programs for solving conics over Q, using methods described in Cremona & Rusin, "Efficient solution of rational conics", Mathematics of Computation, 72 (2003), no. 243, pages 1417-1441. -------------------------------------------------------------------------------- 1 solve_conic Solves "semi-diagonal" conics, with equations of the form ax^2+bxz+cz^2=dy^2. Input: 4 integers a b c d, repeat until d=0 is input. Requires d(b^2-4ac) nonzero. Output: both a single solution and a parametric solution. Options (set via compiler flags, not at run-time): 1. TEST_PARAM (default set): if set, outputs parametric solution. 2. VERBOSITY (default=0): if positive, outputs details during solution. 3. CONIC_METHOD (default 4): control which algorithm to use: 0: simple recursion, no reduction 1: recursion with algebraic reduction (Denis Simon) 2: recursion with lattice reduction (best non-factn-free) 3: obsolete 4: Uses factorization-free reduction (best) 5: Uses LLL method -------------------------------------------------------------------------------- 2 solve_legendre Solves diagonal conics, or Legendre equations, of the form ax^2+by^2+cz^2=0. Input: 3 integers a b c, repeat until a=0 is input. Requires abc non-zero. Output: both a single solution and a parametric solution. Options (set via compiler flags, not at run-time): same as solve_conic ================================================================================ B: Two programs for binary cubic forms over Q, using methods described in "Reduction of binary cubic and quartic forms", LMS JCM 2 (1999), 62--92. -------------------------------------------------------------------------------- 1 reduce_cubics Reduces binary cubic forms with integral coefficients (a,b,c,d) Input: 4 integers a b c d, repeat until all are 0 Output: an equivalent reduced cubic with the SL(2,Z) reducing transform. -------------------------------------------------------------------------------- 2 list_cubics Lists binary cubic forms with integral coefficients and given discriminant bound Input: 1 integers maxd Output: if maxd>0: a list of reduced cubics with 0disc>maxd ================================================================================ C: Two programs for elliptic curves over Q (NB Only a small part of the library functionality is represented here) -------------------------------------------------------------------------------- 1 point_search Program to process and/or search for points on an elliptic curve (using an interface to Stoll's ratpoints together with saturation and independence checking of points found) Input: (real) bound on naive height (int) verbosity flag (int) option (1) process points found (2) just list them (list of ints or rationals) [a1,a2,a3,a4,a6] (or a1 a2 a3 a4 a6) curve coefficients, all 0 or EOF to stop (int) Number of points on the curve to be input (usually 0) (int) Rank bound (serach stops when this is reached) (list of triples of ints) known points as [x:y:z] with x,y,z ints. Output: (1) details of any points input, rank and regulator (2) some details of point search, relations between points found, saturation processing, ending with a list of independent points generating the saturation of the points input&found, rank and regulator. -------------------------------------------------------------------------------- 2 indep_test Program to test points on an elliptic curve for independence, using the method described in "On the computation of Mordell-Weil and 2-Selmer Groups of Elliptic Curves", Rocky Mountain Journal 32 no.3 (2002), pp. 953--967. Input: (int) verbosity flag (list of ints or rationals) [a1,a2,a3,a4,a6] (or a1 a2 a3 a4 a6) curve coefficients, all 0 or EOF to stop (int) Number of points on the curve to be input (int) Number of auxiliary primes to use (use rank + a few) Output: (1) Details of test (using reduction of E(Q)/2E(Q)) modulo auxiliary primes (2) Conclusion: certainly independent, or possibly dependent ================================================================================ D: Two-descent and two-coverings of elliptic curves over Q -------------------------------------------------------------------------------- 1 mwrank Documented separately -------------------------------------------------------------------------------- 2 reduce_quartics Program to minimise and reduce (integral binary) quartics Input: Quartic coefficients (a,b,c,d,e), integers, repeated: all 0 to finish Output: Details of minimisation and reduction, ending with a minimal reduced quartic and the associated transform. -------------------------------------------------------------------------------- 3 quartic_points Program to check local solubility and (if locally soluble) search for rational points on a quartic (2-covering of an elliptic curve). Points found are mapped to the Jacobian curve via the 2-covering map. Input: (int) verbosity flag (list of ints) (a,b,c,d,e) quartic coefficients, all 0 to stop (real) naive height bound Output: (1) information about local solubility (2) information about point search, points found on the quartic and their images on the Jacobian elliptic curve. eclib-20250122/doc/sage_packaging.txt000066400000000000000000000017161474421343600172750ustar00rootroot00000000000000Notes on how to package a new version of eclib for Sage After making a new eclib release VERSION: 1. make dist-bzip2 This creates the file eclib-.tar.bz2 Copy it to ~/sage/upstream 2. In ~/sage, checkout the development branch, update it from github and run "make". 3. Make a new sage branch, say git checkout -b eclib- 4. In ~/sage/build/pkgs/eclib, update the version number in package-version.txt and spkg-configure.m4 5. Run (using this sage) sage --package fix-checksum eclib 6. Build this new eclib in sage, with checks: sage -i -c eclib [Doing 'make eclib' is also OK, but does not run eclib's checks.] 7. Test sage to see if any doctests need changing. Start with: sage -t --long src/sage/libs/eclib sage -t --long src/sage/schemes/elliptic_curves 8. Make a github release and upload eclib-.tar.bz2 to it. 9. Commit the changes to sage, upload the branch to github and create a Pull Request. eclib-20250122/eclib.pc.in000066400000000000000000000004121474421343600150430ustar00rootroot00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@prefix@/include Name: @PACKAGE_NAME@ Description: C++ code for computations with elliptic curves, including mwrank, etc. Version: @PACKAGE_VERSION@ Libs: -L${libdir} -lec Cflags: -I${includedir} eclib-20250122/how-to-profile.txt000066400000000000000000000003671474421343600164610ustar00rootroot00000000000000make clean CXXFLAGS='-pg' LDFLAGS='-pg -static' ./configure --prefix=$PWD --with-flint=/usr/local --with-pari=/usr/local make cd tests # or progs libtool --mode=execute ./tmanin # this creates gmon.out libtool --mode=execute gprof ./tmanin| less eclib-20250122/libsrc/000077500000000000000000000000001474421343600143155ustar00rootroot00000000000000eclib-20250122/libsrc/GetOpt.cc000066400000000000000000000207271474421343600160360ustar00rootroot00000000000000/* Getopt for GNU. Copyright (C) 1987, 1989 Free Software Foundation, Inc. (Modified by Douglas C. Schmidt for use with GNU G++.) This file is part of the GNU C++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef __GNUG__ #pragma implementation #endif // /* AIX requires the alloca decl to be the first thing in the file. */ // #ifdef __GNUC__ // #define alloca __builtin_alloca // #elif defined(sparc) // #include // extern "C" void *__builtin_alloca(...); // #elif defined(_AIX) // #pragma alloca // #else // char *alloca (); // #endif #include char* GetOpt::nextchar = 0; int GetOpt::first_nonopt = 0; int GetOpt::last_nonopt = 0; GetOpt::GetOpt (int argc, char **argv, const char *optstring) :opterr (1), nargc (argc), nargv (argv), noptstring (optstring) { /* Initialize the internal data when the first call is made. Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ first_nonopt = last_nonopt = optind = 1; optarg = nextchar = 0; /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') ordering = RETURN_IN_ORDER; else if (getenv ("_POSIX_OPTION_ORDER") != 0) ordering = REQUIRE_ORDER; else ordering = PERMUTE; } void GetOpt::exchange (char **argv) const { int nonopts_size = (last_nonopt - first_nonopt) * sizeof (char *); char **temp = new char*[nonopts_size]; // char **temp = (char **) alloca (nonopts_size); /* Interchange the two blocks of data in argv. */ memcpy (temp, &argv[first_nonopt], nonopts_size); memcpy (&argv[first_nonopt], &argv[last_nonopt], (optind - last_nonopt) * sizeof (char *)); memcpy (&argv[first_nonopt + optind - last_nonopt], temp, nonopts_size); /* Update records for the slots the non-options now occupy. */ first_nonopt += (optind - last_nonopt); last_nonopt = optind; delete[] temp; } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If `getopt' is called repeatedly, it returns successively each of theoption characters from each of the option elements. If `getopt' finds another option character, it returns that character, updating `optind' and `nextchar' so that the next call to `getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, `getopt' returns `EOF'. Then `optind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. A colon in OPTSTRING means that the previous character is an option that wants an argument. The argument is taken from the rest of the current ARGV-element, or from the following ARGV-element, and returned in `optarg'. If an option character is seen that is not listed in OPTSTRING, return '?' after printing an error message. If you set `opterr' to zero, the error message is suppressed but we still return '?'. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in `optarg'. If OPTSTRING starts with `-', it requests a different method of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER, above. */ int GetOpt::operator () (void) { if (nextchar == 0 || *nextchar == 0) { if (ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (first_nonopt != last_nonopt && last_nonopt != optind) exchange (nargv); else if (last_nonopt != optind) first_nonopt = optind; /* Now skip any additional non-options and extend the range of non-options previously skipped. */ while (optind < nargc && (nargv[optind][0] != '-' || nargv[optind][1] == 0)) optind++; last_nonopt = optind; } /* Special ARGV-element `--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (optind != nargc && !strcmp (nargv[optind], "--")) { optind++; if (first_nonopt != last_nonopt && last_nonopt != optind) exchange (nargv); else if (first_nonopt == last_nonopt) first_nonopt = optind; last_nonopt = nargc; optind = nargc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (optind == nargc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (first_nonopt != last_nonopt) optind = first_nonopt; return EOF; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if (nargv[optind][0] != '-' || nargv[optind][1] == 0) { if (ordering == REQUIRE_ORDER) return EOF; optarg = nargv[optind++]; return 0; } /* We have found another option-ARGV-element. Start decoding its characters. */ nextchar = nargv[optind] + 1; } /* Look at and handle the next option-character. */ { char c = *nextchar++; char *temp = (char *) strchr (noptstring, c); /* Increment `optind' when we start to process its last character. */ if (*nextchar == 0) optind++; if (temp == 0 || c == ':') { if (opterr != 0) { if (c < 040 || c >= 0177) fprintf (stderr, "%s: unrecognized option, character code 0%o\n", nargv[0], c); else fprintf (stderr, "%s: unrecognized option `-%c'\n", nargv[0], c); } return '?'; } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*nextchar != 0) { optarg = nextchar; optind++; } else optarg = 0; nextchar = 0; } else { /* This is an option that requires an argument. */ if (*nextchar != 0) { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == nargc) { if (opterr != 0) fprintf (stderr, "%s: no argument for `-%c' option\n", nargv[0], c); c = '?'; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = nargv[optind++]; nextchar = 0; } } return c; } } eclib-20250122/libsrc/Makefile.am000066400000000000000000000070261474421343600163560ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in if NO_MPFP MPFP_SWITCH="-DNO_MPFP" else MPFP_SWITCH= endif LDFLAGS_BOOST = $(BOOST_LDFLAGS) $(BOOST_ASIO_LDFLAGS) $(BOOST_THREAD_LDFLAGS) BOOST_LIBS = $(BOOST_ASIO_LIB) $(BOOST_THREAD_LIB) AM_CPPFLAGS = $(FLINT_CFLAGS) $(NTL_CFLAGS) $(PARI_CFLAGS) $(BOOST_CPPFLAGS) $(MPFP_SWITCH) $(PTHREAD_CFLAGS) AM_LDFLAGS = $(FLINT_LDFLAGS) $(NTL_LDFLAGS) $(PARI_LDFLAGS) $(LDFLAGS_BOOST) $(PTHREAD_CFLAGS) $(PTHREAD_LDFLAGS) LIBS = $(FLINT_LIBS) $(NTL_LIBS) $(PARI_LIBS) $(BOOST_LIBS) $(PTHREAD_LIBS) lib_LTLIBRARIES = libec.la PROCS_DOTHS = eclib/interface.h eclib/templates.h eclib/arith.h eclib/xmod.h eclib/marith.h eclib/bigcomplex.h eclib/compproc.h eclib/vec.h eclib/vector.h eclib/mat.h eclib/matrix.h eclib/sub.h eclib/subspace.h eclib/rat.h eclib/bigrat.h eclib/kbessel.h eclib/svec.h eclib/svector.h eclib/smat.h eclib/smatrix.h eclib/smat_elim.h eclib/smatrix_elim.h eclib/method.h eclib/splitbase.h eclib/xsplit.h eclib/conic.h eclib/legendre.h eclib/quadratic.h eclib/unimod.h eclib/illl.h eclib/hilbert.h eclib/timer.h eclib/cubic.h eclib/gf.h eclib/polys.h eclib/realroots.h eclib/parifact.h eclib/p2points.h eclib/xsplit_data.h eclib/threadpool.h eclib/logger.h eclib/types.h eclib/flinterface.h QCURVES_DOTHS = eclib/curve.h eclib/points.h eclib/cperiods.h eclib/isogs.h eclib/reader.h eclib/mwprocs.h eclib/lambda.h eclib/sifter.h eclib/sieve_search.h eclib/htconst.h eclib/egr.h eclib/saturate.h eclib/divpol.h eclib/pointsmod.h eclib/curvemod.h eclib/ffmod.h eclib/tlss.h eclib/elog.h eclib/getcurve.h QRANK_DOTHS = eclib/mrank2.h eclib/mequiv.h eclib/mlocsol.h eclib/mglobsol.h eclib/msoluble.h eclib/mquartic.h eclib/mrank1.h eclib/qc.h eclib/sqfdiv.h eclib/version.h eclib/minim.h eclib/reduce.h eclib/transform.h eclib/desc2.h eclib/bitspace.h eclib/options.h eclib/GetOpt.h eclib/twoadic.h eclib/descent.h G0N_DOTHS = eclib/periods.h eclib/cusp.h eclib/homspace.h eclib/newforms.h eclib/moddata.h eclib/oldforms.h eclib/symb.h eclib/fixc6.h eclib/pcprocs.h eclib/nfd.h eclib/curvesort.h DOTHS = $(PROCS_DOTHS) $(QCURVES_DOTHS) $(QRANK_DOTHS) $(G0N_DOTHS) PROCS_DOTCCS = interface.cc unimod.cc arith.cc marith.cc compproc.cc vector.cc matrix.cc subspace.cc kbessel.cc svector.cc smatrix.cc smatrix_elim.cc xsplit.cc conic.cc legendre.cc quadratic.cc illl.cc hilbert.cc timer.cc cubic.cc polys.cc realroots.cc parifact.cc p2points.cc gf.cc xsplit_data.cc threadpool.cc logger.cc QCURVES_DOTCCS = curve.cc curvedata.cc curvered.cc points.cc cperiods.cc isogs.cc heights.cc mwprocs.cc lambda.cc sifter.cc sieve_search.cc htconst.cc egr.cc saturate.cc divpol.cc pointsmod.cc curvemod.cc ffmod.cc tlss.cc elog.cc getcurve.cc QRANK_DOTCCS = mequiv.cc mrank1.cc mlocsol.cc mglobsol.cc mquartic.cc mrank2.cc qc.cc sqfdiv.cc version.cc minim.cc reduce.cc transform.cc desc2.cc bitspace.cc GetOpt.cc twoadic.cc descent.cc G0N_DOTCCS = newforms.cc symb.cc homspace.cc cusp.cc oldforms.cc fixc6.cc periods.cc moddata.cc pcprocs.cc nfd.cc curvesort.cc DOTCCS = $(PROCS_DOTCCS) $(QCURVES_DOTCCS) $(QRANK_DOTCCS) $(G0N_DOTCCS) # NB Do NOT include the following files above, since they are not # compiled by themselves but only included in other files which are # compiled. But they do need to be in the distribution made by "make # dist" so we must list them here: EXTRA_DIST = vec.cc mat.cc sub.cc smat.cc svec.cc smat_elim.cc random.cc libec_la_SOURCES = $(DOTCCS) libec_la_LDFLAGS = -no-undefined $(AM_LDFLAGS) -version-info @LT_CURRENT@:@LT_REVISION@:@LT_AGE@ nobase_include_HEADERS = $(DOTHS) ACLOCAL_AMFLAGS = -I m4 eclib-20250122/libsrc/arith.cc000066400000000000000000000365501474421343600157440ustar00rootroot00000000000000// arith.cc: definitions of arithmetic functions (single precision) ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include /* Prime number procs; adapted from Pari */ // These have not been stl-ized at all since they work just fine... primeclass the_primes; // The one and only instance primeclass::primeclass() { pdiffptr=0; // will be allocated in init() ifstream pfile("MAXPRIME"); if(!pfile) { init(1000000); // default value } else { long maxnum; pfile>>maxnum; init(maxnum); } } primeclass::primeclass(long maxnum) { pdiffptr=0; // will be allocated in init() init(maxnum); } void primeclass::init(long maxnum) /* initializes variable pdiffptr */ /* to give primes up to maxnum */ { long k,size=(maxnum+257)>>1; if(pdiffptr) delete [] pdiffptr; byteptr p= new unsigned char[size+1]; if (!p) {cerr<<"Out of memory in primeclass::init!"<=fin) break; *r++=(q-s)<<1; s=q; } *r++=0; NPRIMES=r-p-1; BIGGESTPRIME=((s - p) << 1) + 1; // cout<<"Near end of init, NPRIMES = "< primeclass::getfirst (long n) /* returns list of first n primes */ { // cout << "In primeclass::getfirst("< ans; reset(); int ok=1; for (long i=0; (i=0 such that p is the i'th prime long prime_pi(long p) { primevar pr; int ip=0; while ((long)pra) p=a; // N.B. this causes a=1 to return 1. Beware! } if (p==0) {p=a; cout<<"No prime divisor found for "< pdivs(long aa) {vector plist; primevar pr; long a = abs(aa); while ( (a>1) && (pr.ok())) { long p = pr; ++pr; if (a%p==0) { plist.push_back(p); while (a%p==0) a/=p; //divide out by all the p's in a } else if (p*p>a) { plist.push_back(a); a=1; } } if (a>1) {plist.push_back(a);} //In case of p-factors outside range, assume //the cofactor is prime. return plist; } vector posdivs(long a, const vector& plist) { // cout << "In posdivs with a = " << a << endl; // cout << plist.size() << " primes: " < dlist(1,1); // cout << "Divisor 0 = 1" << endl; for (const auto& p : plist) { long e = val(p,a); dlist.resize((e+1)*dlist.size()); for (long j=0; j alldivs(long a, const vector& plist) {//cout << "In alldivs with a = " << a << endl; // cout << plist.size() << " primes: " < dlist(1,1); // cout << "Divisor 0 = 1" << endl; dlist.push_back(-1); // cout << "Divisor 1 = -1" << endl; for (const auto& p : plist) { long e = val(p,a); dlist.resize((e+1)*dlist.size()); for (long j=0; j sqdivs(long a, const vector& plist) { long nd = 1; vector dlist(1,1); for (const auto& p : plist) { long e = val(p,a)/2; dlist.resize((e+1)*dlist.size()); for (long j=0; j sqfreedivs(long a, const vector& plist) { long nd = 1; vector dlist(1,1); for (const auto& p : plist) { long e = 1; dlist.resize((e+1)*dlist.size()); for (long j=0; j0, rounded_division(a,b) = q such that a/b = q + r/b with -1/2 <= r/b < 1/2 long rounded_division(long a, long b) { std::ldiv_t qr = ldiv(a, b); long r = qr.rem, q = qr.quot; long r2 = r<<1; return (r2<-b? q-1: (r2>=b? q+1: q)); } long mod(long a, long b) {long c; if (b<0) b=-b; if (a>=0) c=a%b; else c=b-((-a)%b); if (c>(b>>1)) c-=b; return(c); } long mod(int a, long b) {long c; if (b<0) b=-b; if (a>=0) c=a%b; else c=b-((-a)%b); if (c>(b>>1)) c-=b; return(c); } int mod(int a, int b) {int c; if (b<0) b=-b; if (a>=0) c=a%b; else c=b-((-a)%b); if (c>(b>>1)) c-=b; return(c); } int mod(long a, int b) { return (int)mod(a,(long)b); } long posmod(long a, long b) { long c=a%b; if (c<0) return(c+b); return(c); } long posmod(int a, long b) { long c=(long(a))%b; if (c<0) return(c+b); return(c); } int posmod(int a, int b) { int c=a%b; if (c<0) return(c+b); return(c); } int posmod(long a, int b) { return (int)posmod(a, (long)b); } long gcd(long a, long b) { if ((a==1)||(b==1)) return 1; if (a==0) return abs(b); while (b!=0) {long c=a%b; a=b; b=c;} return abs(a); } int gcd(int a, int b) { if ((a==1)||(b==1)) return 1; if (a==0) return abs(b); while (b!=0) {int c=a%b; a=b; b=c;} return abs(a); } long lcm(long a, long b) { long g=gcd(a,b); if(g==0) return 0; return a*(b/g); } long bezout(long aa, long bb, long& xx, long& yy) {long a = aa, b = bb, x = 0, oldx = 1, y = 1, oldy = 0; while (b!=0) { long q = a/b; long c = a - q*b; a = b; b = c; long newx = oldx - q*x; oldx = x; x = newx; long newy = oldy - q*y; oldy = y; y = newy; } if (a<0) {xx=-oldx; yy=-oldy; return(-a);} else {xx= oldx; yy= oldy; return( a);} } long invmod(long a, long p) {long g,x,y; g=bezout(a,p,x,y); if (g==1) return x; else { cout << "invmod called with " << a << " and " << p << " -- not coprime!"< void gauss_reduce(long a0, long b0, long c0, long d0, long& a, long& b, long& c, long& d) { a=a0; b=b0; c=c0; d=d0; #ifdef DEBUG_MODRAT cout<<"Initial (a,b) = ("<=0, return 1 iff exact int isqrt(long a, long& root) { if (a<0) {return 0;} root = round(sqrt(a)); return a==root*root; } // return rounded sqrt(a) (undefined for a<0) long isqrt(const long a) { long r; isqrt(a,r); return r; } long squarefree_part(long d) { if (d==0) return d; long maxd = sqdivs(d).back(); return (d/maxd)/maxd; } long chi4(long a) { static const long table4[4] = {0,1,0,-1}; return table4[posmod(a,4)]; } long hilbert2(long a, long b) { static long table44[4][4] = {{0,0,0,0}, {0,1,0,1}, {0,0,0,0}, {0,1,0,-1}}; return table44[posmod(a,4)][posmod(b,4)]; } long leg(long a, long b) //nb this function is not intended for public use { long aa = a; long bb = b; long ans = 1; while (bb>1) { aa = aa % bb; if (aa<0) {aa=-aa; ans*=chi4(bb);} while (!(aa%4)) {aa/=4;} if (!(aa%2)) {aa/=2; ans *= chi2(bb);} ans*=hilbert2(aa,bb); long c=bb; bb=aa; aa=c; } return ans; } long legendre(long a, long b) { return (((gcd(a,b)==1) && (b%2)) ? leg(a,b) : 0); } // Function which returns 1 and sets e such that 2**e=n if n is a power of 2. // If the "roundup" flag is set and n is not a power of 2 it increases n to // the next power of 2 (and returns 0) int intlog2(long& n, long& e, int roundup) { e = 0; if (n<1) {if(roundup) n=1; return 0;} long m=n; while (m) { m >>= 1; e++; } e--; m=1<>=r; } else return 0; } x1=x%y; if (x1<0) x1+=y; while (x1) { r=val2(x1); if (r) { if (odd(r) && labs((y&7)-4) == 1) s= -s; x1>>=r; } if (y&2 && x1&2) s= -s; long z=y%x1; y=x1; x1=z; } return (y==1)? s: 0; } long val2(unsigned long z) { int v=0; while (!(z&1)) {v++; z>>=1;} return v; } int is_squarefree(long n) { if(n%4==0) return 0; if(n%9==0) return 0; if(n%25==0) return 0; if(n%49==0) return 0; auto plist = pdivs(n); return std::all_of(plist.begin(), plist.end(), [n] (const long& p) {return val(p,n)==1;}); } int is_valid_conductor(long n) { if (n<11) return 0; long m=n, e; e=0; while(!(m&1)) {e++; m>>=1;} if(e>8) return 0; e=0; while(!(m%3)) {e++; m/=3;} if(e>5) return 0; auto plist = pdivs(m); return std::all_of(plist.begin(), plist.end(), [m] (const long& p) {return val(p,m)<=2;}); } // a=b*q+r, return 1 iff r==0 int divrem(long a, long b, long& q, long& r) { std::ldiv_t qr = ldiv(a, b); r = qr.rem; q = qr.quot; return (r==0); } // a=b*q+r, return 1 iff r==0 int divrem(int a, int b, int& q, int& r) { std::div_t qr = div(a, b); r = qr.rem; q = qr.quot; return (r==0); } // return list of integers from first to last inclusive vector range(long first, long last) { vector ans(last-first+1); std::iota(ans.begin(), ans.end(), first); return ans; } /* END OF FILE */ eclib-20250122/libsrc/bitspace.cc000066400000000000000000000035041474421343600164200ustar00rootroot00000000000000// bitspace.cc: implementation of class bitspace for handling F_2 spaces ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #include bitspace::bitspace(long d) { if(d<0) { cout<<"Error in bitspace constructor with negative dimension "<NTL_BITS_PER_LONG) { cout<<"Error in bitspace constructor with dimension "<" <=0; j--) if(testbit(v,j)) {return j;} return -1; } void bitspace::augment(unsigned long v, long piv) { gens[dim]=v; pivs[dim]=piv; bitmask |= (1< int is_real(const bigcomplex& z) {return(is_approx_zero(imag(z)));} int is_small(bigfloat x) {return is_approx_zero(x);} int is_small(const bigcomplex& z){return is_approx_zero(z);} void orderreal(bigfloat& e1, bigfloat& e2, bigfloat& e3) // puts in decreasing order { bigfloat t; if (e1 < e3) {t=e1; e1=e3; e3=t;} //swap(e1,e3); if (e1 < e2) {t=e1; e1=e2; e2=t;} //swap(e1,e2); else if (e2 < e3) {t=e2; e2=e3; e3=t;} //swap(e2,e3); } //#define DEBUG_CAGM bigcomplex cagm(const bigcomplex& a, const bigcomplex& b) { bigcomplex x=a, y=b, oldx; #ifdef DEBUG_CAGM cout<<"cagm("<piby2) || (theta<=-piby2)) y=-y; #ifdef DEBUG_CAGM cout<<"Relative error = "< roots(3); if (is_real_zero(abs(disc))) {if (is_real_zero(abs(p3))) // triple root {roots[0]=roots[1]=roots[2]= mc1over3; } else // double root {roots[0]=roots[1]= (c1*c2 - to_bigfloat(9)*c3)/( p3+p3); roots[2]=-( roots[0] + roots[0]+c1); } } else // distinct roots { bigcomplex q = (((mc1over3+c1)*mc1over3 +c2)*mc1over3 +c3); // = F(mc1over3); if (is_approx_zero(abs(p3))) // pure cubic { roots[0]=-cube_root(q); roots[1]=w*roots[0]; roots[2]=w*roots[1]; roots[0]+=mc1over3; roots[1]+=mc1over3; roots[2]+=mc1over3; } else {bigcomplex d = to_bigfloat(729)*q*q+ to_bigfloat(4)*p3*p3*p3; #ifdef DEBUG_CUBIC cout << "q = " << q << ", p3 = " << p3 << ", d = " << d << "\n"; #endif bigcomplex t1cubed = to_bigfloat(0.5)*(sqrt(d)- to_bigfloat(27)*q); #ifdef DEBUG_CUBIC cout << "t1cubed = " << t1cubed << endl; #endif if (is_approx_zero(abs(t1cubed))) // approximately pure cubic { #ifdef DEBUG_CUBIC cout << "t1cubed approx 0 so treating as pure cubic " << endl; #endif roots[0]=-cube_root(q); roots[1]=w*roots[0]; roots[2]=w*roots[1]; roots[0]+=mc1over3; roots[1]+=mc1over3; roots[2]+=mc1over3; for(i=0; i<3; i++) { bigcomplex z = roots[i], fz, fdashz; for(iter=0; iter solverealquartic(const bigfloat& a, const bigfloat& b, const bigfloat& c, const bigfloat& d, const bigfloat& e) { #ifdef DEBUG cout<<"In solverealquartic with (a,b,c,d,e)=("<0)) {type=2;} // 4 real roots else {type=1;} // 0 real roots } bigcomplex c1(to_bigfloat(0)), c2(-3*ii), c3(jj); #ifdef DEBUG int nrr = (type=1? 0 : (type=2? 4 : 2)); cout<<"Type = " << type << " ("< cphi = solvecubic( c1, c2, c3); vector roots(4); bigfloat a4=4*a; bigfloat oneover4a = to_bigfloat(1)/a4; #ifdef DEBUG cout<<"Roots of cubic are:\n"<0) orderreal(phi1,phi2,phi3); else orderreal(phi3,phi2,phi1); #ifdef DEBUG cout<<"phi = "<0) r1 = -r1; #ifdef DEBUG cout<<"r_i = "< #include #include //#define DEBUG_CONIC //#define DEBUG_CONIC_2 #ifndef TRACE_FACTORIZATION #define TRACE_FACTORIZATION 0 #endif //#define DEBUG_REDUCE #define REDUCE_INTERMEDIATES // reduces intermediate solutions //#define MORDELL_REDUCE // else use JC's (faster!) reduction via quadratics // CONIC_METHODS: // // 0: simple recursion, no reduction // 1: recursion with algebraic reduction (Denis Simon) // 2: recursion with lattice reduction (best non-factn-free) // 3: obsolete // 4: Uses factorization-free reduction from legendre.cc (best) // 5: Uses LLL method from legendre.cc int solve_conic(const quadratic& q, const bigint& d, bigint& x, bigint& y, bigint& z, int method) { return solve_conic(q[0],q[1],q[2],d,x,y,z,method); } int solve_conic(const quadratic& q, const bigint& d, const vector& factorbase, bigint& x, bigint& y, bigint& z, int method) { return solve_conic(q[0],q[1],q[2],d,factorbase,x,y,z,method); } int solve_conic(const bigint& a, const bigint& b, const bigint& c, const bigint& d, bigint& x, bigint& y, bigint& z, int method) { vector factorbase = pdivs(2*d); factorbase=vector_union(factorbase,pdivs(a)); factorbase=vector_union(factorbase,pdivs((is_zero(b)? c : b*b-4*a*c))); return solve_conic(a,b,c,d,factorbase,x,y,z,method); } int solve_conic(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const vector& factorbase, bigint& x, bigint& y, bigint& z, int method) // Solves axx+bxz+czz=dyy for (x,y,z) not (0,0,0) and returns 1 // or returns 0 if not possible // Should have a, c, d, bb-4ac non-zero { if(method>3) { int use_lll=0; if(method==5) use_lll=1; if(is_zero(b)) return legendre_solve(a,-d,c,factorbase,x,y,z,use_lll); bigint aa=sqr(b)-4*a*c, bb=a*d; bigint one, zero; one=1; zero=0; if(!legendre_solve(one,-aa,-bb,factorbase,x,z,y,use_lll)) return 0; #ifdef DEBUG_CONIC testsol(one,zero,-aa,bb,x,y,z,1); #endif // DEBUG_CONIC x=x-b*z; y*=a; z*=(2*a); #ifdef DEBUG_CONIC testsol(a,b,c,d,x,y,z,1); #endif // DEBUG_CONIC cancel(x,y,z); return 1; } else // method = 0, 1, 2, 3 { int verb=0; #ifdef DEBUG_CONIC verb=1; #endif // DEBUG_CONIC //All this function does is complete the square (if nec.) and pass to the next bigint aa, bb, xx, yy, zz, a1,a2,b1,b2; vector aplist, bplist, cplist, dplist; int nondiag=!is_zero(b); bb=a*d; aa=-a*c; if(nondiag) aa=sqr(b)-4*aa; aplist=factorbase; bplist=factorbase; sqfdecomp(aa,aplist,a1,a2); // aa=a1*a2^2 sqfdecomp(bb,bplist,b1,b2); // bb=b1*b2^2 if(!testlocsol(a1,aplist,b1,bplist)) return 0; if(solve_conic_diag(a1,aplist,b1,bplist,x,y,z,method)) { conic_diag_reduce(a1,b1,x,y,z,verb); x*=(a2*b2); y*=a2; z*=b2; if(nondiag) x-=b*z; y *= a; z *= a; if(nondiag) zz<<=1; cancel(x,y,z); return 1; } else // shouldn't happen as we tested solubility earlier { cout << "Problem in solve_conic (parameters (a,b,c,d)=("<& aplist, const bigint& b, const vector& bplist, bigint& x, bigint& y, bigint& z, int method); // Solves xx-azz=byy for (x,y,z) not (0,0,0) and returns 1 // or returns 0 if not possible // Should have a, b non-zero square-free, their prime divisors in aplist, bplist // Here |b| >= |a|, |b| >=2, a!=1 int solve_conic_diag(const bigint& a, const vector& aplist, const bigint& b, const vector& bplist, bigint& x, bigint& y, bigint& z, int method) // Solves xx-azz=byy for (x,y,z) not (0,0,0) and returns 1 // or returns 0 if not possible // Should have a, b non-zero square-free, their prime divisors in aplist, bplist // // Here trivial cases are dealt with, non-trivial passed on { static const bigint one(1), minusone(-1); #ifdef DEBUG_CONIC cout << "In solve_conic_diag with a = " << a << ", b = " << b << endl; #endif // DEBUG_CONIC if(is_one(b)) { x=1; y=1; z=0; #ifdef DEBUG_CONIC cout << "...returns "; show_xyz(x,y,z); #endif // DEBUG_CONIC return 1; } if(is_one(a)) { x=1; y=0; z=1; #ifdef DEBUG_CONIC cout << "...returns "; show_xyz(x,y,z); #endif // DEBUG_CONIC return 1; } if(abs(a)>abs(b)) { int res = solve_conic_diag(b,bplist,a,aplist,x,z,y,method); #ifdef DEBUG_CONIC cout << "...returns "; show_xyz(x,y,z); #endif // DEBUG_CONIC return res; } // Now |a|<=|b|, neither a nor b = 1 if(is_one(-b)) { #ifdef DEBUG_CONIC cout << "...returns fail (a=b=-1)\n"; #endif // DEBUG_CONIC return 0; // since a must be -1 too and xx+zz=-yy insoluble } if(b==-a) { x=0; y=1; z=1; #ifdef DEBUG_CONIC cout << "...returns "; show_xyz(x,y,z); #endif // DEBUG_CONIC return 1; } if(b==a) { int res = solve_conic_diag(minusone,pdivs(one),a,aplist,y,x,z,method); x*=a; #ifdef DEBUG_CONIC cout << "...returns "; show_xyz(x,y,z); #endif // DEBUG_CONIC return res; } // Now |b| >= 2 , |b|>|a| and a is NOT square return solve_conic_diag_nontriv(a,aplist,b,bplist,x,y,z,method); } int solve_conic_diag_nontriv(const bigint& a, const vector& aplist, const bigint& b, const vector& bplist, bigint& x, bigint& y, bigint& z, int method) // Solves xx-azz=byy for (x,y,z) not (0,0,0) and returns 1 // or returns 0 if not possible // Should have a, b non-zero square-free, their prime divisors in aplist, bplist // Here |b| > |a|, |b| >=2, a!=1 { if(method<3) { bigint x0, t, t0, t1, x1, y1, z1; vector tplist; int res = modsqrt(a,bplist,x0); // Solves x^2=a mod b, returns success/fail if(!res) { #ifdef DEBUG_CONIC cout << "...returns fail (no modular sqrt)\n"; #endif // DEBUG_CONIC return 0; } t=b; bigint newt = (sqr(x0)-a)/b; #ifdef DEBUG_CONIC cout<<"x0 = "<=n1); #ifdef DEBUG_REDUCE count++; // cout<<"In lattice reduction loop, u1=" // < tplist; res = modsqrt(a,bplist,x0); // Solves x^2=a mod b, returns success/fail if(!res) { #ifdef DEBUG_CONIC cout << "...returns fail (no modular sqrt)\n"; #endif // DEBUG_CONIC return 0; // since a must be -1 too and xx+zz=-yy insoluble } // Always have v ^2 - a*u ^2 = b*c // vv^2 - a*uu^2 = c*newc bigint u, v, temp, c, uu, vv, nor, newc; u=1; v=x0; c = (x0*x0-a)/b; vv = mod(-x0,c), uu=1; nor = vv*vv-a*uu*uu; // if(!div(c,nor)) cout<<"Error: "<=0 or z=0 and x>=0 { cancel1(x,y,z); if(is_positive(z)) return; if(is_negative(z)) {::negate(x); ::negate(y); ::negate(z); return;} if(is_positive(y)) return; if(is_negative(y)) {::negate(x); ::negate(y); return;} if(is_negative(x)) {::negate(x);} return; } int testsol(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const bigint& x, const bigint& y, const bigint& z, int verb) { int triv = is_zero(x) && is_zero(y) && is_zero(z); if(triv) { if(verb) cout << "Trivial solution!\n"; return 0; } bigint t = a*x*x+b*x*z+c*z*z-d*y*y; if(is_zero(t)) { if(verb) cout << "Solution OK!\n"; return 1; } else { if(verb) cout << "Solution wrong!\n"; return 0; } } int testlocsol(const bigint& a, const bigint& b, const bigint& c) // tests if ax^2+by^2+cz^2=0 is soluble, where a, b, c are pairwise // coprime and square-free { vector alist=pdivs(a); vector blist=pdivs(b); vector clist=pdivs(c); return testlocsol(a,alist,b,blist,c,clist); } int testlocsol(const bigint& a, const vector& alist, const bigint& b, const vector& blist, const bigint& c, const vector& clist) // tests if ax^2+by^2+cz^2=0 is soluble, where a, b, c are pairwise // coprime and square-free, their prime factors being in alist etc. { int as=sign(a), bs=sign(b), cs=sign(c); if((as==bs)&&(bs==cs)) return 0; auto test = [](const vector& plist, const bigint& m) { return !std::any_of(plist.begin(), plist.end(), [m](const auto& p) { return (p>2) && (legendre(m,p)!=1); } ); }; return test(clist, -a*b) && test(alist, -b*c) && test(blist, -a*c); } int testlocsol(const bigint& a, const vector& alist, const bigint& b, const vector& blist) // tests if ax^2+by^2=z^2 is soluble, where a, b are // square-free, their prime factors being in alist and blist. { // Avoid any factorization and gcd computation using the primes given bigint a0(1), b0(1), c(-1); vector a0list, b0list, clist; long sa=sign(a), sb=sign(b); if((sa<0)&&(sb<0)) { // cout<<"testlocsol("<> m; mm=m; vector plist=pdivs(mm); vector flag(m,0); for(i=0; i<=m/2; i++) flag[(i*i)%m]=1; for(i=0; i plist; while(cout << "Enter a nonzero integer m: ", cin >> m, m!=0) { sqfdecomp(m,m1,m2,plist,TRACE_FACTORIZATION); cout << "sqfdecomp returns m1 = " << m1 << " and m2 = " << m2 << endl; cout << "(plist = " << plist << ")\n"; sqfdecomp(m,plist,m1,m2); cout << "sqfdecomp returns m1 = " << m1 << " and m2 = " << m2 << endl; cout << "(plist = " << plist << ")\n"; } } void testcancel() { bigint x,y,z; cout << "Enter x, y, z to be cancelled: "; cin >> x >> y >> z; cout << "Before: (x:y:z) = ("<& factorbase, quadratic& qx, quadratic& qy, quadratic& qz, int method, int verb) { return solve_conic_param(q[0],q[1],q[2],d,factorbase,qx,qy,qz,method,verb); } int solve_conic_param(const quadratic& q, const bigint& d, quadratic& qx, quadratic& qy, quadratic& qz, int method, int verb) { return solve_conic_param(q[0],q[1],q[2],d,qx,qy,qz,method,verb); } int solve_conic_param(const bigint& a, const bigint& b, const bigint& c, const bigint& d, quadratic& qx, quadratic& qy, quadratic& qz, int method, int verb) { vector factorbase = pdivs(2*d); if(is_zero(b)) { factorbase=vector_union(factorbase,pdivs(a)); factorbase=vector_union(factorbase,pdivs(c)); } else { bigint disc = b*b-4*a*c; factorbase=vector_union(factorbase,pdivs(a)); factorbase=vector_union(factorbase,pdivs(disc)); } return solve_conic_param(a,b,c,d,factorbase,qx,qy,qz,method,verb); } int solve_conic_param(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const vector& factorbase, quadratic& qx, quadratic& qy, quadratic& qz, int method, int verb) // Solves axx+bxz+czz=dyy for (x,y,z) not (0,0,0) and returns 1 // or returns 0 if not possible // Should have a, c, d, bb-4ac non-zero // qx,qy,qz are (preallocated) arrays of coeffs of parametrizing quadratics // with leading coeffs qx[0],qy[0],qz[0] one solution { if(verb) cout<<"In solve_conic_param() with (a,b,c,d)=("<0, b>0, c<0, abc square-free and ax^2+by^2+cz^2=0 // reduces x, y, z in place using Mordell's method (page 48) // to achieve Holzer's bounds |z|<=sqrt(ab) etc. // NOTE that we allow c not to be square-free here, // so we may have g=gcd(x0,y0)>1 with g^2|c. { // To check if Holzer's conditions are satisfied // it suffices to chack that |z| < sqrt(ab). int ok = (sqr(z0)<=(a*b)); // if(ok) return; bigint zero; zero=0; if(verb) { bigfloat xlim = sqrt(I2bigfloat(b)*I2bigfloat(-c)); bigfloat ylim = sqrt(I2bigfloat(a)*I2bigfloat(-c)); bigfloat zlim = sqrt(I2bigfloat(a)*I2bigfloat(b)); cout<<"Using Mordell reduction to reduce the solution "; show_xyz(x0,y0,z0); cout<<" for (a,b,c) = ("<1) {fix=1; x00/=gxy; y00/=gxy; c0/=sqr(gxy);} int c_parity; if(odd(c0)) {c_parity=1; d=c0;} else {c_parity=0; d=c0/2;} g=bezout(y00,-x00,xx,yy); xx*=d; yy*=d; // now y00*xx-x00*yy=d u = a*x00*xx+b*y00*yy; v = -c0*z0; if(v<0) {::negate(u); ::negate(v);} bigfloat zz_real; zz_real=0; if(verb>1) { zz_real = I2bigfloat(u)/I2bigfloat(v); cout<<"u = "<=abs(z0)))) { cout<<"Problem: new solution is NOT smaller than old one!\n"; cout<<"(a,b,c) = ("<0 else { if(sb==1) {icase=2;} // a>0, b>0 else {icase=3;} // a>0, b<0 } bigint c = gcd(a,b); y*=c; z*=c; bigint g = gcd(x,c), a0=a/c, b0=b/c; if(g>1) {x/=g; y/=g; z/=g;} if(debug) { cout<<"Case "< //#define DEBUG 1 #ifndef MPFP void swap(bigcomplex& a, bigcomplex& b) { bigcomplex c(a); a=b; b=c; } #define SMALL(x) is_complex_zero((x)) #else #define SMALL(x) is_approx_zero((x)) //#define SMALL(x) (abs(x)<1.0e-14) //#define SMALL(x) is_zero((x)) #endif // Reorders 3 complex nos so real parts are decreasing void reorder1(bigcomplex& a, bigcomplex& b, bigcomplex& c) { if (real(a) < real(c)) swap(a,c); if (real(a) < real(b)) swap(a,b); else if (real(b) < real(c)) swap(b,c); } //reorders 3 complex nos so e1 is real if any ( void reorder2(bigcomplex& e1, bigcomplex& e2, bigcomplex& e3) { #if(0) if (is_real(e1)) return; else if (is_real(e2)) {swap(e1,e2); return;} else if (is_real(e3)) {swap(e1,e3); return;} #endif #if(0) cout<<"Entering reorder2() with \n"; cout<<"e1="<abs(imag(e3))) {swap(e1,e3);} if(abs(imag(e1))>abs(imag(e2))) {swap(e1,e2);} else if(abs(imag(e2))>abs(imag(e3))) {swap(e2,e3);} #if(0) cout<<"Leaving reorder2() with \n"; cout<<"e1="< roots(3); long i; #ifdef DEBUG_CUBIC cout << "c1 = " << c1 << ", rc1 = " << rc1 << endl; cout << "p3 = " << p3 << ", rp3 = " << rp3 << endl; cout << "q = "< ei = solve_nonsingular_cubic(b2,8*b4,16*b6); #ifdef DEBUG cout<<"ei = "<1) wRI+=wR; wI = bigcomplex(to_bigfloat(0),2*imag(wRI)); } else { wI=wRI; } w1=wR; w2=wRI; #ifdef DEBUG cout << "Before lattice normalization, \n"; cout << "wR = " << wR << " (should be real)\n"; cout << "wI = " << wI << " \n"; cout << "wRI = " << wRI << " \n"; cout << "real(wRI)/real(wR) = "<0.99) { cout << "Warning from Cperiods::store_sums: qtau = " << qtau << " is not small!\n"; } w1squared = w1*w1; w1cubed = w1*w1squared; bigcomplex term(one), qtm(qtau); sum3=to_bigfloat(0); for (bigfloat m=to_bigfloat(1); ! SMALL(term); m+=1) { term = qtm*m / (one - qtm); qtm *= qtau; sum3 += term; #ifdef DEBUG cout<<"term = "<piby2) || (theta<=-piby2)) y=-y; #ifdef DEBUG_CAGM cout<<"x = "<coeffs; autpower = *(transforms.begin() + (biggest-Flist.begin())); #ifdef DEBUG_NORMALISE cout<<"Largest one after sorting is "<<(*this)<<", the transform by "<& Glist) const { for (auto Gi=Glist.begin(); Gi!=Glist.end(); ++Gi) if (sl2_equivalent(*Gi)) return 1; return 0; } int cubic::gl2_equivalent_in_list(const vector& Glist) const { for (auto Gi=Glist.begin(); Gi!=Glist.end(); ++Gi) if (gl2_equivalent(*Gi)) return 1; return 0; } // affine roots of F mod q. // NB rootsmod requires a non-constant polynomial // affine roots of F mod q, assuming leading coefficient a() is nonzero: vector cubic::roots_mod(const bigint& q) const { bigint aq(a()%q), bq(b()%q), cq(c()%q), dq(d()%q); if (is_zero(aq) && is_zero(bq) && is_zero(cq)) return {}; return rootsmod({dq,cq,bq,aq}, q); } // Return 1 iff F has a projective root mod q: int cubic::has_roots_mod(const bigint& q) const { return div(q,a()) || (roots_mod(q).size() > 0); } void cubic::x_shift(const bigint& e, unimod& m) { coeffs[3] += e*(c()+e*( b()+ e*a())); coeffs[2] += e*(2*b()+3*e*a()); coeffs[1] += 3*e*a(); m.x_shift(e); } void cubic::y_shift(const bigint& e, unimod& m) { coeffs[0] += e*(b()+e*( c()+ e*d())); coeffs[1] += e*(2*c()+3*e*d()); coeffs[2] += 3*e*d(); m.y_shift(e); } void cubic::invert(unimod& m) { swap(coeffs[0],coeffs[3]); ::negate(coeffs[0]); swap(coeffs[1],coeffs[2]); ::negate(coeffs[2]); m.invert(); } void cubic::negate(unimod& m) { for (int i=0; i<4; i++) ::negate(coeffs[i]); m.negate(); } void cubic::seminegate(unimod& m) { for (int i=0; i<2; i++) ::negate(coeffs[2*i+1]); m.seminegate(); } // The quantity called C_1 in the paper, = Norm(h2-h0) and should be // NON-NEGATIVE for a reduced form: bigint cubic::j_c1() const { bigint a = coeffs[0], b=coeffs[1], c=coeffs[2], d=coeffs[3]; bigint b2=sqr(b); bigint b3=b*b2; bigint b4=b*b3; bigint b5=b*b4; bigint b6=b*b5; bigint a2=sqr(a); bigint a3=a*a2; bigint a4=a*a3; bigint c2=sqr(c); bigint c3=c*c2; bigint c4=c*c3; bigint c5=c*c4; bigint c6=c*c5; bigint d2=sqr(d); bigint d3=d*d2; bigint d4=d*d3; bigint ac=a*c, bd=b*d; return - 108*b3*a2*d - 3*b4*c2 + 54*a2*c4 + 18*b5*d + 243*a2*d2*b2 - 54*b3*ac*d - 162*bd*c2*a2 - 54*a3*c3 + 486*a3*bd*c + 3*c4*b2 - 18*c5*a + 54*c3*a*bd - 243*d2*a2*c2 + 162*d2*ac*b2 + 2*c6 - 729*a4*d2 - 2*b6 + 18*b4*ac - 27*a2*b2*c2 + 729*d4*a2 + 54*b3*d3 + 108*c3*d2*a - 18*c4*bd + 27*d2*c2*b2 - 486*d3*ac*b - 54*d2*b4; } // The quantity called C_2 in the paper, = Norm(h0-h1) and should be // NON-NEGATIVE for a reduced form: bigint cubic::j_c2() const { bigint a = coeffs[0], b=coeffs[1], c=coeffs[2], d=coeffs[3]; bigint b2=sqr(b); bigint b3=b*b2; bigint b4=b*b3; bigint b5=b*b4; bigint b6=b*b5; bigint a2=sqr(a); bigint a3=a*a2; bigint a4=a*a3; bigint c2=sqr(c); bigint c3=c*c2; bigint c4=c*c3; bigint c5=c*c4; bigint c6=c*c5; bigint d2=sqr(d); bigint d3=d*d2; bigint d4=d*d3; bigint ac=a*c, bd=b*d; return 108*b3*a2*d - 12*b4*c2 + 216*a2*c4 + 72*b5*d + 486*a3*c2*d - 270*a2*c3*b + 90*b3*c2*a + 972*a2*d2*b2 - 216*b3*ac*d - 648*bd*c2*a2 + 54*a3*c3 - 486*a3*bd*c + 16*c3*b3 - 216*d2*b3*a - 72*d*b4*c - 72*c4*b*a - 216*d*c3*a2 + 432*d*b2*a*c2 + 729*a4*d2 + 2*b6 - 18*b4*ac + 27*a2*b2*c2 - 6*b5*c + 648*b2*c*a2*d - 162*a*d*b4 - 1458*a3*d2*b; } // The quantity called C_3 in the paper, = Norm(h0+h1) and should be // POSITIVE for a reduced form: bigint cubic::j_c3() const { bigint a = coeffs[0], b=coeffs[1], c=coeffs[2], d=coeffs[3]; bigint b2=b*b; bigint b3=b*b2; bigint b4=b*b3; bigint b5=b*b4; bigint b6=b*b5; bigint a2=a*a; bigint a3=a*a2; bigint a4=a*a3; bigint c2=c*c; bigint c3=c*c2; bigint c4=c*c3; bigint c5=c*c4; bigint c6=c*c5; bigint d2=d*d; bigint d3=d*d2; bigint d4=d*d3; return 108*b3*a2*d - 12*b4*c2 + 216*a2*c4 + 72*b5*d - 486*a3*c2*d + 270*a2*c3*b - 90*b3*c2*a + 972*a2*d2*b2 - 216*b3*c*a*d - 648*b*c2*a2*d + 54*a3*c3 - 486*a3*d*c*b - 16*c3*b3 + 216*d2*b3*a + 72*d*b4*c + 72*c4*b*a + 216*d*c3*a2 - 432*d*b2*a*c2 + 729*a4*d2 + 2*b6 - 18*b4*a*c + 27*a2*b2*c2 + 6*b5*c - 648*b2*c*a2*d + 162*a*d*b4 + 1458*a3*d2*b; } // The quantity C_4 (not in the paper), = Norm(h1)/8 and should be // NON-NEGATIVE for a reduced form with C1=0 (i.e. when h0=h2 we want h1>=0). bigint cubic::j_c4() const { bigint a = coeffs[0], b=coeffs[1], c=coeffs[2], d=coeffs[3]; bigint b2=b*b; bigint b3=b*b2; bigint b4=b*b3; bigint a2=a*a; bigint c2=c*c; bigint c3=c*c2; bigint c4=c2*c2; bigint d2=d*d; return 27*d*c3*a2 + (27*d2*b3 - 54*d*c2*b2 + 9*c4*b)*a + 9*d*c*b4 - 2*c3*b3; } //#define DEBUG_REDUCE bigcomplex cubic::hess_root() const { bigfloat discr = I2bigfloat(disc()); if(!is_positive(disc())) { cout<<"Error: hess_root called with negative dicriminant!\n"; return bigcomplex(); // 0 } bigfloat P = I2bigfloat(p_semi()); bigfloat Q = I2bigfloat(q_semi()); bigfloat delta = sqrt(3*discr); bigcomplex gamma(-Q,delta); gamma/=(2*P); return gamma; } int cubic::is_hessian_reduced() const // for positive discriminant only // The condition is -P < Q <= P < R or 0 <= Q <= P=R. { bigint P = p_semi(); bigint R = r_semi(); if (P>R) return 0; // now P<=R bigint Q = q_semi(); if (Q>P) return 0; // now Q<=P<=R if (P==R) return (Q>=0); return (Q>-P); } void cubic::hess_reduce(unimod& m) { int s=1; bigint k; m.reset(); #ifdef DEBUG_REDUCE cout<<"Using hess_reduce() on "<<(*this)<0) we have -P <= Q < P. k = roundover(-q_semi(),2*p_semi()); if(!is_zero(k)) { s=1; x_shift(k,m); #ifdef DEBUG_REDUCE cout << "Shift by " << k << ": " << (*this) << endl; #endif } if(p_semi()>r_semi()) { s=1; invert(m); #ifdef DEBUG_REDUCE cout << "invert: " << (*this) << endl; #endif } } // Now we have -P <= Q < P <= R and test for boundary condition if ((p_semi()==r_semi()) && (q_semi()<0)) { invert(m); #ifdef DEBUG_REDUCE cout << "Final inversion: " << (*this) << endl; #endif } normalise(m); } void cubic::mathews_reduce(unimod& m) { int s=1; bigint k; bigfloat alpha; m.reset(); while(s) { s=0; if(mat_c1()<0) { s=1; invert(m); #ifdef DEBUG_REDUCE cout << "invert: " << (*this) << endl; #endif } alpha = real_root(); k = Iround(-alpha/2 - I2bigfloat(b())/I2bigfloat(2*a())); if (k!=0) { s=1; x_shift(k,m); #ifdef DEBUG_REDUCE cout << "Shift by "<0) { s=1; x_shift(plus1,m); #ifdef DEBUG_REDUCE cout << "Shift by +1: "<<(*this)<=0, i.e. h0<=h2 bigint C2 = j_c2(); if (C2<0) return 0; // now C1, C2 >=0, i.e. h1<=h0<=h2 if (is_zero(C1)) // i.e. h0=h2 { bigint C4 = j_c4(); // = N(h1)/8, not in JCM paper return (C4>=0); // i.e. h1 >= 0 } bigint C3 = j_c3(); return (C3>0); // i.e. h1 > -h0 } void cubic::jc_reduce(unimod& m) { int s=1; bigint k, jc2, jc3; bigint plus1(one), minus1(-one); bigfloat alpha, ra, rb, rc, h0, h1; m.reset(); #ifdef DEBUG_REDUCE bigfloat rd, h2; cout << "\nJC-reducing " << (*this) << "...\n"; cout<<"C1="<=bb) q+=1; #ifdef DEBUG_REDUCE cout << "[a=0] shift "<< (*this); #endif x_shift(q,m); #ifdef DEBUG_REDUCE cout << " by "< " << (*this) << endl; cout<<"C1="< "<<(*this)<h0 so shift by -1 { x_shift(minus1,m); #ifdef DEBUG_REDUCE cout << "Shift by -1 --> "<<(*this)< "<<(*this)< " << (*this) << endl; cout<<"C1="<=0) { cout<<"Error: real_root called with positive dicriminant!\n"; return to_bigfloat(0); } bigfloat A = I2bigfloat(a()); if(is_real_zero(A)) { return A; } bigfloat P = I2bigfloat(p_semi()); bigfloat Q = I2bigfloat(q_semi()); if(is_real_zero(P)) { bigfloat R = I2bigfloat(r_semi())/Q; bigfloat eta3 = I2bigfloat(d())/A - (I2bigfloat(c())*R)/(3*A); bigfloat eta = cube_root(eta3); bigfloat alpha = -eta - R; return alpha; } bigfloat U = I2bigfloat(u_semi()); bigfloat delta = sqrt(-3*discr); bigfloat gamma1 = (-Q+delta)/(2*P); // roots of Hessian bigfloat gamma2 = (-Q-delta)/(2*P); // bigfloat eta3 = (U-3*A*delta)/(U+3*A*delta); bigfloat eta = cube_root(eta3); bigfloat alpha = (eta*gamma1-gamma2)/(eta-1); return alpha; } vector cubic::rational_roots() const { return roots(coeffs); } vector reduced_cubics(const bigint& disc, int include_reducibles, int gl2, int verbose) { bigint a, b, c, d; bigint amax, bmin, bmax, a2, b2, b3, b4, cmin, cmax, r; bigint P, U, absU, U2, Ud, Db2; int sU; bigfloat i3a, a23, ra2, rb2, D, D2, D3, D32, D4, Pmax, Pmin; unimod m; bigfloat third = 1/to_bigfloat(3); bigfloat const1 = 2 / sqrt(to_bigfloat(27)); bigfloat const2 = 3 / pow(to_bigfloat(4), third); bigfloat const3 = sqrt(to_bigfloat(8)/to_bigfloat(27)); bigfloat const4 = to_bigfloat(27)/to_bigfloat(8); bigfloat const5 = sqrt(pow(to_bigfloat(2), third)); int neg=(disc<0); vector glist; // will hold all cubics found vector reduced_glist; // will hold unique reduced cubics found if(verbose>1) cout << "Discriminant = " << disc << endl; D = I2bigfloat(disc); D2 = sqrt(abs(D)); D3 = pow(abs(D),third); if (neg) D3=-D3; D32 = D2*D2*D2; D4 = sqrt(D2); // Upper bound on a: amax = Ifloor((neg? const3: const1) * D4); if(verbose>1) cout<<"Upper bound on a: " << amax << endl; if (include_reducibles) { // // Code for a=0: // bmax = (neg? Ifloor(const5*D4): Ifloor(D4)); if(verbose>1) cout<<"a=0, b<="<1) && glist.size()==0) cout<1) { cout<<"found "<0: // for(a=1; a<=amax; a++) { a2=a*a; ra2 = I2bigfloat(a2); a23 = pow(ra2, third); i3a = 1/I2bigfloat(3*a); Pmax = (neg? pow(2*D32+const4*D*ra2, third): D2); Pmin = const2*D3*a23; if(verbose>1) cout<<"bounds on P: ["<1) cout<<"a="<1) cout<<"(a,b)=("<1) cout<<"(a,b,c)=("<1) cout<<"found "<1) { if (irred) cout<<" (irrreducible)\n"; else cout<<" (reducible)\n"; } if (irred or include_reducibles) glist.push_back(g); } // d integral test } // sign(U) loop } // U square test } // c loop } // b loop } // a loop if (verbose) { cout << glist.size() << " cubics found with discriminant " << disc << "."; if (glist.size()>0) cout << glist << "\n Now reducing and eliminating repeats..."; cout<1) cout<<": testing JC-reduction..."<\t"; g.jc_reduce(m); if(verbose) cout<\t"; g.hess_reduce(m); if(verbose) cout<0) { cout << reduced_glist.size(); cout << (gl2? " GL":" SL"); cout << "(2,Z)-inequivalent cubics found with discriminant " << disc << "." << endl; } return reduced_glist; } eclib-20250122/libsrc/curve.cc000066400000000000000000000176771474421343600157720ustar00rootroot00000000000000// curve.cc: implementations of elliptic curve class Curve ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // originally adapted from Elliptic.cc by Oisin McGuiness #include //Kraus' conditions: int valid_invariants(const bigint& c4, const bigint& c6) { bigint disc = c4*c4*c4 - c6*c6; if (sign(disc)==0) return 0; if (ndiv(1728,disc)) return 0; // need c4^3-c6^2=1728D, with D|=0 long x6= mod(c6,27); if((x6==9)||(x6==-9)) return 0; // need c6 != +-9 (mod 27) x6 = mod(c6,4); if(x6==-1) return 1; // OK if c6 = -1 (mod 4) if(ndiv(16,c4)) return 0; // else need c4=0 (mod 16) x6=mod(c6,32); // and return ((x6==0) || (x6==8)); // c6 = 0,8 (mod 32). } void c4c6_to_ai(const bigint& c4, const bigint& c6, bigint& a1, bigint& a2, bigint& a3, bigint& a4, bigint& a6, bigint& b2, bigint& b4, bigint& b6, bigint& b8) { // cout<<"In c4c6_to_ai() with c4="<>skipws; is>>c; // cout<<"First char read = "<> c4 >> c; if(c!=',') { cout << "syntax error on curve input" << endl; return; } is >> c6 >> c; if(c!='}') { cout << "syntax error on curve input" << endl; return; } if (valid_invariants(c4, c6)) { const bigint& b2 = bigint(mod(-c6,12)); const bigint& b22 = b2*b2; const bigint& b4 = (b22-c4)/24; const bigint& b6 = (-b2*b22+36*b2*b4-c6)/216; a1 = (odd(b2) ? 1 : 0); a3 = (odd(b6) ? 1 : 0); a2 = (b2-a1*a1)/4; a4 = (b4-a1*a3)/2; a6 = (b6-a3*a3)/4; } else { cout << " ## invalid invariants, reading as null curve\n"; a1=0; a2=0; a3=0;a4=0; a6=0; } } break; case '[': // cout<<"Reading [a1,a2,a3,a4,a6]...\n"; is >> a1 >> c; if(c!=',') { cout << "syntax error on curve input" << endl; return; } is >> a2 >> c; if(c!=',') { cout << "syntax error on curve input" << endl; return; } is >> a3 >> c; if(c!=',') { cout << "syntax error on curve input" << endl; return; } is >> a4 >> c; if(c!=',') { cout << "syntax error on curve input" << endl; return; } is >> a6 >> c; if(c!=']') { cout << "syntax error on curve input" << endl; return; } // cout<<"["<> a1 >> a2 >> a3 >> a4 >> a6; // cout<<"["< 0) os << " +" << a1 << "xy" ; else os << " " << a1 << " xy" ; } if(a3==0){ ; } else { if(a3==1) os << " + y" ; else if(a3==-1) os << " - y" ; else if(a3 > 0) os << " +" << a3 << "y" ; else os << " " << a3 << " y" ; } os << " = x^3" ; if(a2==0){ ; } else { if(a2==1) os << " + x^2" ; else if(a2==-1) os << " - x^2" ; else if(a2 > 0) os << " +" << a2 << "x^2" ; else os << " " << a2 << " x^2" ; } if(a4==0){ ; } else { if(a4==1) os << " + x" ; else if(a4==-1) os << " - x" ; else if(a4 > 0) os << " +" << a4 << "x" ; else os << " " << a4 << " x" ; } if(a6==0){ ; } else { if(a6==1) os << " + 1" ; else if(a6==-1) os << " - 1" ; else if(a6 > 0) os << " +" << a6 ; else os << " " << a6 ; } os << "$" ; return ; } // end of file: curve.cc eclib-20250122/libsrc/curvedata.cc000066400000000000000000000225361474421343600166120ustar00rootroot00000000000000// curvedata.cc -- implementation of Curvedata class ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #include Curvedata::Curvedata(const bigint& aa1, const bigint& aa2, const bigint& aa3, const bigint& aa4, const bigint& aa6, int min_on_init) : Curve(aa1,aa2,aa3,aa4,aa6), b2(a1*a1 + 4*a2), b4(2*a4 + a1*a3), b6(a3*a3 + 4*a6), minimal_flag(0), ntorsion(0) { b8 = (b2*b6 - b4*b4) / 4; c4 = b2*b2 - 24*b4; c6 = -b2*b2*b2 + 36*b2*b4 - 216*b6; discr = (c4*c4*c4 - c6*c6) / 1728; discr_factored=0; if(sign(discr)==0) // singular curve, replace by null { a1=0;a2=0;a3=0;a4=0;a6=0; b2=0;b4=0;b6=0;b8=0; c4=0;c6=0; conncomp=0; } else { conncomp = sign(discr)>0 ? 2 : 1; if (min_on_init) minimalize(); // which sets discr } } //#define DEBUG_Q_INPUT Curvedata::Curvedata(const vector& qai, bigint& scale) : minimal_flag(0), ntorsion(0) { static const bigint one(1); bigrational qa1(qai[0]), qa2(qai[1]), qa3(qai[2]), qa4(qai[3]), qa6(qai[4]); scale = one; a1=num(qa1); a2=num(qa2); a3=num(qa3); a4=num(qa4); a6=num(qa6); #ifdef DEBUG_Q_INPUT cout<<"In Curvedata constructor with ["< plist=pdivs(den(qa1)); plist=vector_union(plist,pdivs(den(qa2))); plist=vector_union(plist,pdivs(den(qa3))); plist=vector_union(plist,pdivs(den(qa4))); plist=vector_union(plist,pdivs(den(qa6))); #ifdef DEBUG_Q_INPUT cout<<"Denominator primes: "<0 ? 2 : 1; } } Curvedata::Curvedata(const Curve& c, int min_on_init) : Curve(c), b2(a1*a1 + 4*a2), b4(2*a4 + a1*a3), b6(a3*a3 + 4*a6), minimal_flag(0), ntorsion(0) { b8 = (b2*b6 - b4*b4) / 4; c4 = b2*b2 - 24*b4; c6 = -b2*b2*b2 + 36*b2*b4 - 216*b6; discr = (c4*c4*c4 - c6*c6) / 1728; discr_factored=0; if(sign(discr)==0) // singular curve, replace by null { a1=0;a2=0;a3=0;a4=0;a6=0; b2=0;b4=0;b6=0;b8=0; c4=0;c6=0; conncomp=0; } else { conncomp = sign(discr)>0 ? 2 : 1; if (min_on_init) minimalize(); // which sets discr } } Curvedata::Curvedata(const Curvedata& c) : Curve(c), b2(c.b2), b4(c.b4), b6(c.b6), b8(c.b8), c4(c.c4), c6(c.c6), discr(c.discr), minimal_flag(c.minimal_flag), discr_factored(c.discr_factored), conncomp(c.conncomp), ntorsion(c.ntorsion) { if(discr_factored) the_bad_primes=c.the_bad_primes; } Curvedata::Curvedata(const Curvedata& c, int min_on_init) : Curve(c), b2(c.b2), b4(c.b4), b6(c.b6), b8(c.b8), c4(c.c4), c6(c.c6), discr(c.discr), minimal_flag(c.minimal_flag), discr_factored(c.discr_factored), conncomp(c.conncomp), ntorsion(c.ntorsion) { if(discr_factored) the_bad_primes=c.the_bad_primes; if (min_on_init) minimalize(); } Curvedata::Curvedata(const bigint& cc4, const bigint& cc6, int min_on_init) :minimal_flag(0), discr_factored(0), ntorsion(0) { if (valid_invariants(cc4, cc6)) { c4=cc4; c6=cc6; c4c6_to_ai(cc4, cc6, a1, a2, a3, a4, a6, b2, b4, b6, b8); /* cout<<"a1="<0 ? 2 : 1; } else { cout << " ## attempt to call Curve constructor\n" << " with invalid invariants c4 = "< 1) { c4 = newc4; c6 = newc6; } discr = newdiscr; if(discr_factored) { if(u>1) // trim list of bad primes { vector new_bad_primes; for (const auto& p : the_bad_primes) { if(div(p,discr)) new_bad_primes.push_back(p); } the_bad_primes=new_bad_primes; } } else the_bad_primes = pdivs(discr); // cout<<"After Curvedata::minimalize(): discr = "<0 ? 2 : 1; ntorsion=0; } void Curvedata::output(ostream& os) const { Curve::output(os); if (isnull()) {os << " --singular\n"; return; } if (minimal_flag) os << " (reduced minimal model)"; os << endl; os << "b2 = " << b2 << "\t " << "b4 = " << b4 << "\t " << "b6 = " << b6 << "\t " << "b8 = " << b8 << endl; os << "c4 = " << c4 << "\t\t" << "c6 = " << c6 << endl; os << "disc = " << discr << "\t("; if (minimal_flag&&discr_factored) os << "bad primes: " << the_bad_primes << ";\t"; os << "# real components = " << conncomp << ")" << endl; if (ntorsion) os<<"#torsion = "< #include // which includes // constructors curvemodq::curvemodq(void) { Fq=0; // cout<<"In curvemodq default constructor, Fq = "<= 0; //ie true if legendre(d,p)=0,1 } //monic version int rootsexist(const bigint& bb, const bigint& cc, const bigint& p) { static const bigint one(1); return rootsexist(one,bb,cc,p); } CurveRed::~CurveRed() { } CurveRed::CurveRed(const CurveRed& E) : Curvedata(E), N(E.N) { factor_discr(); // will only do anything if not already factored reduct_array = E.reduct_array; } void CurveRed::operator=(const CurveRed& E) { if(this==&E) return; a1=E.a1;a2=E.a2;a3=E.a3;a4=E.a4;a6=E.a6;b2=E.b2;b4=E.b4;b6=E.b6;b8=E.b8; c4=E.c4;c6=E.c6;discr=E.discr;minimal_flag=1; discr_factored=E.discr_factored; the_bad_primes=E.the_bad_primes; conncomp=E.conncomp; ntorsion=E.ntorsion; reduct_array = E.reduct_array; N=E.N; } CurveRed::CurveRed(const Curvedata& E) : Curvedata(E, 1), //minimalize in constructor N(1) { static const bigint one(1), three(3), twelve(12); // constructor stuff if (discr==0) {N = 0; return; } factor_discr(); // will only do anything if not already factored // local variables Curvedata C(*this); bigint temp, r, s, t, b, c, bb, cc, bc, d, w, x, mx, my, a2t, a3t, a4t, a6t, zero; int c_p=1, sw, loop, ix, iy; zero=0; // main loop - for each of the prime divisors of the discriminant. // Because the curve is minimal, Tate's algorithm reduce-loop is not needed //cout<<"Running Tate's algorithm"<>1; int pdiv2 = even(p); int pdiv3 = (p==3); //change coords so that p|C.a3,C.a4,C.a6 if ( pdiv2 ) { if ( div(p,C.b2) ) { r = root(C.a4,2,p); t = root(((r+C.a2)*r+C.a4)*r+C.a6,2,p); } else { temp=invmod(C.a1,p); r = temp*C.a3; t = temp*(C.a4 + r*r); } } else if ( pdiv3 ) { if ( div(p,C.b2) ) r = root(-C.b6,3,p); else r = -invmod(C.b2,p)*C.b4; t = C.a1*r + C.a3; } else { if ( div(p,c4) ) r = -invmod(twelve,p)*C.b2; else r = -invmod(12*c4,p)*(c6+C.b2*c4); t = -halfmodp*(C.a1*r+C.a3); } r = mod(r,p); t = mod(t,p); C.transform(r,zero,t); // test for Types In, II, III, IV if ( ndiv(p,c4) ) {temp=-C.a2; if (rootsexist(C.a1,temp,p) ) c_p = ord_p_discr; else { if ( odd(ord_p_discr) ) c_p = 1; else c_p = 2; } reduct_array[p] = Reduction_type (ord_p_discr, 1, ord_p_j, 10*ord_p_discr, c_p); continue; } // Type In (n=ord_p_discr) else if ( val(p,C.a6) < 2 ) {reduct_array[p] = Reduction_type (ord_p_discr, ord_p_discr, ord_p_j, 2, 1); continue; } // Type II else if ( val(p,C.b8) < 3 ) {reduct_array[p] = Reduction_type (ord_p_discr, ord_p_discr - 1, ord_p_j, 3, 2); continue; } // Type III else if ( val(p,C.b6) < 3 ) {temp = -(C.a6/p)/p; bigint temp2 = C.a3/p; if ( rootsexist(temp2,temp,p) ) c_p = 3; else c_p = 1; reduct_array[p] = Reduction_type (ord_p_discr, ord_p_discr - 2, ord_p_j, 4, c_p); continue; } // Type IV // else change coords so that p|C.a1,C.a2, p^2|C.a3,C.a4, p^3|C.a6 if ( pdiv2 ) { s = root(C.a2,2,p); t = p*root((C.a6/p)/p,2,p); } else if ( pdiv3 ) { s = C.a1; t = C.a3; } else { s = -C.a1*halfmodp; t = -C.a3*halfmodp; } C.transform(zero,s,t); // 3 2 // Analyse roots of the cubic T + bT + cT + d = 0, where // b=C.a2/p, c=(C.a4/p)/p, d=((C.a6/p)/p)/p b=C.a2/p; c=(C.a4/p)/p; d=((C.a6/p)/p)/p; bb=b*b; cc=c*c; bc=b*c; w = 27*d*d - bb*cc + 4*b*bb*d - 18*bc*d + 4*c*cc; x = 3*c - bb; if ( div(p,w) ) {if ( div(p,x) ) sw = 3; else sw = 2; } else sw = 1; //cout << "Analysing roots of cubic; case " << sw << endl; switch ( sw ) { case 1: //Three distinct roots - Type I*0 reduct_array[p] = Reduction_type (ord_p_discr, ord_p_discr - 4, ord_p_j, 1, 1+nrootscubic(b,c,d,p) ); break; case 2: // One double root - Type I*m for some m // Change coords so that the double root is T=0 mod p if ( pdiv2 ) r = root(c,2,p); else if ( pdiv3 ) r = c*invmod(b,p); else r = (bc - 9*d)*invmod(2*x,p); r = p * mod(r,p); C.transform(r,zero,zero); ix = 3; iy = 3; mx = p*p; my = p*p; loop = 1; while (loop) { a2t = C.a2/p; a3t = C.a3/my; a4t = (C.a4/p)/mx; a6t = (C.a6/mx)/my; temp = a3t*a3t + 4*a6t; if ( div(p,temp ) ) {if ( pdiv2 ) t = my*root(a6t,2,p); else t = my*mod(-a3t*halfmodp, p); C.transform(zero,zero,t); my = my*p; iy++; a2t = C.a2/p; a3t = C.a3/my; a4t = (C.a4/p)/mx; a6t = (C.a6/mx)/my; temp = a4t*a4t - 4*a6t*a2t; if ( div(p,temp) ) {if ( pdiv2 ) r = mx*root( a6t*invmod(a2t,p), 2, p); else r = mx*mod( -a4t*invmod(2*a2t,p), p); C.transform(r,zero,zero); mx = mx*p; ix++; // and stay in loop } else {if ( rootsexist(a2t,a4t,a6t,p) ) c_p = 4; else c_p = 2; loop = 0; } // and exit loop } else { temp = -a6t; if ( rootsexist(a3t,temp,p) ) c_p = 4; else c_p = 2; loop = 0; } } reduct_array[p] = Reduction_type (ord_p_discr, ord_p_discr - ix - iy + 1, ord_p_j, 10 * (ix + iy) - 49, c_p ); break; // Type I*m case 3: // Triple root // change coords so that T=0 mod p if ( pdiv2 ) r = b; else if ( pdiv3 ) r = root(-d,3,p); else r = -b*invmod(three,p); r = p*mod(r,p); C.transform(r,zero,zero); a3t = (C.a3/p)/p; a6t = (((C.a6/p)/p)/p)/p; // test for Type IV* temp = a3t*a3t + 4*a6t; if ( ndiv(p,temp ) ) { temp = -a6t; if ( rootsexist(a3t,temp,p) ) c_p = 3; else c_p = 1; reduct_array[p] = Reduction_type (ord_p_discr, ord_p_discr - 6, ord_p_j, 5, c_p); break; } // change coords so that p^3|C.a3, p^5|C.a6 if ( pdiv2 ) t = -p*p*root(a6t,2,p); else t = p*p*mod(-a3t*halfmodp, p); C.transform(zero,zero,t); // test for types III*, II* if ( val(p,C.a4) < 4 ) {reduct_array[p] = Reduction_type (ord_p_discr, ord_p_discr - 7, ord_p_j, 6, 2); break; } // Type III* else if ( val(p,C.a6) < 6 ) {reduct_array[p] = Reduction_type (ord_p_discr, ord_p_discr - 8, ord_p_j, 7, 1); break; } // Type II* else cout<<" ## Tate's algorithm reached end of loop !!!"<second; int cp = info.c_p; if (cp!=4) return bigint(cp); // see if we have C4 or C2xC2 int code = info.Kcode.code; return (code%20==1? two: four); // Type I*m, m even: [2,2], else 4 } // The global Tamagawa exponent, i.e. the lcm of the exponents of // the component groups at all bad primes (including infinity if // real_too is 1), which is the lcm of the local Tamagawa exponents. // So (with no further knowledge of the MW group) we know that m*P // is in the good-reduction subgroup for all P, with this m. bigint global_Tamagawa_exponent(const CurveRed& c, int real_too) { static const bigint one(1); static const bigint two(2); bigint ans = ((real_too && (c.conncomp==2))? two: one); for( const auto& ri : c.reduct_array) { Reduction_type info = ri.second; int code = info.Kcode.code; int ep = (code%20==1? 2: info.c_p); // Type I*m, m even: [2,2] ans = lcm(ans,bigint(ep)); } return ans; } // Tamagawa primes: primes dividing any Tamagawa number vector tamagawa_primes(const CurveRed& C, int real_too) { vector T = pdivs(global_Tamagawa_exponent(C, real_too)); vector t(T.size()); std::transform(T.begin(), T.end(), t.begin(), [](const bigint& x) {return I2long(x);}); return t; } // CurveRed member access friend functions: // NB If p is not a bad prime this will not cause an error, but will // return the appropriate result for a good prime. We do have to // check that p is a valid key in the reduct_array map first, // otherwise we would cause inclusion of a new entry in that map, // which is impossible without removing the "const" qualifier from the // CurveRed argument! int getord_p_discr(const CurveRed& c, const bigint& p) { auto ri = c.reduct_array.find(p); return (ri==c.reduct_array.end()? 0 : (ri->second).ord_p_discr); } int getord_p_N(const CurveRed& c, const bigint& p) { auto ri = c.reduct_array.find(p); return (ri==c.reduct_array.end()? 0 : (ri->second).ord_p_N); } int getord_p_j_denom(const CurveRed& c, const bigint& p) { auto ri = c.reduct_array.find(p); return (ri==c.reduct_array.end()? 0 : (ri->second).ord_p_j_denom); } int getc_p(const CurveRed& c, const bigint& p) { auto ri = c.reduct_array.find(p); return (ri==c.reduct_array.end()? : (ri->second).c_p); } vector all_cp(const CurveRed& c) { vector ans(c.reduct_array.size()); std::transform(c.reduct_array.begin(), c.reduct_array.end(), ans.begin(), [] (const pair& x) {return bigint(x.second.c_p);}); return ans; } bigint prodcp(const CurveRed& c) { static const bigint one(1); vector allcp = all_cp(c); return std::accumulate(allcp.begin(), allcp.end(), one, [](const bigint& c1, const bigint& c2) {return c1*c2;}); } // The local Tamagawa number. Use p=0 for reals bigint local_Tamagawa_number(CurveRed& c, const bigint& p) { return bigint(is_zero(p)? getconncomp(c): getc_p(c,p)); } // The global Tamagawa number, = product of local ones. bigint global_Tamagawa_number(CurveRed& c, int real_too) { return bigint(prodcp(c) * (real_too ? getconncomp(c) : 1)); } Kodaira_code getKodaira_code(const CurveRed& c, const bigint& p) { auto ri = c.reduct_array.find(p); return (ri==c.reduct_array.end()? Kodaira_code() : (ri->second).Kcode); } void CurveRed::output(ostream& os) const { Curvedata::output(os); if(isnull()) return; os << "Conductor = " << N << endl; } ostream& operator<<(ostream& os, const Reduction_type& R) { os << R.ord_p_discr << "\t"; os << R.ord_p_N << "\t"; os << R.ord_p_j_denom <<"\t"; os << R.Kcode << "\t"; os << R.c_p << "\t"; os << R.local_root_number; return os; } void CurveRed::display(ostream& os) { CurveRed::output(os); if(isnull()) return; os << "Global Root Number = " << GlobalRootNumber(*this) << endl; os << "Reduction type at bad primes:\n"; os <<"p\tord(d)\tord(N)\tord(j)\tKodaira\tc_p\troot_number\n"; for( const auto& ri : reduct_array) { if((ri.second).local_root_number==0) setLocalRootNumber(ri.first); os << (ri.first) << "\t" << (ri.second) << endl; } } // Sign of functional equation for an elliptic curve over Q // // Taken partly from Odile Lecacheux's GP code, partly translated by // JEC from the pari C code in elliptic.c from pari-2.1.3 // // For the theory, see // // Halberstadt, Emmanuel. Signes locaux des courbes elliptiques en 2 et 3. // (French) [Local root numbers of elliptic curves for $p=2$ or $3$] // C. R. Acad. Sci. Paris Sér. I Math. 326 (1998), no. 9, 1047--1052. // // The following functions return local and global root numbers, just // looking up the local numbers from the // Reduction_type::local_root_number field, computing them if not // already set (i.e. field contains 0) int LocalRootNumber(CurveRed& c, const bigint& p) { if(is_zero(p)) return -1; // the infinite prime auto ri = c.reduct_array.find(p); if(ri==c.reduct_array.end()) return 1; // good reduction case if((ri->second).local_root_number==0) c.setLocalRootNumber(p); return (ri->second).local_root_number; } int GlobalRootNumber(CurveRed& c) { int ans=-1; for( const auto& ri : c.reduct_array) { if((ri.second).local_root_number==0) c.setLocalRootNumber(ri.first); ans *= (ri.second).local_root_number; } return ans; } int kro(const bigint& d, const bigint& n); int kro(const bigint& d, long n); int kro(long d, long n); int kro_m1(long x); // kronecker(-1,x) with x>0 odd int kro_p2(long x); // kronecker(2,x) with x>0 odd int kro_m2(long x); // kronecker(-2,x) with x>0 odd int kro_3(long x); // kronecker(x,3) // sets the "local root number" or local factor at 2 to +/-1 void CurveRed::setLocalRootNumber2() { static const bigint two(2); auto ri = reduct_array.find(two); if(ri==reduct_array.end()) return; Reduction_type& info = ri->second; int kod = PariKodairaCode(info.Kcode); int n2 = neron(2,kod); bigint mu,mv; long u,v; int v4,v6; if (is_zero(c4)) {v4=12; u=0;} else {mu=c4; v4=divide_out(mu,two); u = posmod(mu,64);} if (is_zero(c6)) {v6=12; v=0;} else {mv=c6; v6=divide_out(mv,two); v = posmod(mv,64);} if (kod > 4) { info.local_root_number = div(2,a2+a3)? -1: 1; return; } if (kod < -9) { info.local_root_number = (n2==2)? -kro_m1(v) : -1; return; } bigint tmp = discr; divide_out(tmp,two); long d1=posmod(tmp,64); long x1=u+v+v, y1; switch(kod) { case 1: info.local_root_number = 1; return; case 2: switch(n2) { case 1: switch(v4) { case 4: info.local_root_number = kro_m1(u); return; case 5: info.local_root_number = 1; return; default: info.local_root_number = -1; return; } case 2: info.local_root_number = (v6==7) ? 1 : -1; return; case 3: info.local_root_number = (v%8==5 || (u*v)%8==5) ? 1 : -1; return; case 4: if (v4>5) { info.local_root_number = kro_m1(v); return; } else { info.local_root_number = (v4==5) ? -kro_m1(u) : -1; return; } } case 3: switch(n2) { case 1: info.local_root_number = -kro_p2(u*v); return; case 2: info.local_root_number = -kro_p2(v); return; case 3: y1=posmod((u-(c6 >> 5)) , 16); info.local_root_number = (y1==7 || y1==11) ? 1 : -1; return; case 4: info.local_root_number = (v%8==3 || (2*u+v)%8==7) ? 1 : -1; return; case 5: info.local_root_number = v6==8 ? kro_p2(x1) : kro_m2(u); return; } case -1: switch(n2) { case 1: info.local_root_number = -kro_p2(x1); return; case 2: info.local_root_number = (v%8==7) || (x1%32==11) ? 1 : -1; return; case 3: info.local_root_number = v4==6 ? 1 : -1; return; case 4: if (v4>6) { info.local_root_number = kro_m1(v); return; } else { info.local_root_number = v4==6 ? -kro_m1(u*v) : -1; return; } } case -2: info.local_root_number = n2==1 ? kro_m2(v) : kro_m1(v); return; case -3: switch(n2) { case 1: y1=posmod((u-2*v),64); info.local_root_number = (y1==3) || (y1==19) ? 1 : -1; return; case 2: if(kro_m1(u)==1) { info.local_root_number = kro_p2(v); return; } else { info.local_root_number = kro_m2(v); return; } case 3: if(kro_m1(u)==1) { info.local_root_number = -kro_m2(u*v); return; } else { info.local_root_number = kro_p2(u*v); return; } case 4: info.local_root_number = v6==11 ? kro_m2(x1) : -kro_m2(u); return; } case -5: if (n2==1) { info.local_root_number = x1%32==23 ? 1 : -1; return; } else { info.local_root_number = -kro_p2(2*u+v); return; } case -6: switch(n2) { case 1: info.local_root_number = 1; return; case 2: info.local_root_number = v6==10 ? 1 : -1; return; case 3: info.local_root_number = (u%16==11) || ((u+4*v)%16==3) ? 1 : -1; return; } case -7: if (n2==1) { info.local_root_number = 1; return; } else { y1= posmod((u+(c6 >> 8)) , 16); if (v6==10) { info.local_root_number = (y1==9) || (y1==13) ? 1 : -1; return; } else { info.local_root_number = (y1==9) || (y1==5) ? 1 : -1; return; } } case -8: info.local_root_number = n2==2 ? kro_m1(v*d1) : -1; return; case -9: info.local_root_number = n2==2 ? -kro_m1(d1) : -1; return; default: info.local_root_number = -1; return; } } // sets the "local root number" or local factor at 3 to +/-1 void CurveRed::setLocalRootNumber3() { static const bigint three(3); auto ri = reduct_array.find(three); if(ri==reduct_array.end()) return; Reduction_type& info = ri->second; int kod = PariKodairaCode(info.Kcode); int n2 = neron(3,kod); bigint mu,mv; long u,v; int v4; if (is_zero(c4)) { v4=12; u=0; } else { mu=c4; v4=divide_out(mu,three); u = posmod(mu,81); } if (is_zero(c6)) { v=0; } else { mv=c6; divide_out(mv,three); v = posmod(mv,81); } bigint tmp = discr; divide_out(tmp,three); long d1=posmod(tmp,81); long r6 = posmod(v,9); long K4=kro_3(u), K6=kro_3(v); if (kod > 4) { info.local_root_number = K6; return; } switch(kod) { case 1: case 3: case -3: info.local_root_number = 1; return; case 2: switch(n2) { case 1: info.local_root_number = (r6==4 || r6>6) ? 1 : -1; return; case 2: info.local_root_number = -K4*K6; return; case 3: info.local_root_number = 1; return; case 4: info.local_root_number = -K6; return; } case 4: switch(n2) { case 1: info.local_root_number = K6*kro_3(d1); return; case 2: info.local_root_number = -K4; return; case 3: info.local_root_number = -K6; return; } case -2: info.local_root_number = n2==2 ? 1 : K6; return; case -4: switch(n2) { case 1: if (v4==4) { info.local_root_number = (r6==4 || r6==8) ? 1 : -1; return; } else { info.local_root_number = (r6==1 || r6==2) ? 1 : -1; return; } case 2: info.local_root_number = -K6; return; case 3: info.local_root_number = (r6==2 || r6==7) ? 1 : -1; return; case 4: info.local_root_number = K6; return; } default: info.local_root_number = -1; return; } } // Given a prime p not 2 or 3, sets to +1 or -1, the "local root // number" or local factor in the sign of the functional equation of // L(E,s). void CurveRed::setLocalRootNumber_not_2_or_3(const bigint& p) { auto ri = reduct_array.find(p); if(ri==reduct_array.end()) return; Reduction_type& info = ri->second; if (info.ord_p_N == 1) { info.local_root_number = -kro(-c6,p); return; } long sp=posmod(p,24); if (info.ord_p_j_denom >0) { info.local_root_number = kro_m1(sp); return; } long ep=12 / gcd(12,info.ord_p_discr); if(ep==4) { info.local_root_number = kro_m2(sp); return; } if(odd(ep)) { info.local_root_number = kro_3(sp); return; } info.local_root_number = kro_m1(sp); } // Given a prime p, sets to +1 or -1, the "local root number" or local // factor in the sign of the functional equation of L(E,s). // // This function just delegates to subsidiary ones for the cases // p=2, p=3, and p>=5. // void CurveRed::setLocalRootNumber(const bigint& p) { if (is_zero(p)) return; if (p==2) setLocalRootNumber2(); else if (p==3) setLocalRootNumber3(); else setLocalRootNumber_not_2_or_3(p); } int kro(const bigint& d, const bigint& n) { return kronecker(d,n); } int kro(const bigint& d, long n) { return kronecker(d,n); } int kro(long d, long n) { return kronecker(d,n); } int kro_m1(long x) // kronecker(-1,x) with x>0 odd { static const int kro_m1_tab[4] = {0,1,0,-1}; return kro_m1_tab[x&3]; } int kro_p2(long x) // kronecker(2,x) with x>0 odd { static const int kro_p2_tab[8] = {0,1,0,-1,0,-1,0,1}; return kro_p2_tab[x&7]; } int kro_m2(long x) // kronecker(-2,x) with x>0 odd { static const int kro_m2_tab[8] = {0,1,0,1,0,-1,0,-1}; return kro_m2_tab[x&7]; } int kro_3(long x) // kronecker(x,3) { static const int kro_3_tab[3] = {0,1,-1}; return kro_3_tab[x%3]; } int PariKodairaCode(Kodaira_code Kod) { int ans, code=Kod.code; if (code==0) ans = 1; else if (code==1) ans = -1; else if (code%10 ==0) ans = (code/10)+4; else if (code%10 ==1) ans = ((1-code)/10)-4; else if (code>4) ans = code-9; else ans=code; #ifdef DEBUG_ESIGN cout<<"PariKodairaCode("<=2) return zero; if(f==1) return bigint(-LocalRootNumber(c,p)); bigint n=zero; if(p==two) // curvemodq class only in characteristic > 3 { // Count points naively // y^2+(a1*x+a3)*y-(x^3+a2*x^2+a4*x+a6) = y^2+ay+b int a1=bigint_mod_long(c.a1,2), a2=bigint_mod_long(c.a2,2), a3=bigint_mod_long(c.a3,2), a4=bigint_mod_long(c.a4,2), a6=bigint_mod_long(c.a6,2); // x=0: int a = odd(a3); // 1 if odd else 0 int b = odd(a6); n += (a?(b?0:2):1); // x=1: a = odd(a1+a3); b = odd(1+a2+a4+a6); n += (a?(b?0:2):1); return two-n; } if(p==three) // curvemodq class only in characteristic > 3 { // Count points naively // y^2+(a1*x+a3)*y-(x^3+a2*x^2+a4*x+a6) = y^2+ay+b int a1=bigint_mod_long(c.a1,3), a2=bigint_mod_long(c.a2,3), a3=bigint_mod_long(c.a3,3), a4=bigint_mod_long(c.a4,3), a6=bigint_mod_long(c.a6,3); for(int x=-1; x<2; x++) { int a = (((x+a2)*x+a4)*x+a6)%3; int b = (a1*x+a3)%3; int d = (b*b+a)%3; if(d==2)d=-1; if(d==-2)d=1; n += (d+1); } return three-n; } curvemodq Cq = reduce_curve(c,p); n = Cq.group_order(); bigint ans = one+p-n; return ans; } eclib-20250122/libsrc/curvesort.cc000066400000000000000000000265341474421343600166720ustar00rootroot00000000000000// FILE CURVESORT.CC: isogeny class id codes etc ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #include // for reverse() #include int curvesort_BA[] = {1,0}; int curvesort_ACB[] = {0,2,1}; int curvesort_BAC[] = {1,0,2}; int curvesort_BCA[] = {1,2,0}; int curvesort_CAB[] = {2,0,1}; int curvesort_CBA[] = {2,1,0}; int curvesort_ABDC[] = {0,1,3,2}; int curvesort_ACBD[] = {0,2,1,3}; int curvesort_ACDB[] = {0,2,3,1}; int curvesort_ADBC[] = {0,3,1,2}; int curvesort_ADCB[] = {0,3,2,1}; int curvesort_BACD[] = {1,0,2,3}; int curvesort_BADC[] = {1,0,3,2}; int curvesort_BCAD[] = {1,2,0,3}; int curvesort_BCDA[] = {1,2,3,0}; int curvesort_BDAC[] = {1,3,0,2}; int curvesort_CABD[] = {2,0,1,3}; int curvesort_CBAD[] = {2,1,0,3}; int curvesort_CDAB[] = {2,3,0,1}; int curvesort_CDBA[] = {2,3,1,0}; int curvesort_DABC[] = {3,0,1,2}; int curvesort_DACB[] = {3,0,2,1}; int curvesort_DBAC[] = {3,1,0,2}; int curvesort_DCAB[] = {3,2,0,1}; int curvesort_AEBDC[] = {0,4,1,3,2}; int curvesort_AECBD[] = {0,4,2,1,3}; int curvesort_AEDCB[] = {0,4,3,2,1}; int curvesort_BCADE[] = {1,2,0,3,4}; int curvesort_BCAED[] = {1,2,0,4,3}; int curvesort_BEACD[] = {1,4,0,2,3}; int curvesort_BECAD[] = {1,4,2,0,3}; int curvesort_CEADB[] = {2,4,0,3,1}; int curvesort_CABDE[] = {2,0,1,3,4}; int curvesort_CEDAB[] = {2,4,3,0,1}; int curvesort_CEDBA[] = {2,4,3,1,0}; int curvesort_DAECB[] = {3,0,4,2,1}; int curvesort_DCAEB[] = {3,2,0,4,1}; int curvesort_DBCAE[] = {3,1,2,0,4}; int curvesort_EABDC[] = {4,0,1,3,2}; int curvesort_EACBD[] = {4,0,2,1,3}; int curvesort_EBCAD[] = {4,1,2,0,3}; int curvesort_EDACB[] = {4,3,0,2,1}; int curvesort_ADECFB[] = {0,3,4,2,5,1}; int curvesort_AECDBF[] = {0,4,2,3,1,5}; int curvesort_BADECF[] = {1,0,3,4,2,5}; int curvesort_BDAECF[] = {1,3,0,4,2,5}; int curvesort_BFADCE[] = {1,5,0,3,2,4}; int curvesort_CABEDF[] = {2,0,1,4,3,5}; int curvesort_CAFBDE[] = {2,0,5,1,3,4}; int curvesort_CEABDF[] = {2,4,0,1,3,5}; int curvesort_DABFEC[] = {3,0,1,5,4,2}; int curvesort_DCABEF[] = {3,2,0,1,4,5}; int curvesort_EABCDF[] = {4,0,1,2,3,5}; int curvesort_EBACDF[] = {4,1,0,2,3,5}; int curvesort_ECABDF[] = {4,2,0,1,3,5}; int curvesort_AEDBGFC[] = {0,4,3,1,6,5,2}; int curvesort_AFGDEBC[] = {0,5,6,3,4,1,2}; int curvesort_ECFBDGA[] = {4,2,5,1,3,6,0}; int curvesort_EFCAGDB[] = {4,5,2,0,6,3,1}; int curvesort_EFGCABD[] = {4,5,6,2,0,1,3}; int curvesort_FGACBED[] = {5,6,0,2,1,4,3}; int curvesort_FGBDACE[] = {5,6,1,3,0,2,4}; int curvesort_FGDBAEC[] = {5,6,3,1,0,4,2}; int curvesort_FGDBEAC[] = {5,6,3,1,4,0,2}; int curvesort_FGDEABC[] = {5,6,3,4,0,1,2}; int curvesort_AGBDEFHC[] = {0,6,1,3,4,5,7,2}; int curvesort_AFHCGDEB[] = {0,5,7,2,6,3,4,1}; int curvesort_BECADFGH[] = {1,4,2,0,3,5,6,7}; int curvesort_EGBAFHCD[] = {4,6,1,0,5,7,2,3}; int curvesort_GBEAHDFC[] = {6,1,4,0,7,3,5,2}; int booknumber0(int level, int form) // permutes numbers starting from 0 { if(level<56) return form; if(level>450) return form; switch (level) { case 56: return curvesort_BA[form]; break; case 77: return curvesort_ACB[form]; break; case 84: return curvesort_BA[form]; break; case 99: return curvesort_ACBD[form]; break; case 102: return curvesort_ACB[form]; break; case 106: return curvesort_DACB[form]; break; case 110: return curvesort_CBA[form]; break; case 114: return curvesort_CAB[form]; break; case 116: return curvesort_CAB[form]; break; case 118: return curvesort_ACDB[form]; break; case 120: return curvesort_BA[form]; break; case 121: return curvesort_CABD[form]; break; case 123: return curvesort_BA[form]; break; case 124: return curvesort_BA[form]; break; case 126: return curvesort_BA[form]; break; case 128: return curvesort_ADCB[form]; break; case 130: return curvesort_ACB[form]; break; case 132: return curvesort_BA[form]; break; case 136: return curvesort_BA[form]; break; case 140: return curvesort_BA[form]; break; case 141: return curvesort_EBCAD[form]; break; case 142: return curvesort_EABDC[form]; break; case 144: return curvesort_BA[form]; break; case 147: return curvesort_ACB[form]; break; case 150: return curvesort_CAB[form]; break; case 153: return curvesort_ADCB[form]; break; case 154: return curvesort_ACB[form]; break; case 155: return curvesort_CBA[form]; break; case 158: return curvesort_EACBD[form]; break; case 162: return curvesort_ACBD[form]; break; case 168: return curvesort_BA[form]; break; case 170: return curvesort_DAECB[form]; break; case 171: return curvesort_ADBC[form]; break; case 174: return curvesort_CEDBA[form]; break; case 175: return curvesort_CAB[form]; break; case 178: return curvesort_BA[form]; break; case 182: return curvesort_CEADB[form]; break; case 184: return curvesort_DABC[form]; break; case 185: return curvesort_BCA[form]; break; case 186: return curvesort_ACB[form]; break; case 187: return curvesort_BA[form]; break; case 189: return curvesort_ADBC[form]; break; case 190: return curvesort_BAC[form]; break; case 192: return curvesort_ACBD[form]; break; case 195: return curvesort_CDBA[form]; break; case 196: return curvesort_BA[form]; break; case 198: return curvesort_CEDAB[form]; break; case 200: return curvesort_BECAD[form]; break; case 201: return curvesort_BCA[form]; break; case 203: return curvesort_BCA[form]; break; case 205: return curvesort_CAB[form]; break; case 208: return curvesort_DABC[form]; break; case 210: return curvesort_DBCAE[form]; break; case 212: return curvesort_BA[form]; break; case 214: return curvesort_DBAC[form]; break; case 219: return curvesort_BCA[form]; break; case 221: return curvesort_BA[form]; break; case 222: return curvesort_EDACB[form]; break; case 234: return curvesort_BCADE[form]; break; case 235: return curvesort_CAB[form]; break; case 236: return curvesort_BA[form]; break; case 238: return curvesort_DAECB[form]; break; case 240: return curvesort_BCAD[form]; break; case 242: return curvesort_BA[form]; break; case 245: return curvesort_CAB[form]; break; case 246: return curvesort_EFCAGDB[form]; break; case 249: return curvesort_BA[form]; break; case 252: return curvesort_BA[form]; break; case 254: return curvesort_DCAB[form]; break; case 256: return curvesort_BACD[form]; break; case 262: return curvesort_BA[form]; break; case 264: return curvesort_DABC[form]; break; case 267: return curvesort_BA[form]; break; case 270: return curvesort_BCDA[form]; break; case 272: return curvesort_ADBC[form]; break; case 274: return curvesort_CBA[form]; break; case 278: return curvesort_BA[form]; break; case 285: return curvesort_CAB[form]; break; case 286: return curvesort_BDAECF[form]; break; case 288: return curvesort_AECBD[form]; break; case 291: return curvesort_DBAC[form]; break; case 294: return curvesort_EFGCABD[form]; break; case 297: return curvesort_DACB[form]; break; case 298: return curvesort_BA[form]; break; case 300: return curvesort_ACDB[form]; break; case 302: return curvesort_BAC[form]; break; case 304: return curvesort_ECABDF[form]; break; case 306: return curvesort_CBAD[form]; break; case 312: return curvesort_CAFBDE[form]; break; case 315: return curvesort_BA[form]; break; case 318: return curvesort_DCAEB[form]; break; case 320: return curvesort_EABCDF[form]; break; case 322: return curvesort_BADC[form]; break; case 324: return curvesort_ABDC[form]; break; case 325: return curvesort_EABDC[form]; break; case 326: return curvesort_ACB[form]; break; case 330: return curvesort_AEDCB[form]; break; case 333: return curvesort_DABC[form]; break; case 336: return curvesort_CABEDF[form]; break; case 338: return curvesort_ADECFB[form]; break; case 339: return curvesort_BAC[form]; break; case 342: return curvesort_FGDEABC[form]; break; case 345: return curvesort_AECDBF[form]; break; case 348: return curvesort_BDAC[form]; break; case 350: return curvesort_BFADCE[form]; break; case 352: return curvesort_CEABDF[form]; break; case 354: return curvesort_DCABEF[form]; break; case 360: return curvesort_BCAED[form]; break; case 364: return curvesort_BA[form]; break; case 366: return curvesort_FGBDACE[form]; break; case 368: return curvesort_AEDBGFC[form]; break; case 369: return curvesort_BA[form]; break; case 370: return curvesort_ACBD[form]; break; case 372: return curvesort_ACDB[form]; break; case 378: return curvesort_GBEAHDFC[form]; break; case 380: return curvesort_BA[form]; break; case 381: return curvesort_BA[form]; break; case 384: return curvesort_BECADFGH[form]; break; case 387: return curvesort_CABDE[form]; break; case 390: return curvesort_AFGDEBC[form]; break; case 392: return curvesort_EBACDF[form]; break; case 396: return curvesort_BAC[form]; break; case 400: return curvesort_AFHCGDEB[form]; break; case 402: return curvesort_ABDC[form]; break; case 404: return curvesort_BA[form]; break; case 405: return curvesort_DABFEC[form]; break; case 406: return curvesort_ACDB[form]; break; case 408: return curvesort_ADCB[form]; break; case 410: return curvesort_BDAC[form]; break; case 414: return curvesort_CDAB[form]; break; case 418: return curvesort_BAC[form]; break; case 423: return curvesort_ECFBDGA[form]; break; case 425: return curvesort_ADBC[form]; break; case 426: return curvesort_CAB[form]; break; case 427: return curvesort_BCA[form]; break; case 432: return curvesort_EGBAFHCD[form]; break; case 434: return curvesort_AEBDC[form]; break; case 435: return curvesort_BACD[form]; break; case 437: return curvesort_BA[form]; break; case 438: return curvesort_FGACBED[form]; break; case 440: return curvesort_ADBC[form]; break; case 441: return curvesort_BADECF[form]; break; case 442: return curvesort_BEACD[form]; break; case 446: return curvesort_ADCB[form]; break; case 448: return curvesort_AGBDEFHC[form]; break; case 450: return curvesort_FGDBEAC[form]; break; default: return form; } return form; //default case for levels not yet sorted manually } int booknumber(int level, int form) // permutes numbers starting from 1 { return 1+booknumber0(level,form-1); } // new-new codes (from 01.08.05) are: // a,b,...,z,ba,bb,...,bz,ca,cb,... etc., i.e. straight base 26 with // digits a=0, b=1, ..., z=25 // Function to convert new code to integer (from 0) for any length of code. int codeletter_to_int(string code) // i counts from 0! { int n=0; std::for_each(code.begin(), code.end(), [&n] ( const char& c ) { n*=26; n+=(c-'a');}); return n; } // Function to convert integer (from 0) to new code string new_codeletter(int i) // i counts from 0! { if (i==0) return string("a"); // special case -- otherwise leading // a's are omitted stringstream code; int n = i; while (n) { std::div_t x = div(n,26); code << alphabet[x.rem]; n = x.quot; } string res = code.str(); reverse(res.begin(),res.end()); return res; } eclib-20250122/libsrc/cusp.cc000066400000000000000000000061571474421343600156070ustar00rootroot00000000000000// FILE CUSP.CC ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include // This function tests cusps for Gamma_0(N)-equivalence, unless // plusflag is +1 in which case it tests for equivalence under // int cusplist::cuspeq(const rational& c1, const rational& c2, int plusflag) const { // cout<<"Testing equivalence of cusps "<gcd(q1))!=(N->gcd(q2))) return 0; long s1,r1,s2,r2; bezout(p1,q1,s1,r1); s1*=q2; bezout(p2,q2,s2,r2); s2*=q1; long q3 = N->gcd(q1*q2); int ans = ((s1-s2)%q3==0); // 1 iff [c1]=[c2] // cout << "ans = "< #include #include #include #include #include #include #include #include #include #ifndef QSIEVE_OPT #define QSIEVE_OPT 0 // uses Stoll's sieve #endif int process_d3(const quadratic& q0, const bigint& d3, const vector& plist, const vector& factorbase, double hlim, const quadratic& q1, const quadratic& q3, bigint& x, bigint& y, bigint& z, int verb, int selmer_only=0); // Processes an individual d3 // Returns -1 if not els // 0 if els but no point found // +1 if els and point found // // if selmer_only==1, returns 0 or -1, with no point searching // // We only pass d3 to process_d3 if the Hilbert symbols tests show // that both q1=d3 and q3=d3 are soluble (but this does not yet imply // that they are simultaneously soluble). int desc2(const bigint& c, const bigint& d1, const bigint& d2, const vector& plist, const vector& supp, const vector& bgens, long mask, double hlim, bigint& x, bigint& y, bigint& z, int verb, int selmer_only, int alldesc) // Works on homogeneous space (d1,0,c,0,d2) (assumed ELS) // Returns // -1 if it certainly has no points (if no ELS descendents) // +1 if it has a point (coordinates returned in x, y, z) // 0 if undecided (ELS descendents exist but no rational points were found) // // plist is a complete list of bad primes (including 2) // supp is a list of primes (and -1) dividing d' // bgens is a list of generators of the "opposite" Selmer group B', a subgroup // of group A' = the span of supp // mask enables one to loop over A' modulo B' // // if alldesc==1 it does not stop when it finds one descendent with a point on it, // but goes on to look at all the others. // // if selmer_only==1 it only checks whether els descendents exist, // returning -1 or 0, but does no global point searching. // { int xverb = (verb>1), res; if(verb) { cout<<"Using desc2("< factorbase = plist; int factorbase_enlarged=0; // We only need to factorize x0, z0 if some d3 passes the Hilbert // symbol test, since we use their factorizations to solve q1=d3 but // NOT to test whether q1=d3 and q3=d3 are soluble. We'll carry out // the following only when necessary: // factorbase=vector_union(factorbase,pdivs(x0)); // factorbase=vector_union(factorbase,pdivs(z0)); // The quadratics q1, q3 have discriminants 4*d2, 4*d1, and resultant d'. if(xverb) { cout<<"q1-coeffs: "<& plist, const vector& factorbase, double hlim, const quadratic& q1, const quadratic& q3, bigint& x, bigint& y, bigint& z, int verb, int selmer_only) // Processes an individual d3 // Returns -1 if not els // 0 if els but no point found // +1 if els and point found // // if selmer_only==1, returns 0 or -1, with no point searching // // We only pass d3 to process_d3 if the Hilbert symbols tests show // that both q1=d3 and q3=d3 are soluble (but this does not yet imply // that they are simultaneously soluble). { int xverb=verb>1; if(verb) cout<<"Processing d3 = "< ggbadp, ggextrap; quadratic Q1, Q2, Q3; int resd3 = solve_conic_param(q1,d3,factorbase,Q1,Q2,Q3); if(!resd3) { cout<<"Problem solving q1=d3!\n"<1) { if(xverb) cout<<"Dividing quartic by "<1); if(extras) // then we have introduced some extra bad primes { if(xverb) cout<<"Having to factorize ggD = "<1) {x3/=fac; z3/=fac;} // cout<<"x3="<1) {q1xz/=fac; q3xz/=fac;} bigint x2 = abs(q1(q1xz,q3xz)); bigint z2 = abs(q3(q1xz,q3xz)); //NB These abs() are OK because x2,z2 do have the same sign fac=gcd(x2,z2); if(fac>1) {x2/=fac; z2/=fac;} bigint y2 = q0(x2,z2); if(isqrt(x2,x)&&isqrt(z2,z)&&isqrt(y2,y)) { if(verb) { cout<<"Point on original quartic is "; show_xyz(x,y,z); cout< // #include // #include // #include // #include //#include #include #include #define PRE_SATURATION_SEARCH_LIMIT 8 // Constructor: // // sel is selmer_only switch // firstlim is bound on |x|+|z| // secondlim is bound on log max {|x|,|z| }, i.e. logarithmic // n_aux only relevant for general 2-descent when 2-torsion trivial // n_aux=-1 causes default to be used (depends on method) // second_descent only relevant for descent via 2-isogeny two_descent::two_descent(Curvedata* ec, int verb, int sel, long firstlim, long secondlim, long n_aux, int second_descent) :verbose(verb), selmer_only(sel), e_orig(*ec) { static const bigint one(1); qai.resize(5); bigint a1,a2,a3,a4,a6; ec->getai(a1,a2,a3,a4,a6); v=one; qai[0]=a1; qai[1]=a2; qai[2]=a3; qai[3]=a4; qai[4]=a6; do_the_descent(firstlim,secondlim,n_aux,second_descent); } //#define DEBUG_Q_INPUT two_descent::two_descent(vector ai, int verb, int sel, long firstlim, long secondlim, long n_aux, int second_descent) :verbose(verb), selmer_only(sel) { // Construct Curvedata from rational coeffs & get the scaling // factor v used #ifdef DEBUG_Q_INPUT cout<<"two_descent constructor called with "<1) ; if(two_torsion_exists) r12=new rank2(&e_min,verbose,selmer_only,firstlim,secondlim,second_descent); else r12=new rank1(&e_min,verbose,selmer_only,firstlim,secondlim,n_aux); success=r12->ok(); rank = r12->getrank(); rank_bound = r12->getrankbound(); selmer_rank = r12->getselmer(); certain=r12->getcertain(); // the last parameter here is set to a known upper bound on the rank mwbasis = new mw(&e_min,verbose>2,1,rank_bound); } void two_descent::report_rank() const { if(!success) {cout << "Failed to compute rank\n"; return;} if(selmer_only) { cout << "selmer-rank = " << selmer_rank << endl; cout << "upper bound on rank = " << rank_bound << endl; } else { if(verbose) { if(two_torsion_exists) { cout << "\nUsed descent via 2-isogeny with isogenous curve E' = "<<(Curve)(getEprime())<getrank()>0) || !(r12->getcertain())) { if(verbose) cout <<"Searching for points (bound = "<search(hlim); if(verbose) cout<<"done:"<getrank(); newreg=mwbasis->regulator(); if(verbose) cout<<" found points which generate a subgroup of rank "<process(r12->getgens(),0); // no saturation yet if(verbose) cout <<"done:"<getrank(); if(verbose) { if(rank>search_rank) cout << "2-descent increases rank to "< unsat; int sat_ok = mwbasis->saturate(index,unsat,sat_bd,sat_low_bd); // no need to check p-saturation for p<=sat_low_bd (default 2) if(verbose) { cout <<"done:"<1) { cout <<" *** saturation increased group by index "<regulator()<getrank(); fullmw=sat_ok; // (rank==0); } } vector two_descent::getbasis() // returns points on original model { vectorplist=mwbasis->getbasis(); vectorqlist(rank); for (int i=0; i two_descent::getpbasis() // returns points on integral model { vectorplist=mwbasis->getbasis(); for (int i=0; i0)) cout<<"Transferring points from minimal curve "<<(Curve)e_min <<" back to original curve " <<"["<plist=mwbasis->getbasis(); for (int i=0; i0) { cout << "The basis given is for a subgroup of full rank of the Mordell-Weil group\n"; cout << " (modulo torsion), possibly of index greater than 1\n"; if(sat_bound>0) cout << " (but not divisible by any prime less than " <0) { cout << "If the rank is equal to the lower bound, the basis given "; cout << "is for the full Mordell-Weil group (modulo torsion).\n"; } } else { if(rank>0) { cout << "Even if the lower bound is strict, "; cout << "the basis given is for a subgroup of the Mordell-Weil group\n "; cout << " (modulo torsion), possibly of index greater than 1.\n"; } cout<plist=getbasis(); cout<<"[["< of // coefficients rather than a polynomial type to simplify the // NTL interface #include #include // The 2-divison polynomial (cubic in x) ZPoly div_pol_2(const bigint& a1,const bigint& a2,const bigint& a3,const bigint& a4, const bigint& a6) { ZPoly ans; SetDegree(ans,3); SetCoeff(ans,3,4); SetCoeff(ans,2,a1*a1+4*a2); SetCoeff(ans,1,2*a1*a3+4*a4); SetCoeff(ans,0,a3*a3+4*a6); return ans; } // div_pol_odd(a1,a2,a3,a4,a6,n) returns the coefficients of the // polynomial in x whose zeros are the (x-coordinates of the) non-zero // points P on E=[a1,a2,a3,a4,a6] satisfying nP=0 (odd n) // The poly itself is found recursively ZPoly div_pol_odd(const bigint& a1,const bigint& a2,const bigint& a3,const bigint& a4, const bigint& a6, int n) { static const bigint four(4); ZPoly X; ZPolySetX(X); ZPoly f1 = X*(X*(X+a2)+a4)+a6; ZPoly f2 = a1*X+a3; ZPoly psi24=(four*f1+f2*f2); psi24*=psi24; ZPoly ans; switch(n) { case 0: SetDegree(ans,0); SetCoeff(ans,0,0); return ans; case 1: case 2: SetDegree(ans,0); SetCoeff(ans,0,1); return ans; case 3: SetDegree(ans,4); SetCoeff(ans,4,3); SetCoeff(ans,3,a1*a1+4*a2); SetCoeff(ans,2,3*a1*a3+6*a4); SetCoeff(ans,1,3*a3*a3+12*a6); SetCoeff(ans,0,a1*a1*a6-a1*a3*a4+a2*a3*a3+4*a2*a6-a4*a4); return ans; case 4: SetDegree(ans,6); SetCoeff(ans,6,2); SetCoeff(ans,5,a1*a1+4*a2); SetCoeff(ans,4,5*a1*a3+10*a4); SetCoeff(ans,3,10*a3*a3+40*a6); SetCoeff(ans,2,10*a1*a1*a6-10*a1*a3*a4+10*a2*a3*a3+40*a2*a6-10*a4*a4); SetCoeff(ans,1,a1*a1*a1*a1*a6-a1*a1*a1*a3*a4+a1*a1*a2*a3*a3+8*a1*a1*a2*a6-a1*a1*a4*a4-4*a1*a2*a3*a4-a1*a3*a3*a3-4*a1*a3*a6+4*a2*a2*a3*a3+16*a2*a2*a6-4*a2*a4*a4-2*a3*a3*a4-8*a4*a6); SetCoeff(ans,0,a1*a1*a1*a3*a6-a1*a1*a3*a3*a4+2*a1*a1*a4*a6+a1*a2*a3*a3*a3+4*a1*a2*a3*a6-3*a1*a3*a4*a4+2*a2*a3*a3*a4+8*a2*a4*a6-a3*a3*a3*a3-8*a3*a3*a6-2*a4*a4*a4-16*a6*a6); return ans; default: // general case, use recursion // If n is odd, n=2m+1: if(n%2==1) { int m=(n-1)/2; ZPoly t1=div_pol_odd(a1,a2,a3,a4,a6,m); t1=div_pol_odd(a1,a2,a3,a4,a6,m+2)*t1*t1*t1; ZPoly t2=div_pol_odd(a1,a2,a3,a4,a6,m+1); t2=div_pol_odd(a1,a2,a3,a4,a6,m-1)*t2*t2*t2; if(m%2==1) return t1-psi24*t2; return psi24*t1-t2; } else // n is even, n=2m: { int m=n/2; ZPoly t1=div_pol_odd(a1,a2,a3,a4,a6,m-1); t1=div_pol_odd(a1,a2,a3,a4,a6,m+2)*t1*t1; ZPoly t2=div_pol_odd(a1,a2,a3,a4,a6,m+1); t2=div_pol_odd(a1,a2,a3,a4,a6,m-2)*t2*t2; return div_pol_odd(a1,a2,a3,a4,a6,m)*(t1-t2); } } } ZPoly div_pol(const bigint& a1,const bigint& a2,const bigint& a3,const bigint& a4, const bigint& a6,int n) { return (n==2? div_pol_2(a1,a2,a3,a4,a6) : div_pol_odd(a1,a2,a3,a4,a6,n)); } ZPoly division_polynomial(Curvedata* E, int p) { bigint a1,a2,a3,a4,a6; E->getai(a1,a2,a3,a4,a6); return (p==2? div_pol_2(a1,a2,a3,a4,a6) : div_pol_odd(a1,a2,a3,a4,a6,p)); } // Numerator of the multiplication-by-n map on the x-coordinate ZPoly mul_by_n_num(const bigint& a1,const bigint& a2,const bigint& a3,const bigint& a4, const bigint& a6, int n) { ZPoly X; ZPolySetX(X); ZPoly P_2 = div_pol_2(a1,a2,a3,a4,a6); ZPoly P_n = div_pol_odd(a1,a2,a3,a4,a6,n); ZPoly P_nplus1 = div_pol_odd(a1,a2,a3,a4,a6,n+1); ZPoly P_nminus1 = div_pol_odd(a1,a2,a3,a4,a6,n-1); ZPoly A = X * P_n * P_n; ZPoly B = P_nminus1 * P_nplus1; return (n%2==0? A * P_2 - B : A - P_2 * B); } // Denominator of the multiplication-by-n map on the x-coordinate ZPoly mul_by_n_den(const bigint& a1,const bigint& a2,const bigint& a3,const bigint& a4, const bigint& a6, int n) { ZPoly P_n = div_pol_odd(a1,a2,a3,a4,a6,n); return (n%2==1? P_n * P_n : P_n * P_n * div_pol_2(a1,a2,a3,a4,a6)); } // Polynomial whose roots are x(Q) for Q satisfying n*Q=P, where x(P)=xP/zP ZPoly division_points_X_pol(const bigint& a1,const bigint& a2,const bigint& a3,const bigint& a4, const bigint& a6, int n, const bigint& xP, const bigint& zP) { ZPoly numpoly = mul_by_n_num(a1, a2, a3, a4, a6, n); ZPoly denpoly = mul_by_n_den(a1, a2, a3, a4, a6, n); //cout << "numpoly = " << numpoly << endl; //cout << "denpoly = " << numpoly << endl; return zP * numpoly - xP * denpoly; } eclib-20250122/libsrc/eclib/000077500000000000000000000000001474421343600153735ustar00rootroot00000000000000eclib-20250122/libsrc/eclib/GetOpt.h000066400000000000000000000115561474421343600167560ustar00rootroot00000000000000/* Getopt for GNU. Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc. (Modified by Douglas C. Schmidt for use with GNU G++.) This file is part of the GNU C++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* This version of `getopt' appears to the caller like standard Unix `getopt' but it behaves differently for the user, since it allows the user to intersperse the options with the other arguments. As `getopt' works, it permutes the elements of `argv' so that, when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. Setting the environment variable _POSIX_OPTION_ORDER disables permutation. Then the behavior is completely standard. GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ #ifndef _ECLIB_GETOPT_H #define _ECLIB_GETOPT_H #ifndef GetOpt_h #ifdef __GNUG__ #pragma interface #endif #define GetOpt_h 1 #include #include #include class GetOpt { private: /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ static char *nextchar; /* Describe how to deal with options that follow non-option ARGV-elements. UNSPECIFIED means the caller did not specify anything; the default is then REQUIRE_ORDER if the environment variable _OPTIONS_FIRST is defined, PERMUTE otherwise. REQUIRE_ORDER means don't recognize them as options. Stop option processing when the first non-option is seen. This is what Unix does. PERMUTE is the default. We permute the contents of `argv' as we scan, so that eventually all the options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code zero. Using `-' as the first character of the list of option characters requests this mode of operation. The special argument `--' forces an end of option-scanning regardless of the value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause `getopt' to return EOF with `optind' != ARGC. */ enum OrderingEnum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER }; OrderingEnum ordering; /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is the index after the last of them. */ static int first_nonopt; static int last_nonopt; void exchange (char **argv) const; public: /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns EOF, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ int optind; /* Callers store zero here to inhibit the error message for unrecognized options. */ int opterr; int nargc; char **nargv; const char *noptstring; GetOpt (int argc, char **argv, const char *optstring); int operator () (void); }; #endif #endif eclib-20250122/libsrc/eclib/arith.h000066400000000000000000000176071474421343600166660ustar00rootroot00000000000000// arith.h: declarations of arithmetic functions (single precision) ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_ARITH_H #define _ECLIB_ARITH_H 1 //flags that this file has been included #include #include // for memset gcc >= 4.3 #include // supercedes the macros which used to be here /* Prime number class; adapted from Pari */ typedef unsigned char *byteptr; class primeclass { friend class primevar; byteptr pdiffptr; long NPRIMES, BIGGESTPRIME; byteptr p_aptr; // points to "current" prime long p_ind; // index of "current" prime long p_val; // value of "current" prime public: primeclass(); // will use 10^6 as default or read from file explicit primeclass(long maxnum); ~primeclass(); void init(long maxnum); // called in constructor, or to make more primes long number(long n) ; // returns n'th prime (n=1 gives p=2) vector getfirst(long n); // return primes 2..p_n as vector void reset(void); int at_end(void); int advance(void); friend long nprimes(void); friend long maxprime(void); }; extern primeclass the_primes; // The one and only instance inline long prime_number (long n) /* returns n'th prime from global list */ {return the_primes.number(n);} inline vector primes (long n) /* returns list of first n primes */ {return the_primes.getfirst(n);} inline long nprimes(void) {return the_primes.NPRIMES;} inline long maxprime(void) {return the_primes.BIGGESTPRIME;} long prime_pi(long p); // returns i>=0 such that p is the i'th prime class primevar { public: long val; /* current value */ long ind; /* current index */ private: byteptr ndiff; /* pointer to next diff*/ long maxindex; /* max index */ public: primevar(long max=the_primes.NPRIMES, long i=1) {maxindex=max; ind=i; val=the_primes.number(i); ndiff=the_primes.pdiffptr+i;} void init(long max=the_primes.NPRIMES, long i=1) {maxindex=max; ind=i; val=the_primes.number(i); ndiff=the_primes.pdiffptr+i;} void operator++() {if ((ind++)<=maxindex) { val+=*ndiff++;}} void operator++(int) {if ((ind++)<=maxindex) { val+=*ndiff++;}} int ok() const {return ind<=maxindex;} int more() const {return ind pdivs(long); /* list of prime divisors */ vector posdivs(long, const vector& plist); // all positive divisors inline vector posdivs(long n) { return posdivs(n, pdivs(n)); } vector alldivs(long, const vector& plist); // absolutely all divisors inline vector alldivs(long n) { return alldivs(n, pdivs(n)); } vector sqdivs(long, const vector& plist); // divisors whose square divides inline vector sqdivs(long n) { return sqdivs(n, pdivs(n)); } vector sqfreedivs(long, const vector& plist); // square-free divisors inline vector sqfreedivs(long n) { return sqfreedivs(n, pdivs(n)); } // utilities for compatibility with bigint args inline int odd(const int& a) {return a&1;} inline int even(const int& a) {return !(a&1);} inline int odd(const long& a) {return a&1;} inline int even(const long& a) {return !(a&1);} inline int is_zero(int n) {return n==0;} inline int is_zero(long n) {return n==0;} inline int is_nonzero(int n) {return n!=0;} inline int is_nonzero(long n) {return n!=0;} inline int is_one(int n) {return n==1;} inline int is_one(long n) {return n==1;} inline long I2long(long n) {return n;} long mod(long a, long modb); /* modulus in range plus or minus half mod */ long mod(int a, long modb); /* modulus in range plus or minus half mod */ int mod(int a, int modb); /* modulus in range plus or minus half mod */ int mod(long a, int modb); /* modulus in range plus or minus half mod */ long posmod(long a, long modb); /* ordinary modulus, but definitely positive */ long posmod(int a, long modb); /* ordinary modulus, but definitely positive */ int posmod(int a, int modb); /* ordinary modulus, but definitely positive */ int posmod(long a, int modb); /* ordinary modulus, but definitely positive */ // gcc division truncates towards 0, while we need rounding, with a // consistent behaviour for halves (they go up here). // // For b>0, rounded_division(a,b) = q such that a/b = q + r/b with -1/2 <= r/b < 1/2 long rounded_division(long a, long b); long gcd(long, long); int gcd(int, int); long lcm(long, long); long bezout(long, long, long&, long&); int bezout(int aa, int bb, int& xx, int& yy); long invmod(long, long); inline int xmm(int a, int b, int m) { if (a==1) return b; if (a==-1) return -b; if (b==1) return a; if (b==-1) return -a; return (a*(int64_t)b) % m; } inline int addmod(int a, int b, int m) { if (is_zero(a)) return b; if (is_zero(b)) return a; return mod(a+b,m); } inline long addmod(long a, long b, long m) { if (is_zero(a)) return b; if (is_zero(b)) return a; return mod(a+b,m); } inline long xmm(long a, long b, long m) { if (a==1) return b; if (a==-1) return -b; if (b==1) return a; if (b==-1) return -a; return (a*(int64_t)b) % m; } // Assuming a*d-b*c!=0, computes a reduced Z-basis for <(a,b),(c,d)> void gauss_reduce(long a0, long b0, long c0, long d0, long& a, long& b, long& c, long& d); // Set a, b so that a/b=n (mod m) with |a|, |b| minimal; return success if a^2, b^2 <= m/2 int modrat(long n, long m, long& a, long& b); int modrat(int n, int m, int& a, int& b); long val(long factor, long number); // order of factor in number inline int divides(long factor,long number) { return (factor==0) ? (number==0) : (number%factor==0); } inline int ndivides(long factor,long number) { return (factor==0) ? (number!=0) : (number%factor!=0); } // a=b*q+r, return 1 iff r==0 int divrem(long a, long b, long& q, long& r); int divrem(int a, int b, int& q, int& r); inline long m1pow(long a) {return (a%2 ? -1 : +1);} inline int sign(long a) {return (a==0? 0: (a>0? 1: -1));} // set root to rounded sqrt(a) if a>=0, return 1 iff exact int isqrt(long a, long& root); // return rounded sqrt(a) (undefined for a<0) long isqrt(const long a); long chi2(long a); long chi4(long a); long hilbert2(long a, long b); long legendre(long a, long b); long kronecker(long d, long n); int intlog2(long& n, long& e, int roundup); int is_squarefree(long n); int is_valid_conductor(long n); long squarefree_part(long d); // return list of integers from first to last inclusive vector range(long first, long last); #endif eclib-20250122/libsrc/eclib/bigcomplex.h000066400000000000000000000141741474421343600177040ustar00rootroot00000000000000// bigcomplex.h: complex class built on NTL's RR ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_BIGCOMPLEX_H_ #define _ECLIB_BIGCOMPLEX_H_ class bigcomplex{ public: explicit bigcomplex() : re(RR()), im(RR()) {;} explicit bigcomplex(const RR& r) : re(r), im(RR()) {;} explicit bigcomplex(const RR& r, const RR& i) : re(r), im(i) {;} bigcomplex(const bigcomplex&) = default; // standard class methods RR real() const {return re;}; RR imag() const {return im;}; RR norm() const {return sqr(re)+sqr(im);}; RR arg() const { return atan2(im, re);}; RR abs() const {return ::NTL::sqrt(norm());}; bigcomplex conj() const {return bigcomplex(re,-im);}; bigcomplex timesI() const {return bigcomplex(-im,re);}; int IsReal() const {return ::NTL::IsZero(im);} int IsImaginary() const {return ::NTL::IsZero(re);} int IsZero() const {return ::NTL::IsZero(re) && ::NTL::IsZero(im);} bigcomplex operator= (const RR& r) {re=r; im=RR(); return *this;} bigcomplex operator+=(const RR& r) {re+=r; return *this;}; bigcomplex operator+(const RR& r) const {bigcomplex z(*this); z.re+=r; return z;}; bigcomplex operator-=(const RR& r) {re -= r; return *this;}; bigcomplex operator-(const RR& r) const {bigcomplex z(*this); z.re-=r; return z;}; bigcomplex operator*=(const RR& r) {re*=r; im*=r; return *this;}; bigcomplex operator*(const RR& r) const {bigcomplex z(*this); z.re*=r; z.im*=r; return z;}; bigcomplex operator/=(const RR& r) {re/=r; im/=r; return *this;}; bigcomplex operator/(const RR& r) const {bigcomplex z(*this); z.re/=r; z.im/=r; return z;}; bigcomplex operator=(const bigcomplex& z) {re=z.re; im=z.im; return *this;}; bigcomplex operator+=(const bigcomplex& z) {re+=z.re; im+=z.im; return *this;}; bigcomplex operator+(const bigcomplex& z) const {return bigcomplex(re+z.re, im+z.im);}; bigcomplex operator+() {return *this;}; bigcomplex operator-=(const bigcomplex& z) {re-=z.re; im-=z.im; return *this;}; bigcomplex operator-(const bigcomplex& z) const {return bigcomplex(re-z.re, im-z.im);}; bigcomplex operator-() const {return bigcomplex(-re,-im);}; bigcomplex operator*=(const bigcomplex& z) {RR x = re; re=x*z.re-im*z.im; im = x*z.im+im*z.re; return *this;}; bigcomplex operator*(const bigcomplex& z) const {bigcomplex w(*this); w*=z; return w;}; bigcomplex operator/=(const bigcomplex& z) {RR r=z.norm(), x = re; re=(x*z.re+im*z.im)/r; im = (-x*z.im+im*z.re)/r; return *this;}; bigcomplex operator/(const bigcomplex& z) const {bigcomplex w(*this); w/=z; return w;}; // standard functions as class methods: bigcomplex sqrt() const {RR r = abs(); RR u = ::NTL::sqrt((r+re)/2), v=::NTL::sqrt((r-re)/2); if (im<0) v=-v; return bigcomplex(u,v);}; bigcomplex cos() const {bigcomplex z(this->timesI()); return (z+z.conj())/to_RR(2);}; bigcomplex sin() const {bigcomplex z(this->timesI()); return (z-z.conj())/bigcomplex(RR(),to_RR(2));}; bigcomplex exp() const {RR e = ::NTL::exp(re); return bigcomplex(e * ::NTL::cos(im), e * ::NTL::sin(im));}; bigcomplex log() const {return bigcomplex(::NTL::log(abs()), arg());} operator string() const { ostringstream s; s << "(" << re << "," << im << ")"; return s.str(); } string pretty_string() const { ostringstream s; if (IsReal()) { s<0) s<<"+"; else s<<"-"; RR abs_im(::NTL::abs(im)); if (abs_im>1) s< #include class bigrational { public: // constructors bigrational() : n(0), d(1) {;} explicit bigrational(const bigint& num_val) : n(num_val), d(1) {;} bigrational(const bigint& num_val, const bigint& den_val); bigrational(const bigrational& q); explicit bigrational(const rational& q); void operator=(const bigrational& q); void operator=(const bigint& a); void operator=(const rational& q); // bigrational manipulations void cancel(); // cancel *this in situ friend bigint num(const bigrational&); // the numerator friend bigint den(const bigrational&); // the denominator friend bigrational recip(const bigrational&); // reciprocal friend bigint round(const bigrational&); // nearest integer // Binary Operator Functions friend bigrational operator+(const bigrational&, const bigrational&); friend bigrational operator+(const bigint&, const bigrational&); friend bigrational operator+(const bigrational&, const bigint&); friend bigrational operator-(const bigrational&, const bigrational&); friend bigrational operator-(const bigint&, const bigrational&); friend bigrational operator-(const bigrational&, const bigint&); friend bigrational operator*(const bigrational&, const bigrational&); friend bigrational operator*(const bigrational&, const bigint&); friend bigrational operator*(const bigint&, const bigrational&); friend bigrational operator/(const bigrational&, const bigrational&); friend bigrational operator/(const bigrational&, const bigint&); friend bigrational operator/(const bigint&, const bigrational&); friend int operator==(const bigrational&, const bigrational&); friend int operator!=(const bigrational&, const bigrational&); friend int operator<(const bigrational&, const bigrational&); friend int operator>(const bigrational&, const bigrational&); friend ostream& operator<< (ostream&s, const bigrational&); friend istream& operator>> (istream& is, bigrational& r); bigrational& operator+=(const bigrational&); bigrational& operator+=(const bigint&); bigrational& operator-=(const bigrational&); bigrational& operator-=(const bigint&); bigrational& operator*=(const bigrational&); bigrational& operator*=(const bigint&); bigrational& operator/=(const bigrational&); bigrational& operator/=(const bigint&); bigrational operator+(); bigrational operator-(); friend bigint floor(const bigrational& r); friend bigint ceil(const bigrational& r); operator bigfloat(); // conversion operator // Implementation private: bigint n, d; }; // Inline bigrational functions inline void bigrational::cancel() // cancel *this in situ { bigint g(gcd(n,d)); if (g>1) {n/=g; d/=g;} if (d<0) {n=-n; d=-d;} } inline bigrational::bigrational(const bigint& num_val, const bigint& den_val) : n(num_val), d(den_val) { cancel(); } inline bigrational::bigrational(const bigrational& q) :n(q.n), d(q.d) {;} inline bigrational::bigrational(const rational& q) :n(q.n), d(q.d) {;} inline void bigrational::operator=(const bigrational& q) {n=q.n; d=q.d;} inline void bigrational::operator=(const bigint& a) {n=a; d=bigint(1);} inline void bigrational::operator=(const rational& q) {n=bigint(q.n); d=bigint(q.d);} inline bigrational bigrational::operator+() { return *this; } inline bigrational bigrational::operator-() { return bigrational(-n, d); } // Definitions of compound-assignment operator member functions inline bigrational& bigrational::operator+=(const bigrational& q2) { n = n*q2.d+d*q2.n; d *= q2.d; cancel(); return *this; } inline bigrational& bigrational::operator+=(const bigint& num_val2) { n += d*num_val2; return *this; } inline bigrational& bigrational::operator-=(const bigrational& q2) { n = n*q2.d-d*q2.n; d *= q2.d; cancel(); return *this; } inline bigrational& bigrational::operator-=(const bigint& num_val2) { n -= d*num_val2; return *this; } inline bigrational& bigrational::operator*=(const bigint& num_val2) { n*=num_val2; cancel(); return *this; } inline bigrational& bigrational::operator/=(const bigint& num_val2) { d*=num_val2; cancel(); return *this; } inline bigrational::operator bigfloat() {return I2bigfloat(n)/I2bigfloat(d);} // Definitions of non-member bigrational functions inline bigint num(const bigrational& q) { return q.n; } inline bigint den(const bigrational& q) { return q.d; } inline bigrational recip(const bigrational& q) { return bigrational(q.d, q.n); } inline bigint round(const bigrational& q) { return q.n / q.d; //provisional -- should fix rounding direction. } // Definitions of non-member binary operator functions inline bigrational operator+(const bigrational& q1, const bigrational& q2) { return bigrational(q1.n*q2.d + q2.n*q1.d, q1.d * q2.d); } inline bigrational operator+(const bigint& num_val1, const bigrational& q2) { return bigrational(num_val1*q2.d + q2.n, q2.d); } inline bigrational operator+(const bigrational& q1, const bigint& num_val2) { return bigrational(q1.n + num_val2*q1.d, q1.d); } inline bigrational operator-(const bigrational& q1, const bigrational& q2) { return bigrational(q1.n*q2.d - q2.n*q1.d, q1.d * q2.d); } inline bigrational operator-(const bigint& num_val1, const bigrational& q2) { return bigrational(num_val1*q2.d - q2.n, q2.d); } inline bigrational operator-(const bigrational& q1, const bigint& num_val2) { return bigrational(q1.n - num_val2*q1.d, q1.d); } inline bigrational operator*(const bigrational& q1, const bigint& num_val2) { return bigrational(q1.n*num_val2, q1.d); } inline bigrational operator*(const bigint& num_val1, const bigrational& q2) { return bigrational(q2.n*num_val1, q2.d); } inline bigrational operator*(const bigrational& q1, const bigrational& q2) { return bigrational(q1.n*q2.n, q1.d*q2.d); } inline bigrational operator/(const bigrational& q1, const bigint& num_val2) { return bigrational(q1.n, q1.d*num_val2); } inline bigrational operator/(const bigrational& q1, const bigrational& q2) { return bigrational(q1.n*q2.d, q1.d*q2.n); } inline bigrational operator/(const bigint& num_val1, const bigrational& q2) { return bigrational(q2.d*num_val1, q2.n); } inline int operator==(const bigrational& q1, const bigrational& q2) { return q1.n*q2.d == q2.n*q1.d; } inline int operator!=(const bigrational& q1, const bigrational& q2) { return q1.n*q2.d != q2.n*q1.d; } inline int operator<(const bigrational& q1, const bigrational& q2) { return q1.n*q2.d < q2.n*q1.d; } inline int operator>(const bigrational& q1, const bigrational& q2) { return q1.n*q2.d > q2.n*q1.d; } inline ostream& operator<<(ostream& s, const bigrational& q) { if(q.d==0) s<<"oo"; else { s << q.n; if (q.d!=1) {s << "/" << q.d;} } return s; } inline istream& operator>> (istream& is, bigrational& r) { bigint n,d(1); is>>n; if(!is.eof()) { char c; is.get(c); if(c=='/') { is>>d; } else { is.putback(c); } } r=bigrational(n,d); return is; } // NB gcd(n,d)=1 and d>0: inline bigint floor(const bigrational& r) { return (r.n-(r.n%r.d))/r.d; } inline bigint ceil(const bigrational& r) { if(is_one(r.d)) return r.n; return 1 + (r.n-(r.n%r.d))/r.d; } #endif eclib-20250122/libsrc/eclib/bitspace.h000066400000000000000000000042111474421343600173340ustar00rootroot00000000000000// bitspace.h: declaration of class bitspace for handling F_2 spaces ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #if !defined(_ECLIB_BITSPACE_H) #define _ECLIB_BITSPACE_H 1 //flags that this file has been included #include class bitspace { private: long maxdim; long dim; vector pivs; // holds the position of the ith pivot vector gens; // holds the ith basis element unsigned long bitmask; // holds the bits of the pivs public: explicit bitspace(long d); unsigned long getbitmask() {return bitmask;} long reduce(unsigned long& v, long start=0) const; // reduces v mod this, returns minimal i such that the reduced v has // ith bit set, or -1 if v reduces to 0. Assumes already reduced for i int is_small(bigfloat x); int is_small(const bigcomplex& z); int is_real(const bigcomplex& z); void orderreal(bigfloat& e1, bigfloat& e2, bigfloat& e3); // puts in decreasing order bigcomplex root(const bigcomplex& z, int n); bigcomplex cagm(const bigcomplex& a, const bigcomplex& b); bigcomplex normalize(bigcomplex& w1, bigcomplex& w2); void getc4c6(const bigcomplex& w1, const bigcomplex& w2, bigcomplex& c4, bigcomplex &c6); bigcomplex discriminant(const bigcomplex& b, const bigcomplex& c, const bigcomplex& d); vector solvecubic(const bigcomplex& c1, const bigcomplex& c2, const bigcomplex& c3); inline vector solvecubic(const bigfloat& c1, const bigfloat& c2, const bigfloat& c3) {return solvecubic(bigcomplex(c1), bigcomplex(c2), bigcomplex(c3));} vector solvequartic(const bigcomplex& a, const bigcomplex& b, const bigcomplex& c, const bigcomplex& d); inline vector solvequartic(const bigfloat& a, const bigfloat& b, const bigfloat& c, const bigfloat& d) {return solvequartic(bigcomplex(a), bigcomplex(b), bigcomplex(c), bigcomplex(d));} vector solverealquartic(const bigfloat& a, const bigfloat& b, const bigfloat& c, const bigfloat& d, const bigfloat& e); void quadsolve(const bigfloat& p, const bigfloat& q, bigcomplex& root1,bigcomplex& root2); #endif eclib-20250122/libsrc/eclib/conic.h000066400000000000000000000136201474421343600166410ustar00rootroot00000000000000// conic.h: declarations of functions for solving conics (see also legendre.h) ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_CONIC_H #define _ECLIB_CONIC_H 1 //flags that this file has been included #include "quadratic.h" bigint cancel1(bigint& x, bigint& y, bigint& z); // cancels common factors only, return gcd void cancel(bigint& x, bigint& y, bigint& z); // cancels common factors and leaves z>=0 or z=0 and x>=0 int solve_conic(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const vector& factorbase, bigint& x, bigint& y, bigint& z, int method=4); int solve_conic(const bigint& a, const bigint& b, const bigint& c, const bigint& d, bigint& x, bigint& y, bigint& z, int method=4); // Solves axx+bxz+czz=dyy for (x,y,z) not (0,0,0) and returns 1 // or returns 0 if not possible // Should have a, c, d, bb-4ac non-zero int solve_conic(const quadratic& q, const bigint& d, bigint& x, bigint& y, bigint& z, int method=4); int solve_conic(const quadratic& q, const bigint& d, const vector& factorbase, bigint& x, bigint& y, bigint& z, int method=4); int solve_conic_diag(const bigint& a, const vector& aplist, const bigint& b, const vector& bplist, bigint& x, bigint& y, bigint& z, int method); // Solves xx-azz=byy for (x,y,z) not (0,0,0) and returns 1 // or returns 0 if not possible // Should have a, b non-zero square-free, their prime divisors in aplist, bplist void conic_mordell_reduce(const bigint& a, const bigint& b, const bigint& c, bigint& x0, bigint& y0, bigint& z0, int verb=0); // Given a>0, b>0, c<0, abc square-free and ax^2+by^2+cz^2=0 // reduces x, y, z in place using Mordell's method (page 48) // to achieve Holzer's bounds |z|<=sqrt(ab) etc. void conic_diag_reduce(const bigint& a, const bigint& b, bigint& x, bigint& y, bigint& z, int verb=0); // As above but with a,b square-free only, calls conic_mordell_reduce int solve_conic_param(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const vector& factorbase, quadratic& qx, quadratic& qy, quadratic& qz, int method=4, int verb=0); int solve_conic_param(const bigint& a, const bigint& b, const bigint& c, const bigint& d, quadratic& qx, quadratic& qy, quadratic& qz, int method=4, int verb=0); // Solves axx+bxz+czz=dyy for (x,y,z) not (0,0,0) and returns 1 // or returns 0 if not possible // Should have a, c, d, bb-4ac non-zero // qx,qy,qz are arrays of coeffs of parametrizing quadratics // with leading coeffs qx[0],qy[0],qz[0] one solution int solve_conic_param(const quadratic& q, const bigint& d, const vector& factorbase, quadratic& qx, quadratic& qy, quadratic& qz, int method=4, int verb=0); int solve_conic_param(const quadratic& q, const bigint& d, quadratic& qx, quadratic& qy, quadratic& qz, int method=4, int verb=0); int testsol(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const bigint& x, const bigint& y, const bigint& z, int verb=0); // Tests to see if a given solution is a non-trivial solution int testsol(const quadratic& q, const bigint& d, const bigint& x, const bigint& y, const bigint& z, int verb=0); int testlocsol(const bigint& a, const bigint& b, const bigint& c); // tests if ax^2+by^2+cz^2=0 is soluble, where a, b, c are pairwise // coprime and square-free int testlocsol(const bigint& a, const vector& alist, const bigint& b, const vector& blist, const bigint& c, const vector& clist); // tests if ax^2+by^2+cz^2=0 is soluble, where a, b, c are pairwise // coprime and square-free, their prime factors being in alist etc. int testlocsol(const bigint& a, const vector& alist, const bigint& b, const vector& blist); // tests if ax^2+by^2=z^2 is soluble, where a, b are // square-free, their prime factors being in alist and blist. int testparamsol(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const quadratic& qx, const quadratic& qy, const quadratic& qz, int verb=0); // Tests to see if a given parametrization is a solution int testparamsol(const quadratic& q, const bigint& d, const quadratic& qx, const quadratic& qy, const quadratic& qz, int verb=0); //miscellaneous test functions: void testmodsqrt(); void testsqf(); void testcancel(); // Output utilities: void show_xyz(const bigint& x, const bigint& y, const bigint& z); void show_cert(const bigint& p, const bigint& q, const bigint& r); void show_eqn(const bigint& a, const bigint& b, const bigint& c); void show_eqn_cert(const bigint& a, const bigint& b, const bigint& c, const bigint& p, const bigint& q, const bigint& r); void show_all(const bigint& a, const bigint& b, const bigint& c, const bigint& p, const bigint& q, const bigint& r, const bigint& x, const bigint& y, const bigint& z); #endif eclib-20250122/libsrc/eclib/cperiods.h000066400000000000000000000123071474421343600173570ustar00rootroot00000000000000// cperiods.h: declarations of class Cperiods & period lattice functions ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_CPERIODS_H_ #define _ECLIB_CPERIODS_H_ #include #include #define TWOPI 2*Pi() #define TWOPIEYE bigcomplex(to_bigfloat(0), TWOPI) inline bigcomplex e2pi(const bigcomplex& z) // q(z) = exp(2*pi*i * z) { bigfloat twopix = TWOPI * real(z); return exp(-TWOPI * imag(z)) * bigcomplex( cos(twopix), sin(twopix) ); } // // the Cperiods class: // // w1, w2 are a lattice basis with tau=w1/w2 in fundamental region // wR = least (positive) real period // wI = least imaginary period // wRI = either wI (iff lattice_type==2) // or (wR+wI)/2 (iff lattice_type==1) class Cperiods { bigcomplex w1, w2, tau; bigcomplex wR, wI, wRI; bigcomplex e1, e2, e3; // 2-division values int lattice_type; // 2 for rectangular, 1 for triangular bigcomplex qtau, w1squared, w1cubed, sum3; void store_sums(); // sets quantities on previous line public: Cperiods() : w1(to_bigfloat(0)), w2(to_bigfloat(0)), tau(to_bigfloat(0)), wR(to_bigfloat(0)), wI(to_bigfloat(0)), wRI(to_bigfloat(0)), lattice_type(0) {;} Cperiods(bigfloat x, bigfloat y, int type) : lattice_type(type) { if (type==1) { wR=2*x; wI=bigcomplex(to_bigfloat(0),2*y); wRI=bigcomplex(x,y); } else { wR=x; wI=wRI=bigcomplex(to_bigfloat(0),y); } w1=wR; w2=wRI; tau = normalize(w2,w1); // NB reverse params; from compproc.h store_sums(); } explicit Cperiods(const Curvedata& E); // copying: Cperiods(const Cperiods& cp) : w1(cp.w1), w2(cp.w2), tau(cp.tau), wR(cp.wR), wI(cp.wI), wRI(cp.wRI), e1(cp.e1), e2(cp.e2), e3(cp.e3), lattice_type(cp.lattice_type), qtau(cp.qtau), w1squared(cp.w1squared), w1cubed(cp.w1cubed), sum3(cp.sum3) {;} void operator=(const Cperiods& cp) { w1=cp.w1; w2=cp.w2; tau=cp.tau; wR=cp.wR; wI=cp.wI; wRI=cp.wRI; e1=cp.e1; e2=cp.e2; e3=cp.e3; lattice_type=cp.lattice_type; qtau=cp.qtau; w1squared=cp.w1squared; w1cubed=cp.w1cubed; sum3=cp.sum3; } // member access functions friend inline bigcomplex gettau(const Cperiods& cp) {return cp.tau; } friend inline int get_lattice_type(const Cperiods& cp) {return cp.lattice_type; } bigcomplex get_real_period() const {return wR;} int getwi(bigcomplex& ww1, bigcomplex& ww2) const { ww1=w1; ww2=w2; return lattice_type; } int getwRI(bigcomplex& wr, bigcomplex& wri) const { wr=wR; wri=wRI; return lattice_type; } friend inline ostream& operator<<(ostream& os, const Cperiods& cp) { os<<"[w_1,w_2] = ["<1, or 0 < Re(z) <= +1/2 and |z|=1. Note that -I always fixes // z, so does [0,-1;1,0] (of order 4) if z=i (covariant a multiple // of (X^2+Y^2)), and [1,1;-1,0] (of order 6) if z=(1+sqrt(-3))/2 // (covariant a multiple of (X^2+XY+Y^2). void sl2_reduce(unimod& m); // for an sl2-reduced cubic, normalise w.r.t. <-I> (default) or // or . Two reduced and normalised forms are SL(2,Z)-equivalent // iff they are equal void normalise(unimod& m); // Test for sl2/gl2-equivalence: int sl2_equivalent(const cubic& G) const; int gl2_equivalent(const cubic& G) const; // Test for sl2/gl2-equivalence to one in a list: int sl2_equivalent_in_list(const vector& Glist) const; int gl2_equivalent_in_list(const vector& Glist) const; // affine roots of F mod q, assuming leading coefficient a() is nonzero: vector roots_mod(const bigint& q) const; // Return 1 iff F has a projective root mod q: int has_roots_mod(const bigint& q) const; // Mathews quantities for use when disc<0: bigint mat_c1() const { return d()*(d()-b())+a()*(c()-a());} bigint mat_c2() const { return a()*d() - (a()+b())*(a()+b()+c());} bigint mat_c3() const { return a()*d() + (a()-b())*(a()-b()+c());} // P, Q, R: coefficients of the Hessian, used for reduction when disc>0 bigint p_semi() const { return sqr(b())-3*a()*c(); } bigint q_semi() const { return b()*c()-9*a()*d(); } bigint r_semi() const { return sqr(c())-3*b()*d(); } bigint u_semi() const { return 2*b()*sqr(b()) + 27*sqr(a())*d() - 9*a()*b()*c();} // jc_reduce uses the algebraic real quadratic covariant with coeffs // [h0,h1,h2]. A form is reduced if -h0=0, C2>=0, C3>0 and C4>=0 if C1=0. // jc_c1() is the quantity denoted C1=N(h2-h0) in the paper, its // sign is sign(h2-h0) so is >=0 for a reduced form: bigint j_c1() const; // jc_c2() is the quantity denoted C2=N(h0-h1) in the paper, its // sign is sign(h0-h1) so is >=0 for a reduced form: bigint j_c2() const; // jc_c3() is the quantity denoted C3=N(h0+h1) in the paper, its // sign is sign(h1+h0) so is >0 for a reduced form: bigint j_c3() const; // jc_c4() is not in the paper, its sign is sign(h1) so is >=0 for a // reduced form with C1=0, i.e. with h0=h1: bigint j_c4() const; bigcomplex hess_root() const; bigfloat real_root() const; // requires disc<0 int is_hessian_reduced() const; // for positive discriminant only void hess_reduce(unimod& m); void mathews_reduce(unimod& m); int is_jc_reduced() const; // for negative discriminant only void jc_reduce(unimod& m); // Just shifts x, returns the shift amount: bigint shift_reduce(); vector rational_roots() const; int is_reducible() const {return ((a()==0) || (rational_roots().size()>0));} int is_irreducible() const {return ((a()!=0) && (rational_roots().size()==0));} bigint content() const { return gcd(gcd(gcd(coeffs[0], coeffs[1]), coeffs[2]), coeffs[3]); } int is_primitive() const { return content()==1; } // divide by a constant factor (which should divide all the coefficients) cubic operator/(const bigint& g) const { return cubic(coeffs[0]/g, coeffs[1]/g, coeffs[2]/g, coeffs[3]/g); } }; inline ostream& operator<<(ostream& os, const cubic& g) { return os<<"["< reduced_cubics(const bigint& disc, int include_reducibles=1, int gl2=0, int verbose=0); // All reduced cubics with discriminant in range (0,maxdisc] if maxdisc>0 or [maxdisc,0) if maxdisc<0 // (not yet implemented) vector reduced_cubics_range(const bigint& maxdisc, int verbose=0); #endif eclib-20250122/libsrc/eclib/curve.h000066400000000000000000000305311474421343600166720ustar00rootroot00000000000000// curve.h: declarations of elliptic curve classes ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // originally adapted from Elliptic.h by Oisin McGuiness // allow for multiple includes #ifndef _ECLIB_ELLIPTIC_ #define _ECLIB_ELLIPTIC_ #include #include #include class Curve; class Curvedata; class CurveRed; class Point; class IsogenyClass; //general test: int valid_invariants(const bigint& c4, const bigint& c6); //true if valid void c4c6_to_ai(const bigint& c4, const bigint& c6, bigint& a1, bigint& a2, bigint& a3, bigint& a4, bigint& a6, bigint& b2, bigint& b4, bigint& b6, bigint& b8); void c4c6_to_ai(const bigint& c4, const bigint& c6, bigint& a1, bigint& a2, bigint& a3, bigint& a4, bigint& a6); void minimise_c4c6(const bigint& c4, const bigint& c6, const bigint& discr, bigint& newc4, bigint& newc6, bigint& newdiscr, bigint& u); // // base class for bare elliptic curve // class Curve{ friend class Point; friend class IsogenyClass; public: int isnull() const {return ((a1==0)&&(a2==0)&&(a3==0)&&(a4==0)&&(a6==0));} void getai(bigint& aa1, bigint& aa2, bigint& aa3, bigint& aa4, bigint& aa6) const {aa1=a1; aa2=a2; aa3=a3; aa4=a4; aa6=a6; } // input and output void output(ostream& os) const { os<<"["<& qai, bigint& scale); Curvedata(const Curve& c, int min_on_init); Curvedata(const bigint& cc4, const bigint& cc6, int min_on_init); Curvedata(const Curvedata& c); Curvedata(const Curvedata& c, int min_on_init); // nb compiler cannot generate copy because constructor from // curve overrides. // But default assign, destruct suffice void operator=(const Curvedata& c); void minimalize(); // Changes self in situ void factor_discr() {if(!discr_factored){ the_bad_primes=pdivs(discr); discr_factored=1; }} Curvedata minimalize(bigint& u, bigint& r, bigint& s, bigint& t) const; // Self unchanged and returns transformation void transform(const bigint& r, const bigint& s, const bigint& t); // NB u = 1; // the more general case is not implemented here void output(ostream& os) const; void input(istream& is); long get_ntorsion(); // implemented in points.cc void getbi(bigint& bb2, bigint& bb4, bigint& bb6, bigint& bb8) const {bb2=b2; bb4=b4; bb6=b6; bb8=b8; } void getci(bigint& cc4, bigint& cc6) const {cc4=c4; cc6=c6; } friend inline bigint getb2(const Curvedata& c) {return c.b2; } friend inline bigint getb4(const Curvedata& c) {return c.b4; } friend inline bigint getb6(const Curvedata& c) {return c.b6; } friend inline bigint getb8(const Curvedata& c) {return c.b8; } friend inline bigint getc4(const Curvedata& c) {return c.c4; } friend inline bigint getc6(const Curvedata& c) {return c.c6; } friend inline bigint getdiscr(const Curvedata& c) {return c.discr; } friend inline int getconncomp(const Curvedata& c) {return c.conncomp; } friend inline vector getbad_primes(Curvedata& c) { if(!c.discr_factored) c.factor_discr(); return c.the_bad_primes; } // NB the is_minimal function returns 0 when minimization has not // been done; the curve may still be minimal friend int is_minimal(const Curvedata& c) {return c.minimal_flag;} protected: bigint b2 ; bigint b4 ; bigint b6 ; bigint b8 ; bigint c4 ; bigint c6 ; bigint discr ; int minimal_flag; // 0 if .minimalize() has not been called int discr_factored; // 0 if discr has not yet been factored vector the_bad_primes; //prime divisors of discriminant int conncomp ; // number of components (1 or 2) long ntorsion; // 0 if .gettorsion() not called } ; // function to find "optimal x shift" of a given curve Curvedata opt_x_shift(const Curvedata& C, bigint& k); /* // // further derived class for curve, invariants and periods: // class CurvedataExtra : public Curvedata{ public: CurvedataExtra(const Curvedata&) ; virtual void output(ostream& os) const; void input(istream& is) {cout<<"*** You cannot input a CurvedataExtra -- must be just Curve\n"; exit(1); } void getroots(bigfloat& r1, bigfloat& r2, bigfloat& r3) const {r1=roots[0]; r2=roots[1]; r3=roots[2]; } // NB caller should then look at conncomp to see how many are set friend inline bigfloat getperiod(const CurvedataExtra c) {return c.period; } protected: bigfloat roots[3] ; // real two-division points; NB if there's only one, // it is stored in roots[2] bigfloat period ; // smallest real period * conncomp } ; */ // // CurveRed class call Tates algorithm as constructor, // stores the info as member variables // class Kodaira_code just holds an int which "codes" the type as follows: // (this coding originally from R.G.E.Pinch) // // Im -> 10*m // I*m -> 10*m+1 // I, II, III, IV -> 1, 2, 3, 4 // I*, II*. III*, IV* -> 5, 6, 7, 8 // class Kodaira_code { public: int code; // Kodaira_code(int k = 0) : code(k) {;} Kodaira_code(const Kodaira_code& c) : code(c.code) {;} void operator=(int k) {code=k;} void operator=(const Kodaira_code& c) {code=c.code;} friend ostream& operator<<(ostream& os, const Kodaira_code& c); }; // utility function for converting Kodaira codes to the Pari coding // Kodaira Symbol My coding Pari Coding // I0 0 1 // I*0 1 -1 // Im (m>0) 10*m m+4 // I*m (m>0) 10*m+1 -(m+4) // II, III, IV 2, 3, 4 m // II*. III*, IV* 7, 6, 5 -m int PariKodairaCode(Kodaira_code Kod); class Reduction_type { public: int ord_p_discr; int ord_p_N; int ord_p_j_denom; Kodaira_code Kcode; // NB the constructor makes this from an int int c_p; int local_root_number; // Reduction_type(int opd=0, int opN=0, int opj=0, int kc=1, int cp=1, int rno=0) : ord_p_discr(opd), ord_p_N(opN), ord_p_j_denom(opj), Kcode(kc), c_p(cp), local_root_number(rno) {} }; inline ostream& operator<<(ostream& os, const Reduction_type& R); class CurveRed : public Curvedata { friend class IsogenyClass; protected: map reduct_array; // maps p -> its reduction type bigint N; //the conductor public: CurveRed() : Curvedata(), N(0) {} explicit CurveRed(const Curvedata& E); // construct by Tate's algorithm // arg E need not be minimal, but the reduced form will be ~CurveRed(); CurveRed(const CurveRed& E); void operator=(const CurveRed& E); // The full display function is not const, since if called they will // compute and set the local root numbers if necessary void display(ostream& os); // full output void output(ostream& os) const; // just the curvedata and conductor private: // functions for setting local root numbers: int neron(long p, int kod); // p = 2 or 3 void setLocalRootNumber(const bigint& p); void setLocalRootNumber2(); void setLocalRootNumber3(); void setLocalRootNumber_not_2_or_3(const bigint& p); public: // member access functions: friend inline vector getbad_primes(const CurveRed& c) {return c.the_bad_primes; } friend inline bigint getconductor(const CurveRed& c) {return c.N; } friend int getord_p_discr(const CurveRed& c, const bigint& p); friend int getord_p_N(const CurveRed& c, const bigint& p); friend int getord_p_j_denom(const CurveRed& c, const bigint& p); friend int getc_p(const CurveRed& c, const bigint& p); friend vector all_cp(const CurveRed& c); friend bigint prodcp(const CurveRed& c); friend int LocalRootNumber(CurveRed& c, const bigint& p); friend int GlobalRootNumber(CurveRed& c); friend Kodaira_code getKodaira_code(const CurveRed& c, const bigint& p); // the returned value casts as a character array; to use coded as int, // say declared Kodaira_code Kc, just use public member Kc.code friend bigint Trace_Frob(CurveRed& c, const bigint& p); // The local Tamagawa number. Use p=0 for reals friend bigint local_Tamagawa_number(CurveRed& c, const bigint& p); // The local Tamagawa exponent -- same as Tamagawa number unless the // component group is (2,2). Use p=0 for reals friend bigint local_Tamagawa_exponent(CurveRed& c, const bigint& p); // The global Tamagawa exponent, i.e. the lcm of the exponents of // the component groups at all bad primes (including infinity if // real_too is 1), which is the lcm of the local Tamagawa exponents. // So (with no further knowledge of the MW group) we know that m*P // is in the good-reduction subgroup for all P, with this m. friend bigint global_Tamagawa_exponent(const CurveRed& c, int real_too); }; // The global Tamagawa number, = product of local ones. bigint global_Tamagawa_number(CurveRed& c, int real_too); // Tamagawa primes: primes dividing any Tamagawa number vector tamagawa_primes(const CurveRed& C, int real_too); inline ostream& operator<<(ostream& os, const Curve& c) { c.output(os); return os; } inline ostream& operator<<(ostream& os, const Curvedata& c) { c.output(os); return os; } inline ostream& operator<<(ostream& os, const CurveRed& c) { c.output(os); return os; } inline istream& operator>>(istream& is, Curve& c) { c.input(is); return is ; } inline istream& operator>>(istream& is, Curvedata& c) { c.input(is); return is ; } //Reads the curve (ai) and computes the rest. inline int GlobalRootNumber(const Curvedata& E) { CurveRed C(E); return GlobalRootNumber(C); } // end of file: curve.h #endif eclib-20250122/libsrc/eclib/curvemod.h000066400000000000000000000063611474421343600173760ustar00rootroot00000000000000// curvemod.h: declaration of class curvemodq for elliptic curve mod (prime) q ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // allow for multiple includes #ifndef _ECLIB_CURVEMOD_ #define _ECLIB_CURVEMOD_ #include #include // Class for an elliptic curve mod q // // The q is fixed -- must be set before use! // class pointmodq; class curvemodq { protected: galois_field* Fq; // pointer to ground field bigint q; // the modulus gf_element a1,a2,a3,a4,a6; // the coefficients mod q bigint order; // number of points (0 if not set) public: // constructors curvemodq(void); curvemodq(const Curve& E, const bigint& qq); ~curvemodq(); curvemodq(const curvemodq& C); // copy constructor void operator=(const curvemodq& C); // assignment // access void get_ai(gf_element& aa1, gf_element& aa2, gf_element& aa3, gf_element& aa4, gf_element& aa6) const { aa1=a1; aa2=a2; aa3=a3; aa4=a4; aa6=a6; } // output void output(ostream& os) const {os<<"["< #include #define USE_NEW_CODE_LETTERS int booknumber0(int level, int form); // permutes numbers starting from 0 const char alphabet[] = "abcdefghijklmnopqrstuvwxyz"; int booknumber(int level, int form); // permutes numbers starting from 1 // new-new codes (from 01.08.05) are: // a,b,...,z,ba,bb,...,bz,ca,cb,... etc., i.e. straight base 26 with // digits a=0, b=1, ..., z=25 // Function to convert new code to integer (from 0) for any length of code. // NB N=176400 has 516 < 26^2 newforms, with codes from a to vt! int codeletter_to_int(string code); // i counts from 0! // Function to convert integer (from 0) to new code string new_codeletter(int i); // i counts from 0! #ifdef USE_NEW_CODE_LETTERS inline string codeletter(int i) {return new_codeletter(i);} #else inline string codeletter(int i) {return old_codeletter(i);} #endif #endif eclib-20250122/libsrc/eclib/cusp.h000066400000000000000000000034731474421343600165250ustar00rootroot00000000000000// FILE CUSP.H ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_CUSP_H #define _ECLIB_CUSP_H 1 //flags that this file has been included #include #include class cusplist { private: const moddata* N; vector list; int cuspeq(const rational& c1, const rational& c2, int plusflag=0) const; public: cusplist(long n=0, const moddata* iN=0) :N(iN) {list.reserve(n);} long index(const rational& a); long index_1(const rational& a); long index_2(const rational& a); rational item(long n) const { if (n int desc2(const bigint& c, const bigint& d1, const bigint& d2, const vector& plist, const vector& supp, const vector& bgens, long mask, double hlim, bigint& x, bigint& y, bigint& z, int verb, int selmer_only=0, int alldesc=0); // Works on homogeneous space (d1,0,c,0,d2) // Returns // -1 if it certainly has no points (if no ELS descendents) // +1 if it has a point (coordinates returned in x, y, z) // 0 if undecided (ELS descendents exist but no rational points were found) // if alldesc==1 it does not stop when it finds one descendent with a point on it, // but goes on to look at all the others. #endif eclib-20250122/libsrc/eclib/descent.h000066400000000000000000000125601474421343600171750ustar00rootroot00000000000000// descent.h: declaration of classes rank12 and two_descent ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_DESCENT_H_ #define _ECLIB_DESCENT_H_ #include "mwprocs.h" // rank12 is a common base for separate classes rank1 and rank2 (for // computing rank via general 2-descent and descent via 2-isogeny // repectively); class two_descent is a user interface to these // rank12 must be given a minimal (integral) model. two_descent can // be given a non-minimal (integral) model, and will work with the // minimal model; any points returned will be transferred back to the // original model class rank1; class rank2; class two_descent; class rank12 { protected: Curvedata* the_curve; int verbose, certain, success, selmer_only, do_second_descent; long num_aux; long rank, rank_bound, selmer_rank; Curvedata IJ_curve; // [0,0,0,-27*I,-27*J] bigint tr_u,tr_r,tr_s,tr_t; // transformation from latter to minimal curve long lim1, lim2; public: // Constructor: // // sel is selmer_only switch // firstlim is bound on |x|+|z| // secondlim is bound on log max {|x|,|z| }, i.e. logarithmic // n_aux only relevant for general 2-descent when 2-torsion trivial // n_aux=-1 causes default to be used (depends on method) // second_descent only relevant for descent via 2-isogeny rank12(){;} rank12(Curvedata* ec, int verb=0, int sel=0, long firstlim=20, long secondlim=5, long n_aux=-1, int second_descent=1) :the_curve(ec), verbose(verb), selmer_only(sel), do_second_descent(second_descent), num_aux(n_aux), lim1(firstlim), lim2(secondlim) {;} virtual ~rank12() {;} long getrank() const {return rank;} long getrankbound() const {return rank_bound;} long getselmer() const {return selmer_rank;} long getcertain() const {return certain;} int ok() const {return success;} // virtual long getselmerprime() const=0; virtual Curvedata getEprime() const=0; virtual long getselmerphi() const=0; virtual long getselmerphiprime() const=0; // virtual void listpoints()=0; virtual void listpoints(Curvedata* CD_orig, const bigint& u, const bigint& r, const bigint& s, const bigint& t)=0; virtual vector getgens() const =0; virtual vector getpoints() =0; }; class two_descent { private: rank12 * r12; // does all the work int verbose, two_torsion_exists, selmer_only; int success, certain, fullmw; long rank, rank_bound, selmer_rank, sat_bound; mw* mwbasis; vector qai; // Coefficients of initial curve Curvedata e_orig, e_min; bigint u,r,s,t; // transform between e_orig and e_min bigint v; // scaling factor needed to make input curve integral void do_the_descent(long firstlim, long secondlim, long n_aux, int second_descent); // (called by constructors) public: // Constructor: // // sel is selmer_only switch // firstlim is bound on |x|+|z| // secondlim is bound on log max {|x|,|z| }, i.e. logarithmic // n_aux only relevant for general 2-descent when 2-torsion trivial // n_aux=-1 causes default to be used (depends on method) // second_descent only relevant for descent via 2-isogeny explicit two_descent(Curvedata* ec, int verb=0, int sel=0, long firstlim=20, long secondlim=5, long n_aux=-1, int second_descent=1); // Version which takes a vector [a1,a2,a3,a4,a6] of *rationals* explicit two_descent(vector ai, int verb=0, int sel=0, long firstlim=20, long secondlim=5, long n_aux=-1, int second_descent=1); ~two_descent() {delete r12; delete mwbasis;} long getrank() const {return rank;} long getrankbound() const {return rank_bound;} long getselmer() const {return selmer_rank;} long getselmerprime() const {return r12->getselmerprime();} Curvedata getEprime() const {return r12->getEprime();} long getselmerphi() const {return r12->getselmerphi();} long getselmerphiprime() const {return r12->getselmerphiprime();} long getcertain() const {return certain;} int ok() const {return success;} int get2t() const {return two_torsion_exists;} int getfullmw() const {return fullmw;} bigfloat regulator() {return mwbasis->regulator();} vector getbasis(); // returns points on original model vector getpbasis(); // returns points on integral model void report_rank() const; // sat_bd=0 for none; assume saturated at p<=sat_low_bd void saturate(long sat_bd, long sat_low_bd=2); void show_gens(); // display points on original model void show_result_status(); void pari_output(); }; #endif eclib-20250122/libsrc/eclib/divpol.h000066400000000000000000000053501474421343600170440ustar00rootroot00000000000000// divpol.h: declaration of functions for division polynomials ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // allow for multiple includes #ifndef _ECLIB_DIVPOL_ #define _ECLIB_DIVPOL_ #include // These functions return the vector of coefficients (starting with // the constant term) rather than polynomial types // div_pol_odd(a1,a2,a3,a4,a6,n) returns the coefficients of the // polynomial in x whose zeros are the (x-coordinates of the) non-zero // points P on E=[a1,a2,a3,a4,a6] satisfying nP=0 (odd n) // The poly itself is found recursively // Despite the name, for even n this returns a correct n-division // polynomial without the 2-torsion factor, i.e. the polynomial whoe // roots are the x-coordinates of the points P satisfying nP=0, 2P!=0. ZPoly div_pol_odd(const bigint& a1,const bigint& a2,const bigint& a3,const bigint& a4, const bigint& a6,int n); ZPoly div_pol_2(const bigint& a1,const bigint& a2,const bigint& a3,const bigint& a4, const bigint& a6); ZPoly div_pol(const bigint& a1,const bigint& a2,const bigint& a3,const bigint& a4, const bigint& a6,int n); ZPoly division_polynomial(Curvedata* EE, int p); // Numerator and denominator of the multiplication-by-n map on the x-coordinate ZPoly mul_by_n_num(const bigint& a1,const bigint& a2,const bigint& a3,const bigint& a4, const bigint& a6, int n); ZPoly mul_by_n_den(const bigint& a1,const bigint& a2,const bigint& a3,const bigint& a4, const bigint& a6, int n); // Polynomial whose roots are x(Q) for Q satisfying n*Q=P, where x(P)=xP/zP ZPoly division_points_X_pol(const bigint& a1,const bigint& a2,const bigint& a3,const bigint& a4, const bigint& a6, int n, const bigint& xP, const bigint& zP); #endif // #define _DIVPOL_ eclib-20250122/libsrc/eclib/egr.h000066400000000000000000000112421474421343600163210ustar00rootroot00000000000000// egr.h : declaration of functions for reduction of points & component groups ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // allow for multiple includes #ifndef _ECLIB_EGR_H_ #define _ECLIB_EGR_H_ #include // class to handle component groups at primes of bad reduction etc // NB all of the internal methods assume that the curve is a global // minimal model. The normal use of the class will be via the // function egr_index() which handles computation of a minimal model // and transferring the points to the minimal model where necessary, class ComponentGroups : public CurveRed { public: explicit ComponentGroups(const Curvedata& CD) : CurveRed(CD) {;} explicit ComponentGroups(const CurveRed& CR) : CurveRed(CR) {;} // ComponentGroups(const Curve& C) : CurveRed(C) {;} ComponentGroups() : CurveRed() {;} // return 1 iff P mod p is nonsingular for all p (including infinity); // else return 0 and put the first prime of bad reduction into p0: int HasGoodReduction(const Point& P, bigint& p0) const { return P.has_good_reduction(the_bad_primes, p0, 1); } // Returns [m] for cyclic of order m, [2,2] for 2*2 (type I*m, m even) vector ComponentGroup(const bigint& p) const; // Returns 1 iff P and Q have same image in the component group at p: int InSameComponent(const Point& P, const Point& Q, const bigint& p) const; // For reduction type Im, multiplicative reduction where component // group is cyclic of order m, returns a such that P mod p maps to a // mod m in the component group // N.B.1 This will always return a in the range [0..m/2] and CANNOT // distinguish between P and -P! Be warned! // N.B.2 The case of noncyclic component group is not handled here. long ImageInComponentGroup(const Point&P, const bigint& p, vector grp) const; long ImageInComponentGroup_Im(const Point&P, const bigint& p, int m) const; long ImageInComponentGroup_Im_pm(const Point&P, const bigint& p, int m) const; // Return least j>0 such that j*P has good reduction at p, i.e. the // order of the image of P in the component group at p; the component // group is given int OrderInComponentGroup(const Point& P, const bigint& p, vector grp); // replace (independent) points in Plist with a new set which spans // the subgroup of the original with good reduction at p, returning // the index int gr1prime(vector& Plist, const bigint& p); // replace (independent) points in Plist with a new set which spans // the subgroup of the original with good reduction at all p in plist, // returning the overall index int grprimes(vector& Plist, const vector& plist); // replace (independent) points in Plist with a new set which spans // the subgroup of the original with good reduction at all p, // returning the overall index int grprimes(vector& Plist) {return grprimes(Plist,the_bad_primes);} // replaces the (independent) points with a new set which spans the // subgroup of the original with good reduction at all p, // returning the overall index int egr_subgroup(vector& Plist, int real_too=1); }; // returns the index in the subgroup generated by the given points of // its egr subgroup (the points are unchanged) bigint egr_index(const vector& Plist, int real_too=1); // Given a list of points P1,...,Pn and a prime p, this returns a // vector [c1,c2,...,cn] where the image of Pi in the component group // is ci mod m, where m is the exponent of the component group at p. // // Each ci is a vector of length 1 or 2 (the latter for when the // component group is C2xC2), not just an integer. // // If p=0 then m=1 or 2 (m=2 iff there are two real components and at // least one P_i is not in the connected component) // vector > MapPointsToComponentGroup(const ComponentGroups& CG, const vector& Plist, const bigint& p); #endif eclib-20250122/libsrc/eclib/elog.h000066400000000000000000000077651474421343600165110ustar00rootroot00000000000000// elog.h: declarations of elliptic logarithm functions ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_ELOG_H_ #define _ECLIB_ELOG_H_ #include "points.h" #include "cperiods.h" ////////////////////////////////////////////////////////////////////////// // // Functions for passing between the complex torus C/L and a // Weierstrass model for an elliptic curve // ////////////////////////////////////////////////////////////////////////// // 1. Elliptic logarithm // Given an elliptic curve and its (precomputed) periods, and a real // or rational (but NOT complex) point P=(x,y), returns the unique // complex number z such that // (1) \wp(z)=x+b2/12, \wp'(z)=2y+a1*x+a3, // (2) either z is real and 0\le z\lt w1, or Delta>0, z-w2/2 is real // and 0\le z-w2/2\le w1. // Here, [w1,w2] is the standard period lattice basis // c.f. Cohen page 399 // First & second functions: P=[x,y] with x,y real; maps to z mod lattice bigcomplex ellpointtoz(const Curvedata& E, const Cperiods& per, const bigfloat& x, const bigfloat& y); inline bigcomplex ellpointtoz(const Curvedata& E, const Cperiods& per, const vector P) {return ellpointtoz(E,per,P[0],P[1]);} // Third function: P=rational point; maps to z mod lattice inline bigcomplex elliptic_logarithm(const Curvedata& E, const Cperiods& per, const Point& P) { if(P.is_zero()) return bigcomplex(to_bigfloat(0)); bigfloat xP, yP; P.getrealcoordinates(xP,yP); return ellpointtoz(E,per,xP,yP); } // 2. Weierstrass functions (interface to cperiods.h/cc) // Cperiods is a class containing a basis for the period lattice L; // it knows how to compute points from z mod L; so this function // effectively does the same as PARI's ellztopoint() // // First function: given z mod L, returns complex vector [x,y] vector ellztopoint(Curvedata& E, const Cperiods& per, const bigcomplex& z); // Second function, expects to return a rational point. // User supplies a denominator for the point; if it doesn't work, the // Point returned is 0 on the curve Point ellztopoint(Curvedata& E, const Cperiods& per, const bigcomplex& z, const bigint& den); // Returns a (possibly empty) vector of solutions to m*Q=P // First version will compute the Cperiods itself, so best to use the // second one if more than one call is to be made for the same curve // // Set only_one=1 if at most one solution required (but more may be returned) vector division_points(Curvedata& E, const Point& P, int m, int only_one=0); vector division_points(Curvedata& E, const Cperiods& per, const Point& P, int m, int only_one=0); // Set Q to a solution of m*Q=P and return 1 if a solution exists, else return 0 int divide_point(Curvedata& E, const Point& P, int m, Point& Q); // Returns a vector of solutions to m*Q=0 (including Q=0) // First version will compute the Cperiods itself, so best to use the // second one if more than one call is to be made for the same curve // For a version using no floating point, see m_torsion(E) in points.h vector torsion_points(Curvedata& E, int m); vector torsion_points(Curvedata& E, const Cperiods& per, int m); #endif eclib-20250122/libsrc/eclib/ffmod.h000066400000000000000000000072321474421343600166430ustar00rootroot00000000000000// ffmod.h: declaration of class ffmodq and Weil pairing functions ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // ffmodq is the function field of an elliptic curve mod a prime q // (or more precisely the affine coordinate ring Fq[x,y]) // allow for multiple includes #ifndef _ECLIB_FFMOD_ #define _ECLIB_FFMOD_ #include "pointsmod.h" class ffmodq{ public: // static members defining the function field: static galois_field Fq; // the constant field static curvemodq E; // the curve mod q static FqPoly f1, f2; // f2=a1*x+a3, f2=x^3+a2*x^2+a4*x+a6 static void init(const curvemodq& EE); // set Fq, E, f1, f2 // data defining one element of th function field: FqPoly h1, h2; // for h1+y*h2 public: // constructors // normal ones: ffmodq(void) { init_h1h2(); FqPolyAssign0(h1); FqPolyAssign0(h2); } explicit ffmodq(const gf_element& c) { init_h1h2(); FqPolyAssignGF(h1,c); FqPolyAssign0(h2); } explicit ffmodq(const bigint& c) { init_h1h2(); FqPolyAssignZ(h1,c); FqPolyAssign0(h2); } explicit ffmodq(const FqPoly& hh1) { init_h1h2(); h1=hh1; FqPolyAssign0(h2); } ffmodq(const FqPoly& hh1, const FqPoly& hh2) :h1(hh1), h2(hh2) {} // initialization void init_h1h2(void) { FqPolySetField(h1,Fq); FqPolySetField(h2,Fq); } // equality test int operator==(const ffmodq& b) const; int operator!=(const ffmodq& b) const {return !((*this)==b);} // output void output(ostream& os) const; // addition, subtraction, multiplication ffmodq operator+(const ffmodq& b) const; ffmodq operator-(const ffmodq& b) const; ffmodq operator*(const ffmodq& b) const; ffmodq operator*(const FqPoly& h) const; // division ffmodq operator/(const FqPoly& h) const; ffmodq operator/(const ffmodq& b) const; // evaluation at a point: gf_element evaluate(const pointmodq& P) const; gf_element operator()(const pointmodq& P) const {return this->evaluate(P);} // vertical line through a point: friend ffmodq vertical(const pointmodq& P); // tangent at a point: friend ffmodq tangent(const pointmodq& P); // chord between points: friend ffmodq chord(const pointmodq& P, const pointmodq& Q); }; // weil_pol(T,m): T is a point of finite order m; returns a function // f_T whose divisor is m(T)-m(0). // The second version evaluates that at another point S without // actually computing the polynomial ffmodq weil_pol(const pointmodq& T, int m); gf_element evaluate_weil_pol(const pointmodq& T, int m, const pointmodq& S); gf_element weil_pairing(const pointmodq& S, const pointmodq& T, int m); inline ostream& operator<<(ostream& os, const ffmodq& f) { f.output(os); return os; } #endif eclib-20250122/libsrc/eclib/fixc6.h000066400000000000000000000045551474421343600165740ustar00rootroot00000000000000// file fixc6.h: declaration of class for "fixing" large c6 values ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // Background: for curves with large c6, the value cannot be computed // with sufficient precision without using multiprecision floating // point arithmetic, which slows down all the other cases // unnecessarily. To avoid this, after first computing the "correct" // c6 value once in multiprecision, we add that value to a table // indexed by (level, form#), and look up in the table when we need // the value. // The fixc6 class has two static data members, of type map< // pair, bigint> such that an entry ((N,i),c6) or ((N,i),c4) // says that the c6 or c4 value for form i at level N is c6 or c4. Of // course, for most (N,i) pairs this is blank -- and we must avoid // inserting wrong dummy entries of the form ((N,i),0). // April 2005: added facility for fixing c4 as well as c6, but the // class name is unchanged #ifndef _ECLIB_FIXC6_H #define _ECLIB_FIXC6_H 1 //flags that this file has been included #include class fixc6 { static map< pair, bigint > fixc4table; static map< pair, bigint > fixc6table; public: fixc6(); // global initializer, see fixc6.cc void operator()(long N, int i, bigint& c4, bigint& c6); // look up value, changes c4 and/or c6 if there's an entry in the table, // otherwise leaves unchanged }; extern fixc6 c4c6fixer; // the one and only instance of the class #endif eclib-20250122/libsrc/eclib/flinterface.h000066400000000000000000000071511474421343600200320ustar00rootroot00000000000000// flinterface.h: used to provide interface to flint's linear algebra mod p ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // This interface was written with help from Fredrik Johansson // This file will be included either with SCALAR_OPTION=1 or with SCALAR_OPTION=1 #if FLINT // Possible FLINT support is governed by the macros FLINT and __FLINT_VERSION: // // FLINT==0: no FLINT support (or a version <2.3) // FLINT==1: FLINT support using 64-bit nmod_mat (if __FLINT_VERSION<3) // for both SCALAR_OPTION=1 (scalar=in) and 2 (scalar=long) // support using 32-bit hmod_mat (if __FLINT_VERSION>=3) when scalar=int // via Fredrik Stromberg's mini interface to gr_mat //#define TRACE_FLINT_RREF #include #include // must include this first to set __FLINT_VERSION #if (__FLINT_VERSION>2) #include #include #include #endif #include #include #if (__FLINT_VERSION>2)&&(SCALAR_OPTION==1) // using 32-bit int scalars typedef unsigned int hlimb_t; typedef struct { hlimb_t * entries; slong r; slong c; hlimb_t ** rows; nmod_t mod; } hmod_mat_struct; typedef hmod_mat_struct hmod_mat_t[1]; #define hmod_mat_entry(mat,i,j) ((mat)->rows[(i)][(j)]) #define hmod_mat_nrows(mat) ((mat)->r) #define hmod_mat_ncols(mat) ((mat)->c) void hmod_mat_init(hmod_mat_t mat, slong rows, slong cols, hlimb_t n); void hmod_mat_clear(hmod_mat_t mat); void hmod_mat_mul(hmod_mat_t C, const hmod_mat_t A, const hmod_mat_t B); slong hmod_mat_rref(hmod_mat_t mat); #undef uscalar #undef mod_mat #undef mod_mat_init #undef mod_mat_clear #undef mod_mat_entry #undef mod_mat_nrows #undef mod_mat_ncols #undef mod_mat_rref #undef mod_mat_mul #define uscalar hlimb_t // unsigned int #define mod_mat hmod_mat_t // uses unsigned ints #define mod_mat_init hmod_mat_init #define mod_mat_clear hmod_mat_clear #define mod_mat_entry hmod_mat_entry #define mod_mat_nrows hmod_mat_nrows #define mod_mat_ncols hmod_mat_ncols #define mod_mat_rref hmod_mat_rref #define mod_mat_mul hmod_mat_mul #else // __FLINT_VERSION<3 or SCALAR_OPTION=2 -- using 64-bit int scalars #undef uscalar #undef mod_mat #undef mod_mat_init #undef mod_mat_clear #undef mod_mat_entry #undef mod_mat_nrows #undef mod_mat_ncols #undef mod_mat_rref #undef mod_mat_mul #define uscalar mp_limb_t // unsigned long #define mod_mat nmod_mat_t // uses unsigned longs #define mod_mat_init nmod_mat_init #define mod_mat_clear nmod_mat_clear #define mod_mat_entry nmod_mat_entry #define mod_mat_nrows nmod_mat_nrows #define mod_mat_ncols nmod_mat_ncols #define mod_mat_rref nmod_mat_rref #define mod_mat_mul nmod_mat_mul #endif // __FLINT_VERSION >=3 or <3 #endif // FLINT eclib-20250122/libsrc/eclib/getcurve.h000066400000000000000000000025171474421343600173750ustar00rootroot00000000000000// getcurve.h: declaration of function getcurve() for curve input ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #if !defined(_ECLIB_GETCURVE_H) #define _ECLIB_GETCURVE_H 1 //flags that this file has been included #include // Read in a curve as [a1,a2,a3,a4,a6] with ai integers: int getcurve(Curvedata& CD, int verb); // Read in a curve as [a1,a2,a3,a4,a6] with ai rational: int getcurve(vector& ai, int verb); #endif eclib-20250122/libsrc/eclib/gf.h000066400000000000000000000057421474421343600161500ustar00rootroot00000000000000// gf.h: interface for NTL's ZZ_p ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // allow for multiple includes #ifndef _ECLIB_GF_H_ #define _ECLIB_GF_H_ #include #include extern map ZZ_pContextCache; class galois_field { ZZ q; public: galois_field(void); explicit galois_field(const ZZ& qq); bigint characteristic() const {return q;} }; typedef ZZ_p gf_element; #define NewGF(field,name) gf_element name #define GFinit(field,name) name=to_ZZ_p(0) #define GFSetZ(name,Zvalue) name=to_ZZ_p(Zvalue) #define LiftGF(name) rep(name) #define GFrandomize(name) random(name) inline gf_element ZtoGF(const galois_field& F, const bigint& a) { return to_ZZ_p(a); } inline gf_element ItoGF(const galois_field& F, int a) { return to_ZZ_p(a); } // NB Here caller must ensure that a is a square; q odd inline gf_element sqrt(const galois_field& F, const gf_element& a) { bigint rd; sqrt_mod_p(rd,rep(a),F.characteristic()); return ZtoGF(F,rd); } // Returns 1 if a is a square (root in r), else 0 inline int sqrt(const galois_field& F, const gf_element& a, gf_element& r) { bigint rd = to_ZZ(0), repa=rep(a), q = F.characteristic(); switch(legendre(repa,q)) { case -1: return 0; case 1: sqrt_mod_p(rd,repa,q); // & carry through to next lines case 0: r= ZtoGF(F,rd); } return 1; } inline gf_element root_of_unity(const galois_field& F, int n) { ZZ qm1 = F.characteristic()-1; if(qm1%n !=0) return to_ZZ_p(0); qm1/=n; while(1) { ZZ_p mu = random_ZZ_p(); if(mu==to_ZZ_p(0)) continue; power(mu,mu,qm1); if(mu!=to_ZZ_p(1)) return mu; } } inline bigint order(const gf_element& z) { gf_element one=to_ZZ_p(1); gf_element zn=z; bigint n(1); while (zn!=one) {zn*=z; n+=1;} return n; } inline vector roots_of_unity(const galois_field& Fq, int p) { gf_element mu = root_of_unity(Fq,p); // =0 if p ndiv q-1 vectormu_p; mu_p.resize(p); // GFinit(Fq,mu_p[0]); GFSetZ(mu_p[0],1); for(int i=1; i // In all the functions below, the value of the Hilbert symbol is 0 or // 1 (as an int) rather than +1 or -1, for efficiency; inline int eps4(const bigint& u) // u must be odd; m1pow(eps4(u))=chi4(u) { return (u+1)%4==0; // so 1 mod 4 gives 0, // 3 mod 4 gives 1 } inline int omega8(const bigint& u) // u must be odd; m1pow(omega8(u))=chi2(u) { return ((u-3)%8==0)||((u+3)%8==0); // so 1,7 mod 8 give 0, // 3,5 mod 8 give 1 } // Use p=0 for the infinite prime int local_hilbert(const bigint& a, const bigint& b, const bigint& p); inline int local_hilbert(const bigint& a, const bigint& b, const long& p) { return local_hilbert(a,b,bigint(p)); } // Returns 0 if soluble at all primes in list (or all dividing a*b, or // all dividing disc(q)*d) and at infinity; otherwise returns 1 and // puts the first insoluble prime into badp int global_hilbert(const bigint& a, const bigint& b, const vector& plist, bigint& badp); int global_hilbert(const bigint& a, const bigint& b, bigint& badp); int global_hilbert(const quadratic& q, const bigint& d, const vector& plist, bigint& badp); int global_hilbert(const quadratic& q, const bigint& d, bigint& badp); #endif eclib-20250122/libsrc/eclib/homspace.h000066400000000000000000000231261474421343600173470ustar00rootroot00000000000000// FILE HOMSPACE.H: Declaration of class homspace ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_HOMSPACE_H #define _ECLIB_HOMSPACE_H 1 //flags that this file has been included #include #include // If this is defined, the order of primes used for Wq and Tp // operators is the natural order 2, 3, 5, 7, ..., mixing good and bad // primes. Otherwise the order is as in primelist (see moddata.h) // with the bad primes first. This is referred to in two places: the // homspace method op_prime(i) which returns the i'th prime to be // used; and in periods.cc where (when NEW_OP_ORDER is *not* set) some // permutation of eigenvalues needs to be done. #define NEW_OP_ORDER class mat22; // fully defined below class matop; // fully defined below class homspace :public symbdata { //private: public: vector coordindex, needed, freegens; long rk,denom1,denom2; ssubspace kern; // kernel(delta) basis smat tkernbas; // transpose of kernel(delta) basis vector freemods; public: vector coord_vecs; mat projcoord; // # cols = # newforms after they are found long dimension, denom3, ncusps, ncusps2; int cuspidal; // if 1 then compute cuspidal homology public: // Constructor (does all the work): homspace(long n, // the level int hp, // plus-space flag (0 or 1 or -1) int hcusp, // cuspidal flag (0 or 1) int verbose // verbosity (0 : no output // 1 : basic short output // 2 : lots of detail) ); long h1cuspdim() const {return dim(kern);} long h1dim() const {return dimension;} // No confusion with subspace::dim long h1denom() const {return denom1;} long h1cdenom() const {return denom3;} long h1ncusps() const {return ncusps;} vector eigrange(long i); long op_prime(int i); // the i'th operator prime for Tp or Wq mat opmat(int i, int dual, int verb=0); vec opmat_col(int i, int j, int verb=0); mat opmat_cols(int i, const vec& jlist, int verb=0); mat opmat_restricted(int i,const subspace& s, int dual, int verb=0); // versions returning an smat: smat s_opmat(int i,int dual,int verb=0); svec s_opmat_col(int i, int j, int verb=0); smat s_opmat_cols(int i, const vec& jlist, int verb=0); smat s_opmat_restricted(int i,const ssubspace& s, int dual,int verb=0); // Extend a dual vector of length rk to one of length nsymb: vec extend_coords(const vec& v); // Contract a dual vector of length nsymb to one of length rk: vec contract_coords(const vec& v); public: // The next functions express M- & modular symbols in terms of the // basis for H_1(X_0(N);cusps;Z) of dimension rk svec zero_coords() const {return svec(rk);} // zero vector svec coords_from_index(int ind) const; vec proj_coords_from_index(int ind, const mat& m) const; long nfproj_coords_from_index(int ind, const vec& bas) const; svec coords(const symb& s) const; svec coords_cd(long c, long d) const; svec coords(long nn, long dd) const; svec coords(const rational& r) const {return coords(num(r),den(r));} svec coords(const modsym& m) const; // versions which add to an existing svec: void add_coords(svec& v, const symb& s) const; void add_coords_cd(svec& v, long c, long d) const; void add_coords(svec& v, long nn, long dd) const; void add_coords(svec& v, const rational& r) const {add_coords(v,num(r),den(r));} void add_coords(svec& v, const modsym& r) const; // The next functions express M- & modular symbols in terms of the // basis of a (dual) subspace of the whole space // The "projcoord" default (which requires the initialization of the // projcoord matrix as done in newforms::createfromscratch()) which // has one column for each newform // NB these operate on vecs and not svecs // The "nf" versions give scalars and instead of a matrix take a // vector = unique column of a matrix, such as a newform's coordplus // vector. vec proj_coords_cd(long c, long d, const mat& m) const; vec proj_coords_cd(long c, long d) const {return proj_coords_cd(c,d,projcoord);} long nfproj_coords_cd(long c, long d, const vec& bas) const; void add_proj_coords_cd(vec& v, long c, long d, const mat& m) const; void add_proj_coords_cd(vec& v, long c, long d) const {add_proj_coords_cd(v,c,d,projcoord);} void add_nfproj_coords_cd(long& a, long c, long d, const vec& bas) const; vec proj_coords(long n, long d, const mat& m) const; vec proj_coords(long n, long d) const {return proj_coords(n,d,projcoord);} long nfproj_coords(long n, long d, const vec& bas) const; void add_proj_coords(vec& v, long n, long d, const mat& m) const; void add_proj_coords(vec& v, long n, long d) const {add_proj_coords(v,n,d,projcoord);} void add_nfproj_coords(long& aa, long n, long d, const vec& bas) const; vec cuspidalpart(const vec& v) const {return v[pivots(kern)];} svec applyop(const matop& mlist, const rational& q) const; svec applyop(const matop& mlist, const modsym& m) const; // {return applyop(mlist,m.beta())-applyop(mlist,m.alpha());} mat calcop(string opname, long p, const matop& mlist, int dual, int display=0) const; vec calcop_col(string opname, long p, int j, const matop& mlist, int display=0) const; mat calcop_cols(string opname, long p, const vec& jlist, const matop& mlist, int display=0) const; mat calcop_restricted(string opname, long p, const matop& mlist, const subspace& s, int dual, int display=0) const; smat s_calcop(string opname, long p, const matop& mlist, int dual, int display=0) const; svec s_calcop_col(string opname, long p, int j, const matop& mlist, int display=0) const; smat s_calcop_cols(string opname, long p, const vec& jlist, const matop& mlist, int display=0) const; smat s_calcop_restricted(string opname, long p, const matop& mlist, const ssubspace& s, int dual, int display=0) const; public: mat heckeop(long p, int dual, int display=0) const; vec heckeop_col(long p, int j, int display=0) const; mat heckeop_cols(long p, const vec& jlist, int display=0) const; mat heckeop_restricted(long p, const subspace& s, int dual, int display=0) const; smat s_heckeop(long p, int dual, int display=0) const; svec s_heckeop_col(long p, int j, int display=0) const; smat s_heckeop_cols(long p, const vec& jlist, int display=0) const; smat s_heckeop_restricted(long p, const ssubspace& s, int dual, int display=0) const; mat newheckeop(long p, int dual, int display=0) const; mat wop(long q, int dual, int display=0) const; smat s_wop(long q, int dual, int display=0) const; mat fricke(int dual, int display=0) const; mat conj(int dual, int display=0) const; vec conj_col(int j, int display=0) const; mat conj_cols(const vec& jlist, int display=0) const; mat conj_restricted(const subspace& s, int dual,int display=0) const; smat s_conj(int dual, int display=0) const; svec s_conj_col(int j, int display=0) const; smat s_conj_cols(const vec& jlist, int display=0) const; smat s_conj_restricted(const ssubspace& s, int dual, int display=0) const; vec maninvector(long p) const; vec projmaninvector(long p) const; vec projmaninvector(long p, const mat& m) const; vec manintwist(long p) const; vec newhecke(long p, long n, long d) const; // friend class jumps; friend class newforms; }; class mat22 { //2x2 matrix for linear fractional transformations friend class homspace; private: long a,b,c,d; public: mat22(long ia=0, long ib=0, long ic=0, long id=0) :a(ia),b(ib),c(ic),d(id){;} mat22(const mat22& m) :a(m.a),b(m.b),c(m.c),d(m.d) {;} void operator=(const mat22& m) {a=m.a; b=m.b; c=m.c; d=m.d;} void show(ostream& s) const {s << "[" << a << "," << b << ";"<< c << "," << d << "]";} rational operator()(const rational& q)const { long n=num(q),de=den(q); return rational(a*n+b*de,c*n+d*de); } modsym operator()(const modsym& m)const { return modsym((*this)(m.alpha()),(*this)(m.beta())); } svec operator()(const symb& s, const homspace* h)const { long u=s.ceered(),v=s.deered(); return h->coords_cd(a*u+c*v,b*u+d*v); } vec operator()(const symb& s, const homspace* h, const mat& m)const { long u=s.cee(),v=s.dee(); return h->proj_coords_cd(a*u+c*v,b*u+d*v,m); } }; class matop { // formal sum of 2x2 matrices private: vector mats; public: matop(long p, long n); // constructor for hecke ops explicit matop(long p); // constructor for heilbronn matrices matop(long a, long b, long c, long d); // constructor for a single matrix long size() const {return mats.size();} mat22 operator[](long i) const {return mats[i];} friend matop degen_mat(long d); }; inline matop degen_mat(long d) { return matop(d,0,0,1); } inline ostream& operator<< (ostream& s, const mat22& m) { m.show(s); return s; } #endif eclib-20250122/libsrc/eclib/htconst.h000066400000000000000000000150601474421343600172300ustar00rootroot00000000000000// htconst.h: declarations of functions for height bounds ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // allow for multiple includes #ifndef _ECLIB_HTCONST_H_ #define _ECLIB_HTCONST_H_ #include #include #include double silverman_bound(const Curvedata& CD); double cps_bound(const Curvedata& CD); inline double height_constant(const Curvedata& CD) { // return silverman_bound(CD); double b1 = silverman_bound(CD), b2 = cps_bound(CD); return min(b1,b2); } double egr_height_constant(const Curvedata& CD); bigfloat lower_height_bound_search(const Curvedata& CD, const bigfloat& reg); bigfloat Gamma_n(long n); // Gamma(n) = (n-1)! bigfloat Gamma_n_plus_half(long n); // Gamma(n+1/2) = (2n)!sqrt(pi) / (4^n*n!) bigfloat lattice_const(int r); // returns lower bound for height of non-torsion points, following // Cremona & Siksek in ANTS7 bigfloat lower_height_bound(const Curvedata& CD, int egr); // Class to find point of minimal height by searching. // If egr_flag is set it ignores points which do not have everywhere // good reduction (at all finite primes) class point_min_height_finder : public point_processor { Curvedata *E; ComponentGroups CG; // used if egr_flag to test for egr bigint a1,a2,a3,a4,a6; vector c; int iso, egr_flag, verbose; bigfloat min_ht; Point Pmin; vector all_points; //store points found public: explicit point_min_height_finder(Curvedata* EE, int egr=0, int verb=0); ~point_min_height_finder() {}; int process(const bigint& x, const bigint& y, const bigint& z) override; void search(bigfloat h_lim); bigfloat get_min_ht() const {return min_ht;} Point get_min_ht_point() const {return Pmin;} vector points() const {return all_points;} }; // class Interval represents a closed interval [lh,rh] where either // empty=1; or empty=0 and lh <= rh; flags rhinf, lhinf denote // rh=infty and lh=-infty resp. class Interval { bigfloat lh, rh; bool empty, lhinf, rhinf; public: Interval() : empty(0), lhinf(1), rhinf(1) {show(1);} Interval(const bigfloat& a, const bigfloat& b) :lh(a), rh(b), empty(a>b), lhinf(0), rhinf(0) {show(2);} explicit Interval(const bigfloat& a) :lh(a), empty(0), lhinf(0), rhinf(1) {show(3);} Interval(const Interval& I) :lh(I.lh), rh(I.rh), empty(I.empty), lhinf(I.lhinf), rhinf(I.rhinf) {show(4);} void operator=(const Interval& I) {lh=I.lh; rh=I.rh; empty=I.empty; lhinf=I.lhinf; rhinf=I.rhinf;show(5);} friend ostream& operator<< (ostream&s, const Interval&); // void show(int i) {cout< intersect(const vector& L1, const vector& L2); //void output(const vector& L); // class Interval01 represents a closed subinterval [lh,rh] of // [0,1], where either empty=1; or empty=0 and lh <= rh. class Interval01 { bigfloat lh, rh; bool empty; public: Interval01() : lh(to_bigfloat(0)), rh(to_bigfloat(1)), empty(0) {;} Interval01(const bigfloat& a, const bigfloat& b) :lh(a), rh(b), empty(a>b) {;} friend ostream& operator<< (ostream&s, const Interval01&); // void show(int i) {cout< intersect(const vector& L1, const vector& L2); // Class to compute lower bound for height of non-torsion points of good // reduction, following Cremona & Siksek in ANTS7 class CurveHeightConst : public CurveRed, Cperiods { bigfloat c; // archimidean constribution bigfloat e3; // largest (or only) real root bigfloat lower, upper; int n_max; long e_p(long p); // fetch /compute exponent at p map ann; // stored exponents of E0/E1 for first few primes bigfloat D(long n); // fetch /compute denomContrib at n map DE; // stored D_E(n) values bigfloat Bnmu(long n, const bigfloat& mu) // = B_n(mu) { return exp(n*n*mu+c-D(n)); } int test_target(const bigfloat& target, long k); vector canonicalHeightInterval(const bigfloat& target, long k); vector canonicalHeightInterval01(const bigfloat& target, long k); void compute_phase1(); void compute_phase2(); vector solveLEQ(long n, const bigfloat& B); vector solveGEQ(long n, const bigfloat& B); vector solveLEQ01(long n, const bigfloat& B); vector solveGEQ01(long n, const bigfloat& B); vector solveEllNPower(long n, const bigfloat& x1); vector solveEllNPower01(long n, const bigfloat& x1); bigfloat psi(const bigfloat& x); vector ordinates(const bigfloat& x); vector ztopoint(const bigcomplex& z) {return ellztopoint(z, bigcomplex(I2bigfloat(a1)), bigcomplex(I2bigfloat(a2)), bigcomplex(I2bigfloat(a3)));} bigcomplex pointtoz(const bigfloat& x, const bigfloat& y) {return ellpointtoz(*this, *this, x, y);} public: explicit CurveHeightConst(CurveRed& CR); void compute() {compute_phase1(); compute_phase2(); } bigfloat get_value() const {return lower;} }; #endif eclib-20250122/libsrc/eclib/illl.h000066400000000000000000000035251474421343600165050ustar00rootroot00000000000000// illl.h: declarations of functions for integer LLL ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // Integral LLL algorithm (Cohen's book page 94) // // b is an array of n+1 vectors indexed from 0 to n. // b[1]...b[n] are the lattice basis, while b[0] holds the coefficients // of the (diagonal) Gram matrix, so the inner product of b[i] and b[j] // is sum(k,b[0][k]b[i][k]*b[j][k]). // #ifndef _ECLIB_ILLL_H #define _ECLIB_ILLL_H 1 //flags that this file has been included #include "vector.h" // dot product of b[i] and b[j] with weights from b[0]: bigint sdot(const vector& b, int i, int j); // LLL-reduce the vectors b[1],...,b[n] in place. // b is an array of n+1 vectors indexed from 0 to n. // b[1]...b[n] are the lattice basis, while b[0] holds the coefficients // of the (diagonal) Gram matrix, so the inner product of b[i] and b[j] // is sdot(b, i, j) = sum(k,b[0][k]*b[i][k]*b[j][k]). // void lll_reduce(const int n, vector& b); #endif eclib-20250122/libsrc/eclib/interface.h000066400000000000000000000174631474421343600175170ustar00rootroot00000000000000// interface.h: used to provide common interface ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // The macro NO_MPFP can optionally be set. It controls whether most // real and complex floating point functions are implemented using // doubles and complex doubles (if set) or using NTL bigfloats // (RR) and bigcomplexes (if not set, the default) #ifndef _ECLIB_INTERFACE_H_ #define _ECLIB_INTERFACE_H_ #ifndef NO_MPFP // the default is for this *not* to be set #define MPFP #endif #include #include #include #include #include #include #include #include #ifdef _LIBCPP_VERSION #include #else #include #endif #include #include #include #ifndef MININT #define MININT numeric_limits::min() #endif #ifndef MINLONG #define MINLONG numeric_limits::min() #endif #ifndef MAXINT #define MAXINT numeric_limits::max() #endif #ifndef MAXLONG #define MAXLONG numeric_limits::max() #endif const double LOG_10_2=0.30102999566398114L; // integers and rationals // Some of the following were defined for compatibility with LiDIA, which is no longer supported #include #include using namespace NTL; typedef ZZ bigint; inline int is_long(const bigint& a) {return (a<=MAXLONG)&&(a>=MINLONG);} inline int is_int(const bigint& a) {return (a<=MAXINT)&&(a>=MININT);} int I2int(const bigint& x); // too long to inline long I2long(const bigint& x); // too long to inline // Reals and Complexes #ifdef MPFP #include typedef RR bigfloat; RR Pi(); RR Euler(); RR atan(const RR&); RR asin(const RR&); inline RR pow(const RR& a, int e) {return power(a,e);} inline RR pow(const RR& a, long e) {return power(a,e);} namespace NTL { inline RR cosh(const RR& x) {return (exp(x)+exp(-x))/2;} inline RR sinh(const RR& x) {return (exp(x)-exp(-x))/2;} inline RR tan(const RR& x) {return sin(x)/cos(x);} RR atan2(const RR&, const RR&); inline int is_approx_zero(const RR& x) { if (IsZero(x)) return 1; long n = x.exponent()+RR::precision()-1; if (n>=0) return 0; // cout<<"x="<>n; set_precision(n);} // read current precision converted to decimal (approximately) inline long decimal_precision() {return long(RR::precision()*LOG_10_2);} // read current bit precision inline long bit_precision() {return RR::precision();} inline int is_approx_zero(const bigcomplex& z) {return is_approx_zero(z.real())&&is_approx_zero(z.imag());} inline RR to_bigfloat(const int& n) {return to_RR(n);} inline RR to_bigfloat(const long& n) {return to_RR(n);} inline RR to_bigfloat(const double& x) {return to_RR(x);} inline RR I2bigfloat(const bigint& x) { return to_RR(x);} inline double I2double(const bigint& x) {return to_double(x);} inline int doublify(const bigfloat& x, double& d){ d=to_double(x); return 0;} int longify(const bigfloat& x, long& a, int rounding=0); inline int is_real_zero(bigfloat x) {return IsZero(x);} inline int is_complex_zero(bigcomplex z) {return IsZero(z.real()) && IsZero(z.imag());} inline void Iasb(bigint& a, bigfloat x) {RoundToZZ(a,x);} inline void Iasb(long& a, bigfloat x) {ZZ n; RoundToZZ(n,x); a=I2long(n);} istream& operator>>(istream& is, bigcomplex& z); inline bigcomplex pow(const bigcomplex& a, int e) {return (to_RR(e)*a.log()).exp();} inline bigcomplex pow(const bigcomplex& a, long e) {return (to_RR(e)*a.log()).exp();} inline bigcomplex pow(const bigcomplex& a, const RR& e) {return (e*a.log()).exp();} ////////////////////////////////////////////////////////////////// #else // C doubles and libg++ Complexes ////////////////////////////////////////////////////////////////// // reals typedef double bigfloat; inline long decimal_precision() {return 14;} inline long bit_precision() {return 52;} inline int is_real_zero(double x) {return fabs(x)<1e-14;} inline int is_approx_zero(double x) {return fabs(x)<1e-11;} inline int sign(double x) {return (double(0) < x) - (x < double(0));} // We cannot set internal bit precision in this mode, so we just set the output decimal precision inline void set_precision(long n) {cout.precision(min(14,long(LOG_10_2*n)));} inline void set_precision(const string prompt) {cout.precision(14);} #define Pi() (double)(3.1415926535897932384626433832795028841) #define Euler() (double)(0.57721566490153286060651209008240243104) inline double round(double x) {return floor(x+0.5);} inline double roundup(double x) {return ceil(x-0.5);} inline void Iasb(long& a, double x) {a = (long)x;} // return value is 1 for success, else 0 int longify(double x, long& a, int rounding=0); inline int doublify(const bigfloat& x, double& d) {d=x; return 0;} inline double inv(double x) {return 1/x;} inline double sqr(double x) {return x*x;} inline double power2_RR(long e) {return 1< typedef complex bigcomplex; inline int is_complex_zero(const bigcomplex& z) {return is_real_zero(z.real())&&is_real_zero(z.imag());} inline int is_approx_zero(const bigcomplex& z) {return is_approx_zero(z.real())&&is_approx_zero(z.imag());} ////////////////////////////////////////////////////////////////// #endif // MPFP ////////////////////////////////////////////////////////////////// #undef setbit // Utility to return a string from an environment variable with a // default to use if the variable is not set or empty. string getenv_with_default(string env_var, string def_val); #endif // #define _INTERFACE_H_ eclib-20250122/libsrc/eclib/isogs.h000066400000000000000000000052671474421343600167020ustar00rootroot00000000000000// isogs.h: declaration of class IsogenyClass and related functions ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_ISOGS_H_ #define _ECLIB_ISOGS_H_ #include "cperiods.h" // which itself includes everything relevant #include "matrix.h" // isogeny functions: vector twoisog(const CurveRed& CR, int verbose); vector threeisog(const CurveRed& CR, int verbose); vector lisog(const CurveRed& CR, Cperiods& cp, long ell, int verbose=0); // cp must be normalized for lattice at call time // returned array is of length up to 3 // of curves ell-isogenous to CR int semistable(const CurveRed& CR); vector getelllist(const CurveRed& CR); // returns list of possible primes l ("ell") for which CR might have an l-isogeny. #define MAXNCURVES 26 // max number of curves in an isogeny class. class IsogenyClass { private: vector curves; vector llist; long nell, ncurves, ndone; int ss, verb; Cperiods cp; vector fromlist; // fromlist[i]=j if curve i first constructed from vector isoglist; // curve j via an isoglist[i]-isogeny vector matij; void matset(long i, long j, long ell) { matij[i*MAXNCURVES+j]=ell;} void process(long i); // process i'th curve public: IsogenyClass(const CurveRed& C, int verbose); void grow(void); // does the work void display_llist(ostream& os)const {os< getmat() const; mat_i getmatrix() const; long mat_entry(long i, long j)const {return matij[i*MAXNCURVES+j];} vector getcurves() const {return curves;} }; #endif eclib-20250122/libsrc/eclib/kbessel.h000066400000000000000000000025231474421343600171760ustar00rootroot00000000000000// kbessel.h: implementation of K-Bessel function for arbitrary real // parameter nu. Adapted from the PARI function kbessel. ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_KBESSEL_H #define _ECLIB_KBESSEL_H 1 //flags that this file has been included double kbessel(double nu, double gx, int debug=0); inline double K0(double x) {return kbessel(0,x);} inline double K1(double x) {return kbessel(1,x);} #endif eclib-20250122/libsrc/eclib/lambda.h000066400000000000000000000037631474421343600167750ustar00rootroot00000000000000// lambda.h Declarations of functions which compute Silverman's finite set Lambda_bad for a curve ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #if !defined(_ECLIB_LAMBDA_H) #define _ECLIB_LAMBDA_H 1 //flags that this file has been included #include // N.B. (1) Uses my height normalization, double S's. // (3) Uses the local height normalization WITHOUT the log|Delta| // (2) Intended for use in computing Heegner points (not yet implemented) vector lambda_bad_1(const bigint& p, long kcode, long npd, long& nlambda); vector lambda_bad(const CurveRed& C, long& nlambda, int verbose=0); // kcode is Kodaira Code with usual coding 10*n for I_n, 10*m+1 for I*_m, // 1,2,3,4,5,6,7 for I,II,III,IV,IV*.III*,II* respectively // caller must delete returned array; first nlambda entries are filled. int make_point_from_x(Curvedata* CD, const bigint& a, const bigint& d, Point* P); int make_point_from_x(Curvedata* CD, const bigfloat& x, long maxdd, Point* P); int make_point_from_x_and_ht(Curvedata* CD, vector lambdas, const bigfloat& xp, const bigfloat& ht, Point* P); #endif eclib-20250122/libsrc/eclib/legendre.h000066400000000000000000000143321474421343600173340ustar00rootroot00000000000000// legendre.h: declarations of functions for solving legendre equations ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_LEGENDRE_H #define _ECLIB_LEGENDRE_H 1 //flags that this file has been included #include "quadratic.h" void minv(const bigint& a1, const bigint& a2, const bigint& b1, const bigint& b2, const bigint& c1, const bigint& c2, bigint& xmin, const bigint& ymin); // (e+f*i) is (a+b*i) mod (c+d*i) in Z[i] void GIreduce(const bigint& a, const bigint& b, const bigint& c, const bigint& d, bigint& e, bigint& f); // (e+f*i) = gcd ( (a+b*i) , (c+d*i) ) in Z[i] void GIgcd(const bigint& a, const bigint& b, const bigint& c, const bigint& d, bigint& e, bigint& f); // Solve Legendre's equation ax^2+by^2+cz^2=0 using Rusin's reduction, // without assuming a,b,c pairwise coprime // returns 0 if not soluble int legendre_solve(const bigint& a, const bigint& b, const bigint& c, bigint& x, bigint& y, bigint& z, int use_lll=0); int legendre_solve(const bigint& a, const bigint& b, const bigint& c, const vector& factorbase, bigint& x, bigint& y, bigint& z, int use_lll=0); // Solve Legendre's equation ax^2+by^2+cz^2=0 using Rusin's reduction, // given "certificate" (n,p,q) satisfying a|n^2+bc, b|p^2+ac, c|q^2+ab. // assumes a,b,c pairwise coprime void legendre_solve_cert(const bigint& a, const bigint& b, const bigint& c, const bigint& n, const bigint& p, const bigint& q, bigint& x, bigint& y, bigint& z); //Ensure that input is valid int checkin(const bigint& a,const bigint& b,const bigint& c, const bigint& n,const bigint& p,const bigint& q); // Check that purported solution is OK int check_leg(const bigint& a, const bigint& b, const bigint& c, const bigint& x, const bigint& y, const bigint& z); // Check that purported solution is OK & in correct lattice int check_leg(const bigint& a, const bigint& b, const bigint& c, const bigint& n, const bigint& p, const bigint& q, const bigint& x, const bigint& y, const bigint& z); //Peel off a known square factor u from coefficient a void lem2a(const bigint& a, const bigint& b, const bigint& c, const bigint& n, const bigint& p, const bigint& q, const bigint& u, bigint& x, bigint& y, bigint& z); //Peel off a known square factor u from coefficient b void lem2b(const bigint& a, const bigint& b, const bigint& c, const bigint& n, const bigint& p, const bigint& q, const bigint& u, bigint& x, bigint& y, bigint& z); //Peel off a known square factor u from coefficient c void lem2c(const bigint& a, const bigint& b, const bigint& c, const bigint& n, const bigint& p, const bigint& q, const bigint& u, bigint& x, bigint& y, bigint& z); void lem4(const bigint& a, const bigint& b, const bigint& c, const bigint& n, const bigint& p, const bigint& q, bigint& x, bigint& y, bigint& z); // Finds a certificate or returns 0 if none exists: int make_certificate(const bigint& a, const bigint& b, const bigint& c, bigint& n, bigint& p, bigint& q); int make_certificate(const bigint& a, const vector& apdivs, const bigint& b, const vector& bpdivs, const bigint& c, const vector& cpdivs, bigint& n, bigint& p, bigint& q); // Check to see if b is congruent to +- c mod a (assumed positive!) // if not, how much to divide a by to ensure that congruence holds? bigint should(const bigint& a, const bigint& b, const bigint& c); void legendre_reduce(const bigint& a, const bigint& b, const bigint& c, bigint& x0, bigint& y0, bigint& z0, int verb=0); // Given a, b, c, ax^2+by^2+cz^2=0 // reduces x, y, z in place using Mordell's method (page 48) // to achieve Holzer's bounds |z|<=sqrt(ab) etc. // (just permutes & passes to conic_mordell_reduce()) void new_legendre_reduce(const bigint& a, const bigint& b, const bigint& c, bigint& x0, bigint& y0, bigint& z0, int verb=0); // Given a, b, c, ax^2+by^2+cz^2=0 // reduces x, y, z in place using quadratics void legendre_via_lll(const bigint& a, const bigint& b, const bigint& c, const bigint& k1, const bigint& k2, const bigint& k3, bigint& x, bigint& y, bigint& z); // // Given one solution, returns quadratics parametrizing all solutions, // with discriminants -4bc, -4ac, -4ab. Here a, b, c are assumed // pairwise coprime but not square-free, and a>0, b>0, c<0. void legendre_param(const bigint& a, const bigint& b, const bigint& c, const bigint& x0, const bigint& y0, const bigint& z0, quadratic& qx, quadratic& qy, quadratic& qz); //These versions EITHER return 0 with a solution in x,y,z in the lattice // OR return 1, 2, 3 and a square factor u of a, b, c (resp) // OR return -1 if something fails (should not happen) int legendre_solve_cert_1(const bigint& a, const bigint& b, const bigint& c, const bigint& n, const bigint& p, const bigint& q, bigint& x, bigint& y, bigint& z, bigint& u); int lem4_1(const bigint& a, const bigint& b, const bigint& c, const bigint& n, const bigint& p, const bigint& q, bigint& x, bigint& y, bigint& z, bigint& u); bigfloat holzer_measure(const bigint& a, const bigint& b, const bigint& c, const bigint& x, const bigint& y, const bigint& z); // max{|a|x^2,|b|y^2,|c|z^2}/|abc| ( < 1 for a Holzer-reduced solution) #endif eclib-20250122/libsrc/eclib/logger.h000066400000000000000000000041701474421343600170250ustar00rootroot00000000000000// FILE logger.h : Declaration of class logger ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 Marcus Mo // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// /** * logger.h * * Declarations for logger class. * Verbosity levels are integers: * -1 : Error. Always print * 0 : Print if verbose > 0 * 1 : Print if verbose > 1 * ... etc ... */ #ifndef _ECLIB_LOGGER_H #define _ECLIB_LOGGER_H // Include headers #include #include #include #include // Disable multithreading // #undef ECLIB_MULTITHREAD #ifdef ECLIB_MULTITHREAD #include // Uncomment if multithreading debug messages required //#define ECLIB_MULTITHREAD_DEBUG #endif // Logging configurations #ifndef ECLOG1 #define ECLOG1(v) if(eclogger::level() <= (v)) ; else eclogger().stream() #endif #ifndef ECLOG2 #define ECLOG2(v) if(eclogger::level() <= (v)) ; else eclogger().stream(__FILE__,__LINE__) #endif // Expose logging macro #ifndef ECLOG #define ECLOG ECLOG1 #endif class eclogger { public: eclogger(); ~eclogger(); std::ostringstream& stream(); std::ostringstream& stream( const char *file, const unsigned long line ); static int level(); static void setLevel( const int verbose ); private: static int level_; std::ostringstream s; }; #endif eclib-20250122/libsrc/eclib/marith.h000066400000000000000000000233421474421343600170340ustar00rootroot00000000000000// marith.h: declarations of integer arithmetic functions (multiprecision) ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_MARITH_H #define _ECLIB_MARITH_H #include inline int is_zero(const bigint& x) {return IsZero(x);} inline int is_nonzero(const bigint& x) {return !IsZero(x);} inline int is_positive(const bigint& x) {return sign(x)>0;} inline int is_negative(const bigint& x) {return sign(x)<0;} inline int is_one(const bigint& x) {return IsOne(x);} inline int odd(const bigint& a) {return IsOdd(a);} inline int even(const bigint& a) {return !IsOdd(a);} inline void rshift(const bigint& a, long i, bigint& c) {RightShift(c,a,i);} inline void lshift(const bigint& a, long i, bigint& c) {LeftShift(c,a,i);} #ifdef setbit #undef setbit #endif inline void setbit(bigint& a, int e) {SetBit(a,e);} inline long lg(const bigint& x) {return NumBits(x)-1;} // The following are not in NTL & need defining inline void longasI(long& a, const bigint& x) {a = I2long(x);} inline void negate(bigint& a) {a=-a;} inline void sqrt(bigint& a, const bigint& b) {SqrRoot(a,b);} inline bigint sqrt(const bigint& a) {bigint b; sqrt(b,a); return b;} inline void square(bigint& a, const bigint& b) {sqr(a,b);} inline bigint gcd(const bigint& a, const bigint& b) {return GCD(a,b);} inline bigint lcm(const bigint& a, const bigint& b) {if (IsZero(a) && IsZero(b)) return ZZ::zero(); else return a*(b/GCD(a,b));} // In NTL add, sub, mul, div are defined with result in first place inline void addx(const bigint& a, const bigint& b, bigint& c) {add(c,a,b);} inline void subx(const bigint& a, const bigint& b, bigint& c) {sub(c,a,b);} inline void divx(const bigint& a, const bigint& b, bigint& c) {div(c,a,b);} inline void mulx(const bigint& a, const bigint& b, bigint& c) {mul(c,a,b);} inline bigint pow(const bigint& a, long e) {return power(a,e);} //N.B. no power to bigint exponent in NTL inline long jacobi(const bigint& a, const bigint& p) {return Jacobi(a,p);} inline void sqrt_mod_p(bigint & x, const bigint & a, const bigint & p) {SqrRootMod(x,a,p); if(x>(p-x)) x= p-x;} inline void power_mod(bigint& ans, const bigint& base, const bigint& expo, const bigint& m) {PowerMod(ans,base,expo,m);} inline void nearest(bigint& c, const bigint& a, const bigint& b) {bigint a0=(a%b); c = (a-a0)/b; if(2*a0>b) c+=1;} inline bigint roundover(const bigint& a, const bigint& b) {bigint a0=(a%b); bigint c = (a-a0)/b; if(2*a0>b) c+=1; return c;} #define bigint_mod_long(a,m) (a%m) bigint bezout(const bigint& aa, const bigint& bb, bigint& xx, bigint& yy); int divides(const bigint& a, const bigint& b, bigint& q, bigint& r); int divides(const bigint& a, long b, bigint& q, long& r); // returns 1 iff remainder r==0 // For b>0, rounded_division(a,b) = q such that a/b = q + r/b with -1/2 <= r/b < 1/2 bigint rounded_division(const bigint& a, const bigint& b); bigint Iround(bigfloat x); bigint Ifloor(bigfloat x); bigint Iceil(bigfloat x); bigint posmod(const bigint& a, const bigint& b); // a mod b in range 0--(b-1) long posmod(const bigint& a, long b); int isqrt(const bigint& a, bigint& root); int divide_exact(const bigint& aa, const bigint& bb, bigint& c); // c = a/b with error message if remainder is non-zero long divide_out(bigint& a, const bigint& d); long divide_out(bigint& a, long d); // divides a by d as many times as possible returning number of times (but none if a=0!) bigint show(const bigint& a); vector show(const vector& a); // extra_primes is a set holding extra big primes found or added manually. class extra_prime_class { public: std::set the_primes; extra_prime_class() {;} ~extra_prime_class(); void read_from_file(const string pfilename, int verb=0); void write_to_file(const string pfilename, int verb=0); int contains(const bigint& p) { return the_primes.find(p)!=the_primes.end(); } void add(const bigint& p) { if(p>maxprime()) the_primes.insert(p); } void show() { cout << "Extra primes in list: "; copy(the_primes.begin(),the_primes.end(), ostream_iterator(cout, " ")); cout << endl; } }; extern extra_prime_class the_extra_primes; // The one and only instance void initprimes(const string pfilename, int verb=0); // // divisors // // The following uses trial division: vector pdivs_trial(const bigint& number, int trace=0); // The following uses gp factorization externally if available: vector pdivs_gp(const bigint& number, int trace=0); // The following uses pari library's factorization if available: vector pdivs_pari(const bigint& number, int trace=0); // The following uses one of the above vector pdivs(const bigint& number, int trace=0); vector posdivs(const bigint& number, const vector& plist); vector posdivs(const bigint& number); vector alldivs(const bigint& number, const vector& plist); vector alldivs(const bigint& number); vector sqdivs(const bigint& number, const vector& plist); vector sqdivs(const bigint& number); vector sqfreedivs(const bigint& number, const vector& plist); vector sqfreedivs(const bigint& number); void sqfdecomp(const bigint& a, bigint& a1, bigint& a2, vector& plist, int trace_fact=0); // a must be non-zero, computes square-free a1 and a2>0 such that a=a1*a2^2 // plist will hold prime factors of a void sqfdecomp(const bigint& a, vector& plist, bigint& a1, bigint& a2); // a must be non-zero, computes square-free a1 and a2>0 such that a=a1*a2^2 // plist already holds prime factors of a // Given a, b, lem3 returns m1 etc so that a=c1^2*m1*m12, b=c2^2*m2*m12 // with m1, m2, m12 pairwise coprime. At all times these equations hold, // and at each step the product m1*m2*m12 is decreased by a factor d, // so the process terminates when the coprimality condition is satisfied. void rusin_lem3(const bigint& a, const bigint& b, bigint& m1, bigint& m2, bigint& m12, bigint& c1, bigint& c2); // Solves x-a1(mod m1), x=a2(mod m2) bigint chrem(const bigint& a1, const bigint& a2, const bigint& m1, const bigint& m2); // // general purpose routines -- bigint overloads // bigint mod(const bigint& a, const bigint& b); // a mod b in range +- half b long mod(const bigint& a, long b); inline bigint addmod(const bigint& a, const bigint& b, const bigint& m) { if (is_zero(a)) return b; if (is_zero(b)) return a; return mod(a+b,m); } inline bigint xmm(const bigint& a, const bigint& b, const bigint& m) { if (a==1) return b; if (a==-1) return -b; if (b==1) return a; if (b==-1) return -a; return (a*b) % m; } long val(const bigint& factor, const bigint& number); long val(long factor, const bigint& number); int div(const bigint& factor, const bigint& number); int div(long factor, const bigint& number); inline int ndiv(const bigint& factor, const bigint& number) { return !div(factor, number);} inline int ndiv(long factor, const bigint& number) { return !div(factor, number);} long bezout(const bigint& aa, long bb, bigint& xx, bigint& yy); bigint invmod(const bigint& a, const bigint& p); // -a mod p long invmod(const bigint& a, long p); int m1pow(const bigint& a); int chi2(const bigint& a); int chi4(const bigint& a); int hilbert2(const bigint& a, const bigint& b); int hilbert2(const bigint& a, long b); int hilbert2(long a, const bigint& b); int legendre(const bigint& a, const bigint& b); int legendre(const bigint& a, long b); int kronecker(const bigint& d, const bigint& n); int kronecker(const bigint& d, long n); // See hilbert.h for hilbert symbol functions long gcd(const bigint& a, long b); // Assuming a*d-b*c!=0, computes a reduced Z-basis for <(a,b),(c,d)> void gauss_reduce(const bigint& a0, const bigint& b0, const bigint& c0, const bigint& d0, bigint& a, bigint& b, bigint& c, bigint& d); // Set a, b so that a/b=n (mod m) with |a|, |b| minimal; return success if a^2, b^2 <= m/2 int modrat(const bigint& n, const bigint& m, bigint& a, bigint& b); int sqrt_mod_2_power(bigint& x, const bigint& a, int e); int sqrt_mod_p_power(bigint& x, const bigint& a, const bigint& p, int e); int sqrt_mod_m(bigint& x, const bigint& a, const bigint& m); int sqrt_mod_m(bigint& x, const bigint& a, const bigint& m, const vector& mpdivs); // Second version of sqrt_mod_m requires mpdivs to hold a list // of primes which contains all those which divide m; if it acontains // extras that does not matter. int modsqrt(const bigint& a, const vector& bplist, bigint& x); // Solves x^2=a mod b with b square-free, returns success/fail // root-finding functions: // find the number of roots of X^3 + bX^2 + cX + d = 0 (mod p) // and assign roots to a list of these int nrootscubic(long b, long c, long d, long p, vector& roots); void ratapprox(bigfloat x, bigint& a, bigint& b, const bigint& maxd); void ratapprox(bigfloat x, long& a, long& b, long maxd=0); #endif // end of file marith.h eclib-20250122/libsrc/eclib/mat.h000066400000000000000000000171761474421343600163410ustar00rootroot00000000000000// mat.h: declarations for integer matrix classes ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // Not to be included directly by user: use matrix.h which defines // _ECLIB_MATRIX_H and includes this twice // #ifndef LONG_MIN #define LONG_MIN (-LONG_MAX-1) #endif #ifndef INT_MIN #define INT_MIN (-INT_MAX-1) #endif class mat { friend class subspace; friend class smat; friend class svec; friend class vec; friend class smat_elim; public: // constructors mat(long nr=0, long nc=0) :nro(nr), nco(nc) {entries.resize(nr*nc, scalar(0));} mat(long nr, long nc, const vector& ent) : nro(nr), nco(nc), entries(ent) {} mat(const mat& m) :nro(m.nro), nco(m.nco), entries(m.entries) {} // copy constructor // member functions & operators void init(long nr=0, long nc=0); mat& operator=(const mat&); // assignment with copy scalar& operator()(long i, long j); // returns ref to (i,j) entry scalar operator()(long i, long j) const; // returns (i,j) entry mat slice(long,long,long=-1,long=-1) const;// returns submatrix scalar sub(long i, long j) const; // returns the (i,j) entry vec row(long i) const; // returns row i (as a vec) vec col(long j) const; // returns col j (as a vec) void set(long i, long j, const scalar& x); // sets the (i,j) entry to x void add(long i, long j, const scalar& x); // adds x to the (i,j) entry void setrow(long i, const vec& v); void setcol(long i, const vec& v); void swaprows(long r1, long r2); void multrow(long r, const scalar& scal); void divrow(long r, const scalar& scal); scalar content() const; scalar row_content(long r) const; void clearrow(long r); void makeprimitive(); void operator+=(const mat&); void operator-=(const mat&); void operator*=(const scalar&); void operator/=(const scalar&); const vector get_entries()const{return entries;} long nrows() const {return nro;} long ncols() const {return nco;} long rank() const; long nullity() const; scalar trace() const; vector charpoly() const; scalar determinant() const; void output(ostream&s=cout) const; void output_pari(ostream&s=cout) const; void output_pretty(ostream&s=cout) const; void dump_to_file(string filename) const; // binary output void read_from_file(string filename); // binary input void reduce_mod_p(const scalar& p); static mat scalar_matrix(long n, const scalar& a); static mat identity_matrix(long n) {return scalar_matrix(n, scalar(1));} // non-member (friend) functions and operators friend void add_row_to_vec(vec& v, const mat& m, long i); friend void sub_row_to_vec(vec& v, const mat& m, long i); friend mat operator*(const mat&, const mat&); friend vec operator*(const mat&, const vec&); friend int operator==(const mat&, const mat&); friend istream& operator>> (istream&s, mat&); friend mat colcat(const mat& a, const mat& b); friend mat rowcat(const mat& a, const mat& b); friend mat directsum(const mat& a, const mat& b); friend void elimrows(mat& m, long r1, long r2, long pos); //plain elimination, no clearing friend void elimrows1(mat& m, long r1, long r2, long pos); //elimination + clearing friend void elimrows2(mat& m, long r1, long r2, long pos, const scalar& last); //elimination + divide by last pivot friend mat echelon0(const mat& m, vec_i& pcols, vec_i& npcols, long& rk, long& ny, scalar& d); friend void elimp(mat& m, long r1, long r2, long pos, const scalar& pr); friend void elimp1(mat& m, long r1, long r2, long pos, const scalar& pr); friend mat echelonp(const mat& m, vec_i& pcols, vec_i& npcols, long& rk, long& ny, scalar& d, const scalar& pr); friend mat echmodp(const mat& m, vec_i& pcols, vec_i& npcols, long& rk, long& ny, const scalar& pr); friend mat echmodp_uptri(const mat& m, vec_i& pcols, vec_i& npcols, long& rk, long& ny, const scalar& pr); friend mat ref_via_flint(const mat& M, vec_i& pcols, vec_i& npcols, long& rk, long& ny, const scalar& pr); friend mat ref_via_ntl(const mat& M, vec_i& pcols, vec_i& npcols, long& rk, long& ny, const scalar& pr); friend mat rref(const mat& M, vec_i& pcols, vec_i& npcols, long& rk, long& ny, const scalar& pr) { #if FLINT return ref_via_flint(M, pcols, npcols, rk, ny, pr); #else return ref_via_ntl(M, pcols, npcols, rk, ny, pr); #endif } friend long rank_via_ntl(const mat& M, const scalar& pr); friend scalar det_via_ntl(const mat& M, const scalar& pr); friend subspace combine(const subspace& s1, const subspace& s2); friend mat restrict_mat(const mat& m, const subspace& s, int cr); friend int liftmat(const mat& mm, const scalar& pr, mat& m, scalar& dd); friend int lift(const subspace& s, const scalar& pr, subspace& ans); friend subspace pcombine(const subspace& s1, const subspace& s2, const scalar& pr); friend mat prestrict(const mat& m, const subspace& s, const scalar& pr, int cr); friend mat matmulmodp(const mat&, const mat&, const scalar& pr); friend mat echmodp_d(const mat& mat, vec_i& pcols, vec_i& npcols, long& rk, long& ny, double pr); friend long population(const mat& m); // #nonzero entries friend scalar maxabs(const mat& m); // max entry friend double sparsity(const mat& m); // #nonzero entries/#entries // Implementation private: long nro,nco; vector entries; // stored in one array, by rows }; // Declaration of non-friend functions inline ostream& operator<< (ostream&s, const mat&m) {m.output(s); return s;} mat operator+(const mat&); // unary mat operator-(const mat&); // unary mat operator+(const mat& m1, const mat& m2); mat operator-(const mat& m1, const mat& m2); mat operator*(const scalar& scal, const mat& m); mat operator/(const mat& m, const scalar& scal); int operator!=(const mat& m1, const mat& m2); mat transpose(const mat& m); // submatrix of only rows indexed by v, all columns mat rowsubmat(const mat& m, const vec_i& v); mat rowsubmat(const mat& m, const vec_l& v); // submatrix of rows indexed by iv, columns indexed by jv mat submat(const mat& m, const vec_i& iv, const vec_i& jv); mat submat(const mat& m, const vec_l& iv, const vec_l& jv); mat echelon(const mat& m, vec_i& pcols, vec_i& npcols, long& rk, long& ny, scalar& d, int method=0); // default method 0: scalars mat addscalar(const mat&, const scalar&); vec apply(const mat&, const vec&); // Construct an NTL mat_lzz_p (matrix mod p) from a mat mod pr mat_zz_p mat_zz_p_from_mat(const mat& M, const scalar& pr); // Construct a mat (scalar type same as pr) from an NTL mat_lzz_p mat mat_from_mat_zz_p(const mat_zz_p& A, const scalar& pr); // type of scalar fixes return type eclib-20250122/libsrc/eclib/matrix.h000066400000000000000000000042611474421343600170530ustar00rootroot00000000000000// matrix.h: manage declarations of integer matrix classes ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #if !defined(_ECLIB_MATRIX_H) #define _ECLIB_MATRIX_H 1 //flags that this file has been included #include "marith.h" #include "vector.h" #include "limits.h" // MAX_INT gcc >= 4.3 #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim #define scalar int #define vec vec_i #define mat mat_i #define subspace subspace_i #define svec svec_i #define smat smat_i #define smat_elim smat_i_elim #include "mat.h" #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim #define scalar long #define vec vec_l #define mat mat_l #define subspace subspace_l #define svec svec_l #define smat smat_l #define smat_elim smat_l_elim #include "mat.h" #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim #define scalar bigint #define vec vec_m #define mat mat_m #define subspace subspace_m #define svec svec_m #define smat smat_m #define smat_elim smat_m_elim #include "mat.h" #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim mat_m to_mat_m(const mat_i& v); mat_m to_mat_m(const mat_l& v); mat_i to_mat_i(const mat_m& v); mat_l to_mat_l(const mat_m& v); #endif eclib-20250122/libsrc/eclib/mequiv.h000066400000000000000000000023011474421343600170460ustar00rootroot00000000000000// mequiv.h: declaration of quartic equivalence functions ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_MEQUIV_H #define _ECLIB_MEQUIV_H #include "mquartic.h" int equiv(const quartic& q1, const quartic& q2, const vector& dlist, int info); int new_equiv( quartic& q1, quartic& q2, int info); #endif eclib-20250122/libsrc/eclib/method.h000066400000000000000000000061031474421343600170240ustar00rootroot00000000000000// method.h: preprocessor definitions for linear algebra options ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #if !defined(_ECLIB_METHOD_H) #define _ECLIB_METHOD_H 1 //flags that this file has been included // Linear algebra options: #ifndef METHOD // So you can override the setting at compile time #define METHOD 2 #endif //=0 for standard int arithmetic //=1 for long-long arithmetic (obsolete) //=2 for ints with modular method (usually best in practice) //=3 for multi-length method (slower) //=4 for multi-length modular (not really used) //=5 for standard long arithmetic //=6 for longs with modular method #if (METHOD==2)||(METHOD==4)||(METHOD==6) #define MODULAR // Causes linear algebra to be done modulo global MODULUS #endif #if (METHOD==3)||(METHOD==4) #define MULTI #define SCALAR_OPTION 3 #endif //The next two cause scalar, vector, matrix to be defined properly: #if (METHOD==0)||(METHOD==2) #define SCALAR_OPTION 1 #endif #if (METHOD==5)||(METHOD==6) #define SCALAR_OPTION 2 #endif #include #include "types.h" #ifdef MULTI typedef bigint SCALAR; typedef vec_m VEC; typedef mat_m MAT; typedef subspace_m SUBSP; #include #define MODULUS to_ZZ("6074000003") #else #define MODULUS DEFAULT_MODULUS // (set in xmod.h) used for modular linear algebra typedef scalar SCALAR; typedef vec VEC; typedef mat MAT; typedef subspace SUBSP; #endif #ifdef MODULAR #define EIGENSPACE(a,b) peigenspace(a,b,MODULUS) #define SUBEIGENSPACE(a,b,c) psubeigenspace(a,b,c,MODULUS) #define COMBINE(a,b) pcombine(a,b,MODULUS) #define RESTRICT(a,b) prestrict(a,b,MODULUS) #else #define EIGENSPACE(a,b) eigenspace(a,b) #define SUBEIGENSPACE(a,b,c) subeigenspace(a,b,c) #define COMBINE(a,b) combine(a,b) #define RESTRICT(a,b) restrict_mat(a,b) #endif #if (METHOD==0) #define form_finder form_finder0 #else #if (METHOD==1) #define form_finder form_finder1 #else #if (METHOD==2) #define form_finder form_finder2 #else #if (METHOD==3) #define form_finder form_finder3 #else #if (METHOD==4) #define form_finder form_finder4 #else #if (METHOD==5) #define form_finder form_finder5 #else #if (METHOD==6) #define form_finder form_finder6 #endif #endif #endif #endif #endif #endif #endif #endif eclib-20250122/libsrc/eclib/mglobsol.h000066400000000000000000000045401474421343600173650ustar00rootroot00000000000000// mglobsol.h: declaration of class quartic_sieve and functions for quartic solubility testing ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #if !defined(_ECLIB_MGLOBSOL_H) #define _ECLIB_MGLOBSOL_H 1 //flags that this file has been included #include "mquartic.h" #include "sieve_search.h" // Function for naive search, no sieving: int ratpoint(const quartic& g, const bigint& min, const bigint& max, bigint& xx, bigint&yy, bigint& zz); // class for fancier sieve-assisted search class quartic_sieve : public point_processor { private: quartic *g; bigint a,b,c,d,e,roota,roote; bigint pu,pv,pw; // coords of point found int verbose, easy, use_stoll; long ulim; int num_aux; vector auxs, umod, wprimes, uprimes; vector> xgood_mod_aux, squares; long nwprimes; long npoints, maxnpoints; int process(const bigint& x, const bigint& y, const bigint& z) override {pu=x; pv=y; pw=z; npoints++; //cout<<"[x,y,z]=["<=maxnpoints); } // (x,y,z) as returned by ms's sieve; the point is (x/z,y/z^2) public: quartic_sieve(void) {;} explicit quartic_sieve(quartic * gg, int moduli_option=2, int verb=0); long search(double h_lim, long maxnpts=1, int posxonly=0); long stoll_search(double h_lim, int posxonly=0); long search_range(int lower, bigfloat lower_bound, int upper, bigfloat upper_bound, int posxonly=0); void getpoint(bigint& x, bigint& y, bigint& z) {x=pu;y=pv;z=pw;} }; #endif eclib-20250122/libsrc/eclib/minim.h000066400000000000000000000050201474421343600166520ustar00rootroot00000000000000// minim.h: declaration of quartic minimization functions ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #if !defined(_ECLIB_MINIM_H) #define _ECLIB_MINIM_H 1 //flags that this file has been included #include bigint g_content(const bigint& ga, const bigint& gb, const bigint& gc, const bigint& gd, const bigint& ge); // returns largest f s.t. f^2 divides all coeffs bigint root_p(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const bigint& e, const bigint& p); // assuming p|I, p|J, returns the unique alpha mod p // modulo which quartic has a root of multiplicity at least 3 // returns -1 if multiple root is at infinity (if a=b=0 mod p) // (program does not actaully use this dubious feature) int minim_p(bigint& ga, bigint& gb, bigint& gc, bigint& gd, bigint& ge, const bigint& p, scaled_unimod& m); // assuming p^4|I, p^6|J, (or stronger conditions when p=2 or p=3) // returns an equivalent quartic with invariants divided by p^4, p^6; // m holds the transformation matrix, must be initialized (say with identity) // returns success, can be 0 only for p=2 int is_nonmin(int smallp, long vpi, long vpj, long vpd, int assume_locsol); // Given vpi = val(p,I) and vpj=val(p,J) returns 1 if non-minimal // smallp = p if p=2,3 else =1. // p=3: needs also vpd=val(p,disc) // p=2: may or may not be minimizable, but worth a try // (The commented out condition is sufficient but NOT necessary) void minim_all(bigint& ga, bigint& gb, bigint& gc, bigint& gd, bigint& ge, bigint& I, bigint& J, const vector& plist, scaled_unimod& m, int assume_locsol, int verb=0); #endif eclib-20250122/libsrc/eclib/mlocsol.h000066400000000000000000000052641474421343600172230ustar00rootroot00000000000000// mlocsol.h: declaration of functions for local solubility of quartics ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #if !defined(_ECLIB_MLOCSOL_H) #define _ECLIB_MLOCSOL_H 1 //flags that this file has been included #include "mquartic.h" // Checks for solublility in Qp: int qpsoluble(const quartic& g, const bigint& p); int qpsoluble(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const bigint& e, const bigint& p); int qpsoluble(const bigint& a, const bigint& c, const bigint& e, const bigint& p); // latter assumes b=d=0 int Rsoluble(const quartic& g); int Rsoluble(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const bigint& e); // Checks for local solubility in Qp for all p in plist; //if not, badp will hold the first p for which NOT soluble in Qp: int locallysoluble(const quartic& g, const vector& plist, bigint& badp); int locallysoluble(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const bigint& e, const vector& plist, bigint& badp); int locallysoluble(const bigint& a, const bigint& c, const bigint& e, const vector& plist, bigint& badp); // latter assumes b=d=0 /* Samir Siksek's Local Solubility Test for odd p */ int local_sol(const bigint& p, vector c, int verbose=0); // Checks for solublility in Qp int new_qpsoluble(const quartic& g, const bigint& p, int verbose=0); int new_qpsoluble(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const bigint& e, const bigint& p, int verbose=0); int new_qpsoluble(const bigint& a, const bigint& c, const bigint& e, const bigint& p, int verbose=0); int new_zpsol(const bigint& a,const bigint& b,const bigint& c,const bigint& d, const bigint& e, const bigint& p, int verbose=0); #endif eclib-20250122/libsrc/eclib/moddata.h000066400000000000000000000056601474421343600171640ustar00rootroot00000000000000// FILE MODDATA.H: Declaration of class moddata ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_MODDATA_H #define _ECLIB_MODDATA_H 1 //flags that this file has been included #include class level { friend class symb; friend class cusplist; friend class oldforms; friend class eigdata; friend class newform; friend class h1newform; friend class summer; //protected: public: // got tired of making everything friends... long modulus; int plusflag; int squarelevel; vector plist,dlist,primelist; long p0; // first good prime long npdivs,ndivs,sqfac,nap; long reduce(long res)const {res%=modulus; return (res<0)?modulus+res:res;} public: explicit level(long n, long neigs=20); }; class moddata :public level { protected: long phi,psi,nsymb1,nsymb2; vector invlist,noninvlist,noninvdlist,dstarts,gcdtable,unitdivlist; long code(long res) const {return invlist[reduce(res)];} public: long nsymb; explicit moddata(long n); //constructor void display() const; void out_of_memory_error(const string mess) const { cerr<<"Out of memory ("< inline bigint II(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const bigint& e) { return 12*a*e - 3*b*d + c*c; } inline bigint JJ(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const bigint& e) { return (72*a*e + 9*b*d - 2*sqr(c)) * c - 27*(a*sqr(d) + sqr(b)*e); } inline bigint H_invariant(const bigint& a, const bigint& b, const bigint& c) { return 8*a*c - 3*sqr(b); } inline bigint R_invariant(const bigint& a, const bigint& b, const bigint& c, const bigint& d) { return pow(b,3) + 8*d*sqr(a) - 4*a*b*c; } class quartic { public: // constructors quartic(); quartic(const bigint& qa, const bigint& qb, const bigint& qc, const bigint& qd, const bigint& qe, const vector& qr, int qt, const bigint& qi,const bigint& qj,const bigint& qdisc); quartic(const bigint& qa, const bigint& qb, const bigint& qc, const bigint& qd, const bigint& qe); // latter calls set_roots_and_type() quartic(const quartic& q); // member functions & operators void set_roots_and_type(); void assign(const bigint& qa, const bigint& qb, const bigint& qc, const bigint& qd, const bigint& qe, const vector& qr, int qt, const bigint& qi,const bigint& qj, const bigint& qdisc); void assign(const bigint& qa, const bigint& qb, const bigint& qc, const bigint& qd, const bigint& qe); // latter calls set_roots_and_type() void operator=(const quartic& q); bigint geta() const {return a;} bigint getb() const {return b;} bigint getcc() const {return c;} //NB "getc" is a standard macro bigint getd() const {return d;} bigint gete() const {return e;} void getcoeffs(bigint& xa, bigint& xb, bigint& xc, bigint& xd, bigint& xe) const {xa=a; xb=b; xc=c; xd=d; xe=e;} int gettype() const {return type;} bigint getI() const {return ii;} bigint getJ() const {return jj;} bigint getH() const {return H_invariant(a,b,c);} bigint getdisc() const {return disc;} vector getroots(void) const {return roots;} void doubleup() { b*=2; c*=4; d*=8; e*=16; ii*=16; jj*=64; disc*=4096; } vector rational_roots() const; // returns rational roots int trivial() const; // Checks for a rational root long nrootsmod(long p) const; friend ostream& operator<<(ostream& s, const quartic& q); friend int new_equiv( quartic& q1, quartic& q2, int info); friend void qc(quartic& g, const bigint& x0, const bigint& y0, const bigint& z0, Curvedata * E, Curvedata* IJ_curve, const bigint& tr_u, const bigint& tr_r, const bigint& tr_s, const bigint& tr_t, Point& P, int verbose); void dump(ostream& s) const { s<<"Coeffs: ("< #include class rank1 : public rank12 { private: long nquarticsa, nquarticsb, nfirstlota, nfirstlotb; long sha_rank, sha2; int traceequiv, posdisc, disc_is_square, npairs, extra2, threediv, type; vector qlista, qlistb; vector qlistbflag; vector croots, cphi; vector pointlist1, pointlist2; long npoints1, npoints2; int have_eggpoint, have_large_quartics; long twoadic_index, global_index; long bsd_npairs; // only for testing // 1, 2 or 4: local/global index of "small" quartics bigint c4, c6, d1728, ii, jj, disc; long Imod2, Jmod2; bigfloat xii, xjj; vector plist, dlist; vector eqplist; // primes used for equiv-sieving long n0, n1, n2, rank_B; // // // Sieving stuff: int ipivot, pivflag; vector auxs, amod, astepmod, hmod, hstepmod, hscalemod; vector> phimod; vector aux_flags, aux_types; vector> squares, flaga; vector>> flags; long ah_count, ah_sieve_0, ah_sieve_1, ah_sieve_2; long ah_rfail, ah_dfail, ah_efail, ah_extra2fail, ah_pass; void aux_init(); // define auxiliary moduli and squares void flag_init(); // set up flag array vector qeps(const quartic&, int x2); //computes eps of quartic void show_eps_vec(const vector& vec); // process latest quartic found void addquartic(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const bigint& e); void getquartics(); void getquartics1(); void gettype(int t); public: explicit rank1(Curvedata* ec, int verb=0, int sel=0, long lim1=20, long lim2=5, long n_aux=-1); // lim1 is bound on |x|+|z| in naive search // lim2 is bound on log max {|x|,|z| }, i.e. logarithmic // sel is selmer_only switch // n_aux is # sieving primes in quartic search // n_aux=-1 causes default to be used (depends on method) // void sortpoints(); void listpoints(); void listpoints(Curvedata* CD_orig, const bigint& u, const bigint& r, const bigint& s, const bigint& t); vector getgens() const; vector getpoints(); long getselmerprime() const {return selmer_rank;} long getselmerphi() const {return selmer_rank;} long getselmerphiprime() const {return selmer_rank;} Curvedata getEprime() const {return *the_curve;} }; #endif eclib-20250122/libsrc/eclib/mrank2.h000066400000000000000000000064551474421343600167500ustar00rootroot00000000000000// mrank2.h: declaration of class rank2 for descent via 2-isogeny ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #if !defined(_ECLIB_MRANK2_H) #define _ECLIB_MRANK2_H 1 //flags that this file has been included #include class rank2 : public rank12 { // class to do 2-descent via 2-isogeny private: vector badprimes, supp0, supp1; vector elsgens0, elsgens1, els2gens0, els2gens1, glsgens0, glsgens1; long selmer_rank_phi_Eprime, selmer_rank_phiprime_E, selmer_rank_Eprime; long best_rank_bound, best_isogeny, index2; long nt2gens0, nt2gens1, mask0, mask1; long els0, els1, gls0, gls1; // after first descent long els20, els21, gls20, gls21; // after second descent int d_is_sq, ddash_is_sq; bigint e2, e3, e2dash, e3dash, s2, s4, s6; Curvedata ee, eedash, Eprime; vector pointlist, fullpointlist, two_torsion; int npoints, npoints1, fullnpoints, ntwo_torsion; public: rank2(Curvedata* ec, int verb,int sel=0, long l1=20, long l2=5,int second=1); // lim1 is (bigint) bound on |x|+|z| in naive search // lim2 is (double) bound on log max {|x|,|z| }, i.e. logarithmic // sel is selmer_only switch // second is do-second-descent switch Curvedata getEprime() const {return Eprime;} long getselmerprime() const {return selmer_rank_Eprime;} long getselmerphi() const {return selmer_rank_phi_Eprime;} long getselmerphiprime() const {return selmer_rank_phiprime_E;} void listgens(); void listgens(Curvedata* CD_orig, const bigint& u, const bigint& r, const bigint& s, const bigint& t); void listpoints(); void listpoints(Curvedata* CD_orig, const bigint& u, const bigint& r, const bigint& s, const bigint& t); void makepoints(); vector getpoints() { if(fullnpoints==0) makepoints(); return fullpointlist; } vector getgens() const {return pointlist;} private: int testquartic(const bigint& c, const bigint& d1, const bigint& d2, int which); int second_descent(const bigint& c, const bigint& d1, const bigint& d2, int which); void makepoint(const bigint& c, const bigint& d1, const bigint& d2, const bigint& x, const bigint& y, const bigint& z, int which); void local_descent(const bigint& x0); void find_elsgens(int which, const bigint& c, const bigint& d); void find_els2gens(int which, const bigint& c, const bigint& d); void find_glsgens(int which, const bigint& c, const bigint& d); void makegens(); }; #endif eclib-20250122/libsrc/eclib/msoluble.h000066400000000000000000000021261474421343600173670ustar00rootroot00000000000000////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #if !defined(_ECLIB_MSOLUBLE_H) #define _ECLIB_MSOLUBLE_H 1 //flags that this file has been included #include "mlocsol.h" #include "mglobsol.h" #endif eclib-20250122/libsrc/eclib/mwprocs.h000066400000000000000000000076061474421343600172470ustar00rootroot00000000000000// mwprocs.h: definition of class mw for Mordell-Weil basis ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // allow for multiple includes #ifndef _ECLIB_MWPROCS_ #define _ECLIB_MWPROCS_ #include "saturate.h" #include "sieve_search.h" // global to this file -- size of height_pairing matrix, equal // to maximum rank of any curve likely to study const int MAXRANK = 30; const int MAXSATPRIME = 20; // default saturation limit class mw : public point_processor { private: Curvedata *E; vector basis; int rank, maxrank; vector> height_pairs; bigfloat reg; int verbose, process_points; bigfloat& mat_entry(int i, int j); bigint a1,a2,a3,a4,a6; int iso; saturator satsieve; public: explicit mw(Curvedata*, int verb=0, int pp=1, int maxr=999); // processing of new points, with saturation at primes up to sat // (default MAXSATPRIME, none if sat==0) int process(const bigint& x, const bigint& y, const bigint& z) override; int process(const bigint& x, const bigint& y, const bigint& z, int sat); // as returned by ms's sieve; the point is (x/z,y/z^(3/2)) and z is square int process(const Point& P, int sat=MAXSATPRIME); int process(const vector& Plist, int sat=MAXSATPRIME); // saturate the current basis: int saturate(long& index, vector& unsat, long sat_bd=-1, long sat_low_bd=0); void search(bigfloat h_lim, int moduli_option=0, int verb=0); void search_range(bigfloat xmin, bigfloat xmax, bigfloat h_lim, int moduli_option=2, int verb=0); bigfloat regulator(void) {return reg;} vector getbasis() {vector b(basis.begin(),basis.begin()+rank); return b;} int getrank() {return rank;} }; inline bigfloat& mw::mat_entry(int i, int j) { return height_pairs[i][j]; } class sieve { private: Curvedata *E; bigint a1,a2,a3,a4,a6; bigint d1,d2,d3,d4,d6,c2,c3,c4,c6; long a,c; mw * mwbasis; int verbose, posdisc, firstnl; bigfloat xmin,x1,x2,x3; int num_aux; vector auxs, amod, modhits; vector> xgood_mod_aux, squares; vector cflag; int use_cflag; long npoints, ascore, amodc, alim, clim0, clim1, clim2, clim; void a_search(const long& amin, const long& amax); void a_simple_search(const long& amin, const long& amax); public: sieve(void) {;} sieve(Curvedata * EE, mw* mwb, int moduli_option, int verb=0); void search(bigfloat h_lim); void search_range(bigfloat xmin, bigfloat xmax, bigfloat h_lim); void stats(); // report sieving statistics }; int order_real_roots(vector& bnd, vector roots); //checks (and returns) how many roots are actually real, and puts those in //bnd, in increasing order, by calling set_the_bound int set_the_bounds(vector& bnd, bigfloat x0, bigfloat x1, bigfloat x2); //This transforms (if possible) x0, x1 and x1 into double; the search //should be made on [x0,x1]U[x2,infty] so if x1 or x2 overflows, the search //is on [x0,infty]. The function returns 3 in the first case, 1 in the second. //If x0 overflows, it returns 0. A warning is printed out. #endif eclib-20250122/libsrc/eclib/newforms.h000066400000000000000000000353131474421343600174110ustar00rootroot00000000000000// File NEWFORMS.H ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_NEWFORMS_H #define _ECLIB_NEWFORMS_H 1 //flags that this file has been included #include #include // which includes method.h #include #include #include class newforms; class jumps; #define DEFAULT_SMALL_NAP 25 /* Data stored in a newform (and in data files newforms/x$N and smallnf/x$N): (Numbers refer to lines of data file) Items 1-18 are "int" while the ap and aq are "short" 3. sfe : sign of functional equation (=-product of aq) 4. ap0 : p0'th Hecke eigenvalue, p0=smallest good prime 5. np0 : np0=1+p0-ap0 6. dp0 : dp0/np0=L/P=L(f,1)/2x 7. lplus : prime =1 (mod 4) with L(f,lplus,1) nonzero 8. mplus : L(f,lplus,1)*sqrt(l)=mplus*x 9. lminus : prime =3 (mod 4) with L(f,lminus,1) nonzero 10. mminus : L(f,lminus,1)*sqrt(-l)=mminus*yi 11-14. a, b, c, d : entries of a matrix M=[a,b;N*c,d] in Gamma_0(N) s.t. 15. dotplus : the integral of f over {0,M(0)} is 16. dotminus : dotplus*x+dotminus*yi 17. type : type 1 if period lattice = [2x,x+yi], type 2 if [x,yi] 18. degphi : degree of modular parametrization aq : list of Wq-eigenvalues at bad primes ap : list of Tp- & Wq-eigenvalues at all primes */ class newform { friend class newforms; public: newforms *nf; // the "parent" int sign; // 1/-1 for old-style newform, 0 for old-style h1newform vec bplus,bminus; // DUAL eigenvectors scalar type; // 2 for rectangular, 1 for triangular // period lattice long index; // splitting index, -1 if not known vector aplist, aqlist; long ap0; // Eigenvalue of first "good" p long sfe; // sign of functional equation long cuspidalfactorplus, cuspidalfactorminus; // pdot =cuspidalfactor*np0 long pdot,np0,dp0; // np0=1+p0-ap0, pdot = maninvector(p0).bplus, // = cuspidalfactor*dp0 rational loverp; // L(f,1)/x where x = least real part of a period // =np0/dp0 long lplus, lminus; // primes = +1, -1 mod 4 long mplus, mminus; // mplus*x=sqrt(lplus)*L(fxlplus,1) // mminus*yi=sqrt(-lminus)*L(fxlminus,1) long a,b,c,d,dotplus,dotminus; // matrix for period integration // Either type=1, lattice=[2x,x+yi] // Or type=2, lattice=[x,yi] // & integral over [a,b;Nc,d] is dotplus*x+dotminus*yi long degphi; // degree of Weil parametrization long rk; // analytic rank (-1 if not set) bigfloat Lvalue; // L^(r)(f,1)/r! vec coordsplus, coordsminus; // vector components of each freegen long denomplus, denomminus, contplus, contminus; int j0; long fac; rational optimalityfactorplus, optimalityfactorminus; newform(void) {;} // newform(const vec& v, const vector& ap, newforms* nfs,long ind=-1); newform(const vector& data, const vector& aq, const vector& ap, newforms* nfs); newform(const vec& vplus, const vec& vminus, const vector& ap, newforms* nfs,long ind=-1); void add_more_ap(int nap); void display(void) const; // Testing function int check_expand_contract(); // Explanation of the following three utilities: after newform // searching, each newform's aplist contains eigenvalues not Fourier // coefficients: these are the same for good primes p but for bad // primes q the eigenvalue is for thw AL-operator W_q. Before // sorting and outputting this needs "fixing up" as in fixup_eigs(). // After reading in from file (e.g. to compute more ap) we need to // go back to the eigenvalue list using unfix_eigs() before // recreating eigenspaces and then reverse this afterwards using // refix_eigs(). Each of these functions has a version in the // newforms class too, which applies the operation to every newform. // To fix eigenvalues lists after finding a newform: use when aplist // contains AL-eigenvalues w_q for bad primes q. This extracts // those into the list aqlist and replaces them with the Fourier // coefficients a_q (=0 if q^2|N else -w_q). void fixup_eigs(); // To fix eigenvalues lists before/after recovering bases: use when // aplist contains Fourier coefficients for bad primes q. This // replaces those with AL-eigenvalues from aqlist. void unfix_eigs(); // Same as fixup_eigs except that aqlist is not (re)created. It // replaces AL-eigenvalues in aplist with Fourier coefficients. void refix_eigs(); // To find BSD ratio: void find_bsd_ratio(); // To find projected coords: void find_coords_plus_minus(); // To find cuspidal factors: void find_cuspidal_factors(); // To find twisting primes: void find_twisting_primes(); // To find optimality factors when created from a curve: void find_optimality_factors(const CurveRed& E, int i=0); // To find deg(phi): void find_degphi(); // To get matrix and scale factors void find_matrix(); // To normalize signs: void sign_normalize(); // Compute analytic rank (if not already done) void compute_rank(); // Return analytic rank (compute if not already done) long rank(); // L^(r)(f,1)/r! bigfloat special_value(); }; class newforms :public level, splitter_base { friend class newform; private: int verbose; long maxdepth, cuspidal, sign; int basisflag; // is set, then use() only sets bases for newforms // already defined. mat opmat(int i, int d, int v=0) {return h1->opmat(i,d,v);} vec opmat_col(int i, int j, int v=0) {return h1->opmat_col(i,j,v);} mat opmat_cols(int i, const vec& jlist, int v=0) {return h1->opmat_cols(i,jlist,v);} mat opmat_restricted(int i, const subspace& s, int d, int v=0) {return h1->opmat_restricted(i,s,d,v);} smat s_opmat(int i, int d, int v=0) {return h1->s_opmat(i,d,v);} svec s_opmat_col(int i, int j, int v=0) {return h1->s_opmat_col(i,j,v);} smat s_opmat_cols(int i, const vec& jlist, int v=0) {return h1->s_opmat_cols(i,jlist,v);} smat s_opmat_restricted(int i, const ssubspace& s, int d, int v=0) {return h1->s_opmat_restricted(i,s,d,v);} long matdim(void) {return h1->dimension;} long matden(void) {return h1->denom1;} vector eigrange(int i) {return h1->eigrange(i);} long dimoldpart(const vector l); protected: vec mvp; map mvlplusvecs, mvlminusvecs; oldforms* of; homspace *h1, *h1plus, *h1minus, *h1full; int j0; // data used for ap computation std::set jlist; public: long n1ds, j1ds; vector nflist; vector nf_subset; newforms(long n, int disp) :level(n), verbose(disp), of(0), h1(0), h1plus(0), h1minus(0), h1full(0) {;} ~newforms(void); void display(void) const; void display_modular_symbol_map(int check=0) const; void output_to_file(int binflag=1, int smallflag=0) const; void set_sign(int s) {sign=s;} int get_sign() {return sign;} void makeh1(int s); // add newform with basis b1, eiglist l to current list (b2 not used): void use(const vec& b1, const vec& b2, const vector l); // find newforms using homology; ntp is number of eigenvalues to use // for oldforms, *not* the number computed via homology (use addap() // for that): void createfromscratch(int s, long ntp); // read newforms from file, if it exists, otherwise (perhaps) revert // to createfromscratch; if small_data_ok is set then we only need // the eigenvalues so are content with a small version of the file // (fewer ap and no additional data): void createfromdata(int s, long ntp, int create_from_scratch_if_absent=1, int small_data_ok=0); // Compute homspace::projcoord, so projchain can be used // Replaces coord_vecs of homspace with projections onto eigenspaces // NB if #newforms>1 this MUST be re-called after any sorting of newforms void make_projcoord(); // Look for a j0 such that nflist[i].bplus/bminus[j0]!=0 for all i, or a set of such j void find_jlist(); // Create from one or a list of elliptic curves of the right conductor: void createfromcurve(int s, const CurveRed& C, int nap=500); void createfromcurves(int s, vector Clist, int nap=500); // Lazy version which does not get the homology eigenvectors, only // sets the aq & ap (for use as oldforms): void createfromcurves_mini(vector Clist, int nap=25); // read newforms from old-style data files (eigs/x$N and intdata/e$N): void createfromolddata(); // Construct bases (homology eigenvectors) from eigenvalue lists: // flag controls what ::use() does with the nfs when found void makebases(int flag, int all_nf=1); // Construct H1 newforms, given H1+ and H1- newforms void merge(int all_nf=1); vector apvec(long p); // computes a[p] for each newform void addap(long last); // adds ap for primes up to the last'th prime // Sort newforms void sort(int oldorder=0); void sort_into_Cremona_label_order(); void sort_into_LMFDB_label_order() {sort(0);} // To fix eigenvalues lists before/after recovering bases. See // comments for the same named methods in the newform class for // details. void unfix_eigs(); void refix_eigs(); // for the i'th newform return the value of the modular symbol {0,r} (default) or {oo,r} rational plus_modular_symbol(const rational& r, long i=0, int base_at_infinity=0) const; rational minus_modular_symbol(const rational& r, long i=0, int base_at_infinity=0) const; pair full_modular_symbol(const rational& r, long i=0, int base_at_infinity=0) const; // next three implemented in periods.cc // Given newform with no intdata, compute least real (part of) // period -- unless sfe=-1 and n=square, in which case return 0 int get_real_period(long i, bigfloat& x, int verbose=0) const; // Given newform with no intdata, compute least imag (part of) period int get_imag_period(long i, bigfloat& y, int verbose=0) const; // Given all data, compute the periods as a Cperiods Cperiods getperiods(long i, int method=-1, int verbose=0); // Given all data & Cperiods, compute the curve (using fixc6 etc) Curve getcurve(long i, int method, bigfloat& rperiod, int verbose=0); // Attempt to compute and display the elliptic curve for each // newform in forms; return a (sub)list of newform indices where this failed. // If filename is not "no", output to file also vector showcurves(vector forms, int verbose, string filename); // next three implemented in pcprocs.cc // Computes x0, y0 (real & imag parts of periods) & a matrix which // gives these scaled by dotplus & dotminus. rp_known is set if we // know x0 to be the least real part of a period (usually true). int find_matrix(long i, long dmax, int&rp_known, bigfloat&x0, bigfloat&y0); // Compute both periods from the (known) matrix [a,b;Nc,d] and // scaling factors dotplus, dotminus. Return success flag. int get_both_periods(long i, bigfloat&x0, bigfloat&y0) const; // Given an imaginary period y1, finds a prime lminus =3(mod 4) and // <=lmax for which L(f,lminus,1) is nonzero and hence a multiple // mminus of y1. // if lmax==0 it carries on until a suitable lminus is found int find_lminus(long i, long lmax, const bigfloat& y1); }; void output_to_file_no_newforms(long n, int binflag=1, int smallflag=0); vector eiglist(const newform& f, int oldorder=0); /****************************************************************************** To sort the newforms of level N from the order in which they are stored in newforms/x into the correct order to match the "Cremona labels" of isogeny classes, we apply one of the following procedures. Note that to sort into LMFDB order, sort(0) suffices. 0: nf.sort(1) and then permute according to booknumber(N,i) 1: nf.sort(1) 2: nf.sort(0) 3: nf.unfix_eigs(); nf.sort(0); nf.refix_eigs(); Here: - unfix_eigs() replaces the coefficient aq in aplist for q|N with the AL-eigenvalue wq; - refix_eigs() reverse this; - sort(1) sorts first by lexicographically sorting aqlist (AL-eigenvalues) in order +1,-1, next by lexicographically sorting aplist in order 0, +1, -1, +2, -2, ...; - sort(0) sorts by lexicographically sorting aplist in order ...,-2,-1,0,1,2,... The difference between cases 0 and 1 is that for N<=450 the order of the newform files is essentially random, being the order in which the newforms were found at a time when the strategy used in the code was evolving steadily -- this was in the late 1980s, running batch jobs on a remote mainframe, so rerunning those levels was not an easy option. Instead, for N<=450 we have hard-wired the permutation taking the order produced by sort(1) -- which is correct without further adjustment for 450 booknumber0(N,i), which is not the identity for exactly 146 levels N between 56 and 450 inclusive. The correct i'th newform is number booknumber(N,i) in the stored list. The difference between cases 2 and 3 is that in case 2, aplist contains the p'th coefficient for all p, while in case 3 the q'th coefficient for q|N is replaced by the AL-eigenvale wq. Case 2 is the LMFDB ordering and is correct for all N>230000, as well as some (but not all!) N between 130100 and 130200. It should have been used for all N>130000 but was not (my mistake): case 3 is actually the order in which the newforms are found using the strategy in place since level 130000, but the line sort(0) was omitted for the code in error. *******************************************************************************/ // utility to determine which sort method should be used, depending on // the level, to recreate the "Cremona label" order of newforms. inline int level_range(long N) { if (N<=450) return 0; if (N<130000) return 1; if (N>230000) return 2; if ((N>130100)&&(N<130200)&&(N!=130144)&&(N!=130146)&&(N!=130150)&&(N!=130190)&&(N!=130192)) return 2; return 3; } #endif eclib-20250122/libsrc/eclib/nfd.h000066400000000000000000000034171474421343600163200ustar00rootroot00000000000000// File NFD.H: class for newforms of any dimension ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_NFD_H #define _ECLIB_NFD_H 1 #include #include bigint inverse(const mat_m& a, mat_m& ainv); void showmatrix(const mat_m& m); void showmatrix(const mat& m); class nfd { private: mat_m tp0; // a defining matrix mat_m V; mat_m W,Winv,WinvV,Winv_scaled; mat projcoord; long coord_fac; bigint Wdetnum, Wdetdenom; vector minpol; // min poly of alpha, field generator public: vector Hscales; vector Sscales; subspace_m S; // the basis homspace* h1; // the ambient modular symbol space bigint dH, dS, dHS; nfd(void) {;} nfd(homspace* in_h1, int one_p, int w_split, int mult_one, int verbose=0); void display(void) const; mat_m oldheckeop(long p); mat_m heckeop(long p); vec_m ap(long p); }; #endif eclib-20250122/libsrc/eclib/oldforms.h000066400000000000000000000034341474421343600173750ustar00rootroot00000000000000// FILE OLDFORMS.H: declaration of class oldforms ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_OLDFORMS_H #define _ECLIB_OLDFORMS_H 1 //flags that this file has been included #include class oldforms { public: long noldclasses, nap, ntp; long totalolddim; private: const level* N; int plusflag; vector< vector > oldformap; vector oldclassdims, oldlevels; void getoldclasses(long d, int verbose); public: oldforms(long intp, const level* iN, int verbose=0, int plus=1); //intp = input value of ntp = max. number of Tp to use ~oldforms(){;} long dimoldpart(vector aplist) const; void display(void) const; }; // Utilities for creating filenames for curve files bool file_exists(string filename); string ecdb_filename(long N); string single_curve_filename(long N); string curve_filename(long N); #endif eclib-20250122/libsrc/eclib/options.h000066400000000000000000000214401474421343600172400ustar00rootroot00000000000000// options.h: declaration & implementation of class to handle mwrank options ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_OPTIONS_H #define _ECLIB_OPTIONS_H 1 //flags that this file has been included #include #include #include #define DEFAULT_QUIET 0 #define DEFAULT_VERBOSE 1 #define DEFAULT_PRECISION 50 #define DEFAULT_HLIMQ 10 #define DEFAULT_NAUX 15 #define DEFAULT_HLIMC 0 #define DEFAULT_TRACEEQUIV 0 #define DEFAULT_PTL -99 // if not set manually will be set to same as verbose #define DEFAULT_OUTPUT_PARI 0 #define DEFAULT_SELMER 0 // if set will do only local tests to get Selmer rank #define DEFAULT_2ND_DESCENT 1 // if set will do 2nd descent (2-torsion curves) #define DEFAULT_SAT_BOUND 1000 // bound on saturation primes class mrank_options { private: int quiet; // 0/1, controls header output int verbose; // 0-3, controls output verbosity long precision; // 1-\infty, controls floating point precision (in bits) long hlimq; // 1-20, height limit for quartic search long naux; // number of primes used in syzygy sieve long hlimc; // 1-15, height limit for curve search int ptl; // 0/1, controls whether points are output int traceequiv; // 0/1, controls equivalence tracing (debugging only) int output_pari; // 0/1, controls pari-abbreviated output int selmer_only; // 0/1, if set only computes Selmer rank int second_descent; // 0/1, if set does 2nd descent int saturation_bound; // 0-infty, controls saturation public: mrank_options(void) //set default values :quiet(DEFAULT_QUIET), verbose(DEFAULT_VERBOSE), precision(DEFAULT_PRECISION), hlimq(DEFAULT_HLIMQ), naux(DEFAULT_NAUX), hlimc(DEFAULT_HLIMC), ptl(DEFAULT_PTL), traceequiv(DEFAULT_TRACEEQUIV), output_pari(DEFAULT_OUTPUT_PARI), selmer_only(DEFAULT_SELMER), second_descent(DEFAULT_2ND_DESCENT), saturation_bound(DEFAULT_SAT_BOUND) { ; } mrank_options(int q, int v, long p, long hq, long nx, long hc, int pl, int teq, int o, int sel, int d2, long sat) :quiet(q), verbose(v), precision(p), hlimq(hq), naux(nx), hlimc(hc), ptl(pl), traceequiv(teq), output_pari(o), selmer_only(sel), second_descent(d2), saturation_bound(sat) {;} void set( GetOpt& getopt) // parameter cannot be const despite what cppcheck says { int option_char; while ((option_char = getopt ()) != EOF) switch (option_char) { case 'V': cout << eclib_version() <15) { cout << "NB: reducing hlimc to 15\n"; } break; case 'S': saturation_bound = atoi (getopt.optarg); break; case '?': cerr<< "usage: mwrank"<< " [q p v b x c l t o s d>]\n"; } if(ptl==-99) ptl=(verbose>0); if(naux<1) naux=1; // syzygy sieving MUST have p=3 in it. } void set(int argc, char **argv) { GetOpt getopt (argc, argv, "Vhqp:v:b:x:ltosdc:S:"); set(getopt); } void help(void) { cerr << "mwrank command line options (can be in any order):\n\n"; cerr << "-h\t""help""\t\tprints this info and quits\n"; cerr << "-V\t""version""\t\tprints eclib version and quits\n"; cerr << "-q\t""quiet""\t\tturns OFF banner display\n"; cerr << "-v n\t""verbosity""\tsets verbosity to n (default="<0) naux=n; else naux=1;} void set_hlimc(long h) {hlimc=h;} void set_ptl(int p) {ptl=p;} void set_traceequiv(int t) {traceequiv=t;} void set_selmer_only(int s) {selmer_only=s;} void set_second_descent(int d) {second_descent=d;} void set_saturation_bound(long sat) {saturation_bound=sat;} }; #endif eclib-20250122/libsrc/eclib/p2points.h000066400000000000000000000114411474421343600173230ustar00rootroot00000000000000// p2points.h: declarations of P2Point class for points in P^2(Q) ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // allow for multiple includes #ifndef _ECLIB_P2POINT_H #define _ECLIB_P2POINT_H #include "bigrat.h" // // class for points in P^2(Q), used as base for points on elliptic curves etc. // class P2Point; P2Point scale(const P2Point& P, const bigint& u, int back=0); P2Point scale(const P2Point& P, long u=1, int back=0); P2Point shift(const P2Point& P, const bigint& r, const bigint& s, const bigint& t, int back=0); P2Point transform(const P2Point& P, const bigint& u, const bigint& r, const bigint& s, const bigint& t, int back=0); class P2Point{ friend class Point; bigint X ; // homogeneous coordinates bigint Y ; bigint Z ; void reduce(); //divide out coordinate gcd public: // constructors P2Point(void) :X(0), Y(0), Z(0) {} // not a real point P2Point(const bigint& x, const bigint& y, const bigint& z) : X(x), Y(y), Z(z) { reduce(); } P2Point(const bigint& x, const bigint& y, long z) : X(x), Y(y), Z(z) { reduce(); } P2Point(const bigint& x, long y, long z) : X(x), Y(y), Z(z) { reduce(); } P2Point(long x, long y, long z) : X(x), Y(y), Z(z) { reduce(); } P2Point(const bigint& x, const bigint& y) : X(x), Y(y), Z(1) { ; } // no need to reduce /* The following creates ambiguities owing to the bigint->bigrational coercion P2Point(const bigrational& x, const bigrational& y) : X(num(x)*den(y)), Y(num(y)*den(x)), Z(den(x)*den(y)) { reduce(); } */ P2Point(const P2Point& Q) :X(Q.X), Y(Q.Y), Z(Q.Z) { ; } ~P2Point(void) {;} // input and output friend inline ostream& operator<<(ostream & os, const P2Point& P) {return os << "[" << P.X << ":" << P.Y << ":" << P.Z << "]" ;} friend inline void output_pari(ostream&os, const P2Point& P) { os<<"["; if(is_zero(P.Z)) { os<<"0"; } else { bigrational x, y; P.getaffinecoordinates(x, y); os<>(istream & is, P2Point& P); // test of equality of points int operator==(const P2Point& Q) const { return eq(*this,Q); } int operator!=(const P2Point& Q) const { return !(*this == Q); } friend int eq(const P2Point&P, const P2Point&Q); // assignment (p.init(.) is quicker than p=P2Point(.) for existing p) void init(const bigint& x, const bigint& y, const bigint& z) {X=x; Y=y; Z=z; reduce(); } void init(const bigint& x, const bigint& y) {X=x; Y=y; Z = bigint(1); } void operator=(const P2Point& Q) // P1 = P2 { X=Q.X ; Y=Q.Y; Z=Q.Z; } // Coordinate transforms useful for elliptic curve points friend P2Point scale(const P2Point& P, const bigint& u, int back); friend P2Point scale(const P2Point& P, long u, int back); friend P2Point shift(const P2Point& P, const bigint& r, const bigint& s, const bigint& t, int back); friend P2Point transform(const P2Point& P, const bigint& u, const bigint& r, const bigint& s, const bigint& t, int back); void getcoordinates(bigint& x, bigint& y, bigint& z) const {x=X; y=Y; z=Z; } void getaffinecoordinates(bigrational& x, bigrational& y) const {x=bigrational(X,Z); y=bigrational(Y,Z); } void getrealcoordinates(bigfloat&x, bigfloat& y) const; bigint getX() const {return X; } bigint getY() const {return Y; } bigint getZ() const {return Z; } int isintegral() const { return is_one(Z); } int isinfinite() const { return is_zero(Z); } int isfinite() const { return is_nonzero(Z); } }; // end of p2point class // the real x and y coords of the point inline void realify_point(const P2Point& P, bigfloat&x, bigfloat& y) { P.getrealcoordinates(x,y); } // end of file: p2points.h #endif eclib-20250122/libsrc/eclib/parifact.h000066400000000000000000000024561474421343600173440ustar00rootroot00000000000000/* parifact.h: integer factorization using libpari, interface via strings */ ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_PARIFACT_H #define _ECLIB_PARIFACT_H 1 //flags that this file has been included #include #include string factor(const string n); int is_prime(const string p); long ellap(long a1, long a2, long a3, long a4, long a6, long p); #endif eclib-20250122/libsrc/eclib/pcprocs.h000066400000000000000000000023541474421343600172210ustar00rootroot00000000000000// FILE PCPROCS.H: declaration of functions used to compute periods ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_PCPROCS_H #define _ECLIB_PCPROCS_H 1 #include int get_curve(long n, long fac, long maxnx, long maxny, const bigfloat& x0, const bigfloat& y0, long& nx, long& ny, int& type, int detail=0); #endif eclib-20250122/libsrc/eclib/periods.h000066400000000000000000000121631474421343600172140ustar00rootroot00000000000000// periods.h : class for integrating newforms ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_PERIODS_H #define _ECLIB_PERIODS_H 1 #include class character { private: long modul; vector chartable; void init(); public: character(long m=1); void reset(long m); long modulus(void) {return modul;} int operator()(long n) {return chartable[n%modul];} }; class summer { protected: bigfloat sum1, sum2; // sum2 not necessarily used long limit, limit1, limit2; bigfloat rootlimit, rootmod, factor, factor1, factor2, rp, ip; long type; long N; vector aplist; vector primelist; vector an_cache; // holds a_n for n up to rootlimit vector a2p_cache; // holds a_n for n=2^e up to rootlimit vector a3p_cache; // holds a_n for n=3^e up to rootlimit vector a5p_cache; // holds a_n for n=5^e up to rootlimit vector a7p_cache; // holds a_n for n=7^e up to rootlimit long n2p,n3p,n5p,n7p; void initaplist(const level* iN, const vector& apl); virtual bigfloat func1(long n) {return to_bigfloat(0);} virtual bigfloat func2(long n) {return to_bigfloat(0);} virtual void use(long n, long an)=0; void use1(long n, long an); void use2(long n, long an); void use2357(long n, long an); void add(long n, long pindex, long y, long z); void add2357(long n, long pindex, long y, long z); void sumit(void); // do the sum public: virtual ~summer() {;} virtual void compute(void)=0; // ditto with pre and post-processing bigfloat rper(void) {return rp;} bigfloat iper(void) {return ip;} Cperiods getperiods() {Cperiods per(rp,ip,type); return per;} }; class periods_via_lfchi :public summer { private: character chi1, chi2; long mplus, mminus, dp0; void use(long n, long an) override {use2(n,an);} bigfloat func1(long n) override { return to_bigfloat(chi1(n)) * pow(factor1,to_bigfloat(n)); } bigfloat func2(long n) override { return to_bigfloat(chi2(n)) * pow(factor2,to_bigfloat(n)); } public: periods_via_lfchi (const level* iN, const newform* f); void compute(void) override; }; class periods_direct :public summer { private: long eps_N, a, b, c, d; bigfloat theta1,theta2; vector ctab, stab; // array of cos(j*2*pi/d), sin(j*2*pi/d), for j mod d void use(long n, long an) override; public: periods_direct (const level* iN, const newform* f); void compute(void) override; void compute(long ta, long tb, long tc, long td); // period of (a,b;Nc,d) in Gamma_0(N) }; class part_period :public summer { private: bigfloat efactor,x0,y0,xn; bigfloat func1(long n) override { xn=to_bigfloat(n); efactor = exp(-xn*y0); return efactor*cos(xn*x0); } bigfloat func2(long n) override { return efactor*sin(xn*x0); } void use(long n, long an) override { use2(n,an);} public: part_period (const level* iN, const newform* f); ~part_period () {;} void compute(const bigcomplex& z0); void compute() override; bigcomplex getperiod() {return bigcomplex(rp,ip);} }; class ldash1 : public summer { private: long r; int computed; bigfloat ld1; bigfloat G(bigfloat x); // G_r(x) void init(const level* N, const vector& f_aplist, long f_sfe, const rational& f_loverp); void use(long n, long an) override {use1(n,an);} bigfloat func1(long n) override; public: ldash1 (const level* iN, const newform* f); ldash1 (const newforms* nf, long i); // the i'th newform void compute(void) override; long rank() {compute(); return r;} bigfloat value() {compute(); return ld1;} // // NB this value is equal to r!*L^{(r)}(f,1) -- note the r! factor! // }; class lfchi : public summer { private: long limit0; bigfloat val; character chi; bigfloat func1(long n) override { return chi(n)*pow(factor1,to_bigfloat(n));} void use(long n, long an) override {use1(n,an);} public: lfchi (const level* iN, const newform* f); void compute(long ell); void compute(void) override {} // not called but has to exist; bigfloat value(void) {return val;} bigfloat scaled_value(void) {return sqrt(to_bigfloat(chi.modulus()))*val;} }; vector resort_aplist(const level* iN, const vector& primelist, const vector& apl); bigfloat myg1(bigfloat x); #endif eclib-20250122/libsrc/eclib/points.h000066400000000000000000000160071474421343600170640ustar00rootroot00000000000000// points.h: declarations of Point class for points on elliptic curves ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // originally adapted from Elliptic.h by Oisin McGuiness // allow for multiple includes #ifndef _ECLIB_POINTS_ #define _ECLIB_POINTS_ #include #include #include // // class for points on elliptic curves // class Point; Point transform(const Point& p, Curvedata* newc, const bigint& u, const bigint& r, const bigint& s, const bigint& t, int back=0); class Point : public P2Point { Curvedata *E; // pointer to the curve that the point is on int ord; // order: 0 if not calculated yet, -1 if infinite bigfloat height; // -1.0 if not calculated yet, 0.0 for torsion point public: // constructors Point(void) : P2Point(), E(0), ord(0), height(to_bigfloat(-1.0)) { ; } explicit Point(Curvedata &EE) // set to point at infinity : P2Point(0,1,0), E(&EE), ord(1), height(to_bigfloat(0.0)) { ; } explicit Point(Curvedata *EE) // set to point at infinity : P2Point(0,1,0), E(EE), ord(1), height(to_bigfloat(0.0)) { ; } Point(Curvedata &EE, const bigint& x, const bigint& y, const bigint& z) : P2Point(x,y,z), E(&EE), ord(0), height(to_bigfloat(-1.0)) { ; } Point(Curvedata &EE, const P2Point& P) : P2Point(P), E(&EE), ord(0), height(to_bigfloat(-1.0)) { ; } Point(Curvedata *EE, const bigint& x, const bigint& y, const bigint& z) : P2Point(x,y,z), E(EE), ord(0), height(to_bigfloat(-1.0)) { ; } Point(Curvedata *EE, const P2Point& p) : P2Point(p), E(EE), ord(0), height(to_bigfloat(-1.0)) { ; } Point(Curvedata &EE, const bigint& x, const bigint& y) : P2Point(x,y), E(&EE), ord(0), height(to_bigfloat(-1.0)) { ; } Point(Curvedata *EE, const bigint& x, const bigint& y) : P2Point(x,y), E(EE), ord(0), height(to_bigfloat(-1.0)) { ; } Point(const Point& Q) : P2Point(Q), E(Q.E), ord(Q.ord), height(Q.height) { ; } ~Point(void) {;} // input and output are inherited from P2Point class but the input // function must initialize the ord and height fields too friend istream& operator>>(istream & is, Point& P) { is>>(P2Point&)P; P.ord=0; P.height=to_bigfloat(-1.0); // NB P's Curve should have been set when it was constructed. return is; } // test of equality of points int operator==(const Point& Q) const { if(E != Q.E) return 0 ; // different curves! return eq(*this,Q); } int operator!=(const Point& Q) const { return !(*this == Q); } // assignment (p.init(.) is quicker than p=Point(.) for existing p) void init(Curvedata &EE, const bigint& x, const bigint& y, const bigint& z) {E=&EE; X=x; Y=y; Z=z; reduce(); ord=0; height=-1.0; } void init(Curvedata *EE, const bigint& x, const bigint& y, const bigint& z) {E=EE; X=x; Y=y; Z=z; reduce(); ord=0; height=-1.0; } void init(Curvedata &EE, const bigint& x, const bigint& y) {E=&EE; X=x; Y=y; Z = 1; ord=0; height=-1.0; } void init(Curvedata *EE, const bigint& x, const bigint& y) {E=EE; X=x; Y=y; Z = 1; ord=0; height=-1.0; } void operator=(const Point& Q) // P1 = P2 { E=Q.E; X=Q.X ; Y=Q.Y; Z=Q.Z; ord=Q.ord; height=Q.height; } friend Point transform(const Point& p, Curvedata* newc, const bigint& u, const bigint& r, const bigint& s, const bigint& t, int back); void operator+=(const Point&) ; // P1 += P2 ; order and height unknown void operator-=(const Point&) ; // P1 -= P2 ; ditto // addition of points, etc Point operator+(const Point &) const ; // P1 + P2 Point operator-(const Point &) const ; // P1 - P2 Point operator-(void) const ; // -P Point twice(void) const ; // doubles P friend Point operator*(int, const Point&) ; // n*P // access functions Curve getcurve() const {return *E;} friend int order(Point& p); // calculate and set if not set friend int order(Point& p, vector&multiples); // also create and return list of multiples friend bigfloat height(Point& P); //calculate and set if not set friend bigfloat realheight(const Point& P); friend bigfloat pheight(const Point& P, const bigint& p); vector division_points(int m); // list of Q s.t. n*Q=this // useful logical tests int is_zero() const { return isinfinite(); } int isvalid() const ; // P on its curve ? int is_torsion() { return order(*this)>0; } // will compute and set the order if needed int is_on_real_identity_component() const; int is_on_egg() const {return !is_on_real_identity_component();} // return 1 if P mod p is nonsingular (or for p=0 if it is on the real identity component): int has_good_reduction(long p) const; int has_good_reduction(const bigint& p) const; // return 1 if P has good reduction at all p in list, if not then p0 holds first bad prime int has_good_reduction(const vector& plist, bigint& p0, int check_real=0) const; }; // end of point class // list of 0,1 or 2 points with given x-coordinate: vector points_from_x(Curvedata &E, const bigrational& x); // the real x and y coords of the point void realify_point(const Point& P, bigfloat&x, bigfloat& y); // the real component of the canonical height bigfloat realheight(const bigfloat& x, const Curvedata* E); // the height pairing of two points bigfloat height_pairing(Point& P, Point& Q); // regulator of a list of n points bigfloat regulator(vector& points); // not a const array; heights get set. // torsion functions returning // (exact==0) list of points in E[m] for m=2, m=3 and general m // (exact==1) list of points of exact order m for m=2, m=3 and general m // N.B. Don't make the params const here vector two_torsion(Curvedata& E, int exact=0); vector three_torsion_x(Curvedata& E); vector three_torsion(Curvedata& E, int exact=0); // List m-torsion points, i.e. points in E[m], or points of exact order m if exact==1 vector m_torsion(Curvedata& E, long m, int exact=0); vector torsion_points(Curvedata& E); inline long ntorsion(Curvedata& E) { return E.get_ntorsion(); } // end of file: points.h #endif eclib-20250122/libsrc/eclib/pointsmod.h000066400000000000000000000177321474421343600175720ustar00rootroot00000000000000// pointsmod.h: declaration of classes pointmodq and curvemodqbasis ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // curvemodqbasis is derived from curvemodq (see file curvemod.h) and // contains a Z-basis for the group of points // The baby-step-giant step algorithm in my_bg_algorithm was // originally adapted from LiDIA's bg_algorithm(); it has some changes. // The point-counting and group structure algorithm in // my_isomorphism_type() provide the same functionality as LiDIA's // isomorphism_type() but has been rewritten from scratch; a main // difference from the LiDIA version is the use of Weil pairing when // the group is not cyclic. This is only intended for use when q is // small-medium sized (NOT cryptographic!). The current // implementation is only for prime fields, but the same strategy // would work over arbitrary finite fields. // allow for multiple includes #ifndef _ECLIB_POINTSMOD_H #define _ECLIB_POINTSMOD_H #include #include class ffmodq; // Class for points on an elliptic curve mod q // class galois_field; class pointmodq{ gf_element X ; // inhomogeneous coordinates gf_element Y ; // int is0flag; // set iff it's the point at infinity bigint order; // 0 if not set curvemodq E; // the curve it's on public: // constructors pointmodq(void) :E() {} explicit pointmodq(const curvemodq& EE ) :is0flag(1), order(1), E(EE) {} // the point at oo pointmodq(const gf_element&x, const gf_element&y, const curvemodq& EE) :X(x), Y(y), is0flag(0), order(0), E(EE) { if(!on_curve()) cout<<"Error! ("< get_pbasis(int p); vector get_pbasis_from_roots(int p, const vector& xi); vector get_pbasis_via_divpol(int p); vector get_pbasis_via_divpol(int p, const ZPoly& pdivpol); friend class TLSS; }; bigint my_bg_algorithm(const pointmodq& PP, const pointmodq& QQ, const bigint& lower, const bigint& upper, bool info=false); void set_hasse_bounds(const bigint& q, bigint& l, bigint& u); bigint my_order_point(const pointmodq& PP); bigint my_order_point(const pointmodq& PP, const bigint& lower, const bigint& upper); bigint my_order_point(const pointmodq& PP, const bigint& mult); // returns minimal m>0 s.t. m*Q is in

with m*Q=a*P. Special case: // if and

are disjoint, then m=order(Q) and a=0. bigint linear_relation( pointmodq& P, pointmodq& Q, bigint& a); // Replace P (of order ordP) with a point whose order is lcm(ordP,order(Q)) void merge_points_1(pointmodq& PP, bigint& ordP, pointmodq& Q); // Given independent generators P1,P2 with orders n1, n2 and n2|n1, // and a new point Q: // // (1) If ord(Q)|ord(P1) -- the normal case -- replace P2 with a point // whose order mod is lcm of ord(P2) and ord(Q) mod // // (2) Else replace P1 as with merge_points_1 and reset P2 void merge_points_2(pointmodq& P1, bigint& n1, pointmodq& P2, bigint& n2, const bigint& n2target, pointmodq& Q); inline bool less(const gf_element& a, const gf_element& b) { return LiftGF(a) // scalars #include #include #include #define ZPoly ZZX #define PolyCoeff(f,i) coeff((f),(i)) #define ZPolySetX(f) SetX(f); #define SetDegree(f,d) #define Degree(f) deg((f)) #define FqPoly ZZ_pX #define NewFqPoly(field,name) FqPoly name #define FqPolySetField(f,field) // do nothing #define FqPolyAssignGF(f,c) f=((c)) #define FqPolyAssignZ(f,c) f=(to_ZZ_p(c)) #define FqPolyAssign0(f) f=to_ZZ_p(0) #define FqPolyAssign1(f) f=to_ZZ_p(1) #define FqPolyEval(f,c) eval((f),to_ZZ_p(c)) #define FqPolyAssignX(f) SetX(f) #define GetField(f) (galois_field(ZZ_p::modulus())) vector rootsmod(const vector& coeffs, bigint p); vector roots(const FqPoly& f); vector roots(const vector& coeffs); vector roots(const ZPoly& f); vector introots(const ZPoly& f); vector Introotscubic(const bigint& a, const bigint& b, const bigint& c); vector Introotsquartic(const bigint& a, const bigint& b, const bigint& c, const bigint& d); // find the number of roots of X^3 + bX^2 + cX + d = 0 (mod p) int nrootscubic(const bigint& bb, const bigint& cc, const bigint& dd, const bigint& p); FqPoly reduce(const ZPoly& f, const galois_field& Fq); inline FqPoly reduce(const ZPoly& f, const bigint& q) {return reduce(f,galois_field(q));} #endif // #define _POLYS_ eclib-20250122/libsrc/eclib/qc.h000066400000000000000000000031421474421343600161470ustar00rootroot00000000000000// qc.h: declaration of function for mapping quartic point to curve ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_QC_H #define _ECLIB_QC_H 1 //flags that this file has been included // Given a quartic g with a point (x0:y0:z0) on it, // constructs a point P on the corresponding minimal elliptic curve. // This is supposed to be on the given curve E: error printed if not. // The point is returned indirectly. #include void qc(quartic& g, const bigint& x0, const bigint& y0, const bigint& z0, Curvedata * E, Curvedata* IJ_curve, const bigint& tr_u, const bigint& tr_r, const bigint& tr_s, const bigint& tr_t, Point& P, int verbose=0); #endif eclib-20250122/libsrc/eclib/quadratic.h000066400000000000000000000061521474421343600175250ustar00rootroot00000000000000// quadratic.h: declaration of class for handling integer quadratics ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // Stored as bigint* arrays q of size 3 representing q[0]*x^2+q[1]*x+q[2] #ifndef _ECLIB_QUADRATIC_H #define _ECLIB_QUADRATIC_H 1 //flags that this file has been included #include "unimod.h" class quadratic { friend class unimod; private: vector coeffs; public: void set(const bigint& a, const bigint& b, const bigint& c) {coeffs = {a, b, c};} quadratic() { bigint zero(0); coeffs={zero,zero,zero};} quadratic(const bigint& a, const bigint& b, const bigint& c) :coeffs({a, b, c}) {;} quadratic(long a, long b, long c) :coeffs({bigint(a), bigint(b), bigint(c)}) {;} explicit quadratic(const bigint* q) :coeffs({q[0], q[1], q[2]}) {;} quadratic(const quadratic& q) :coeffs(q.coeffs) {;} void operator=(const quadratic& q) {coeffs = q.coeffs;} bigint eval(const bigint& x, const bigint& z) const {return coeffs[0]*sqr(x) + coeffs[1]*x*z + coeffs[2]*sqr(z);} bigint operator()(const bigint& x, const bigint& z) const {return coeffs[0]*sqr(x) + coeffs[1]*x*z + coeffs[2]*sqr(z);} bigint eval(const bigint& x) const {return coeffs[0]*sqr(x) + coeffs[1]*x + coeffs[2];} bigint operator()(const bigint& x) const {return coeffs[0]*sqr(x) + coeffs[1]*x + coeffs[2];} bigint coeff(int i) const {return coeffs[i];} bigint operator[](int i) const {return coeffs[i];} void set_coeff(int i, const bigint& a) {if((i>=0)&&(i<=2)) coeffs[i]=a;} friend bigint resultant(const quadratic& q1, const quadratic& q2); bigint disc() const {return sqr(coeffs[1])-4*coeffs[0]*coeffs[2];} void output(ostream& os=cout) const { os<<"["< class rational { friend class bigrational; public: // constructors rational(long num_val=0, long den_val=1); rational(const rational& q); void operator=(const rational& q); // rational manipulations void cancel(); // cancel *this in situ friend long num(const rational&); // the numerator friend long den(const rational&); // the denominator friend rational recip(const rational&); // reciprocal friend long round(const rational&); // nearest integer // Binary Operator Functions friend rational operator+(const rational&, const rational&); friend rational operator+(long, const rational&); friend rational operator+(const rational&, long); friend rational operator-(const rational&, const rational&); friend rational operator-(long, const rational&); friend rational operator-(const rational&, long); friend rational operator*(const rational&, const rational&); friend rational operator*(const rational&, long); friend rational operator*(long, const rational&); friend rational operator/(const rational&, const rational&); friend rational operator/(const rational&, long); friend rational operator/(long, const rational&); friend int operator==(const rational&, const rational&); friend int operator!=(const rational&, const rational&); friend ostream& operator<< (ostream&s, const rational&); friend istream& operator>> (istream& is, rational& r); rational& operator+=(const rational&); rational& operator+=(long); rational& operator-=(const rational&); rational& operator-=(long); rational& operator*=(const rational&); rational& operator*=(long); rational& operator/=(const rational&); rational& operator/=(long); rational operator+() const; rational operator-() const; friend long floor(const rational& r); friend long ceil(const rational& r); operator double(); // conversion operator #ifdef MPFP operator bigfloat(); // conversion operator #endif // Implementation private: long n, d; }; // Inline rational functions inline void rational::cancel() // cancel *this in situ { long g = ::gcd(n,d); if (g>1) {n/=g; d/=g;} if (d<0) {n=-n; d=-d;} } inline rational::rational(long num_val, long den_val) { n=num_val; d=den_val; (*this).cancel(); } inline rational::rational(const rational& q) :n(q.n), d(q.d) {;} inline void rational::operator=(const rational& q) {n=q.n; d=q.d;} inline rational rational::operator+() const { return *this; } inline rational rational::operator-() const { return rational(-n, d); } // Definitions of compound-assignment operator member functions inline rational& rational::operator+=(const rational& q2) { n = n*q2.d+d*q2.n; d *= q2.d; (*this).cancel(); return *this; } inline rational& rational::operator+=(long num_val2) { n += d*num_val2; return *this; } inline rational& rational::operator-=(const rational& q2) { n = n*q2.d-d*q2.n; d *= q2.d; (*this).cancel(); return *this; } inline rational& rational::operator-=(long num_val2) { n -= d*num_val2; return *this; } inline rational& rational::operator*=(const rational& q2) { n *= q2.n; d *= q2.d; (*this).cancel(); return *this; } inline rational& rational::operator*=(long num_val2) { n*=num_val2; (*this).cancel(); return *this; } inline rational& rational::operator/=(long num_val2) { d*=num_val2; (*this).cancel(); return *this; } inline rational::operator double() {return double(n)/double(d);} #ifdef MPFP inline rational::operator bigfloat() {return to_bigfloat(n)/to_bigfloat(d);} #endif // Definitions of non-member rational functions inline long num(const rational& q) { return q.n; } inline long den(const rational& q) { return q.d; } inline rational recip(const rational& q) { return rational(q.d, q.n); } inline long round(const rational& q) { return q.n / q.d; //provisional -- should fix rounding direction. } // Definitions of non-member binary operator functions inline rational operator+(const rational& q1, const rational& q2) { return rational(q1.n*q2.d + q2.n*q1.d, q1.d * q2.d); } inline rational operator+(long num_val1, const rational& q2) { return rational(num_val1*q2.d + q2.n, q2.d); } inline rational operator+(const rational& q1, long num_val2) { return rational(q1.n + num_val2*q1.d, q1.d); } inline rational operator-(const rational& q1, const rational& q2) { return rational(q1.n*q2.d - q2.n*q1.d, q1.d * q2.d); } inline rational operator-(long num_val1, const rational& q2) { return rational(num_val1*q2.d - q2.n, q2.d); } inline rational operator-(const rational& q1, long num_val2) { return rational(q1.n - num_val2*q1.d, q1.d); } inline rational operator*(const rational& q1, long num_val2) { return rational(q1.n*num_val2, q1.d); } inline rational operator*(long num_val1, const rational& q2) { return rational(q2.n*num_val1, q2.d); } inline rational operator*(const rational& q1, const rational& q2) { return rational(q1.n*q2.n, q1.d*q2.d); } inline rational operator/(const rational& q1, long num_val2) { return rational(q1.n, q1.d*num_val2); } inline rational operator/(const rational& q1, const rational& q2) { return rational(q1.n*q2.d, q1.d*q2.n); } inline rational operator/(long num_val1, const rational& q2) { return rational(q2.d*num_val1, q2.n); } inline int operator==(const rational& q1, const rational& q2) { return q1.n*q2.d == q2.n*q1.d; } inline int operator!=(const rational& q1, const rational& q2) { return q1.n*q2.d != q2.n*q1.d; } inline ostream& operator<<(ostream& s, const rational& q) { if(q.d==0) s<<"oo"; else { s << q.n; if (q.d!=1) {s << "/" << q.d;} } return s; } inline istream& operator>> (istream& is, rational& r) { long n,d=1; is>>n; if(!is.eof()) { char c; is.get(c); if(c=='/') { is>>d; } else { is.putback(c); } } r=rational(n,d); return is; } // NB gcd(n,d)=1 and d>0: inline long floor(const rational& r) { return (r.n-(r.n%r.d))/r.d; } inline long ceil(const rational& r) { if(r.d==1) return r.n; return 1 + (r.n-(r.n%r.d))/r.d; } #endif eclib-20250122/libsrc/eclib/reader.h000066400000000000000000000040561474421343600170130ustar00rootroot00000000000000// reader.h: class for reading curves from file/tty ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #if !defined(_ECLIB_READER_H) #define _ECLIB_READER_H 1 //flags that this file has been included #include #include // for gcc >= 4.3 #include #define TTY "/dev/tty" class CurveReader { private: int tty_input; ifstream in; public: CurveReader() { tty_input=0; string filename; cerr << "Enter a filename for curve input (or tty): "; cin >> filename; cerr<<"filename entered is "<>(Curve& c) { if(tty_input) { cerr<<"Enter a curve (null to exit): "<>ws; if(cin.eof()) {cerr<>c; } else { in>>ws; if(in.eof()) return 0; in >> c; } return !c.isnull(); } }; #endif eclib-20250122/libsrc/eclib/realroots.h000066400000000000000000000030361474421343600175600ustar00rootroot00000000000000// realroots.h: declarations of funtions for real roots of polynomials ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_REALROOTS_H #define _ECLIB_REALROOTS_H 1 //flags that this file has been included #include bigfloat safe_sqrt(const bigfloat& x); bigfloat cube_root(const bigfloat& x); // coeff contains deg+1 reals starting with the leading coefficient // which must be nonzero // // we assume the roots are distinct vector realroots( const vector& coeff ); // As above but only root in the interval [-1,1] vector realroots11( const vector& coeff ); #endif eclib-20250122/libsrc/eclib/reduce.h000066400000000000000000000036161474421343600170210ustar00rootroot00000000000000// reduce.h: declaration of quartic reduction functions ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_REDUCE_H #define _ECLIB_REDUCE_H 1 //flags that this file has been included #include // NB In both functions, the unimod m must hold the cumulative // transformation on entry. It will be updated to show the new // cumulative transformation // Full reduction via covariant quadratic: void reduce(bigint& a, bigint& b, bigint& c, bigint& d, bigint& e, unimod& m); // Simple shift to minimise b: void reduce_b(bigint& a, bigint& b, bigint& c, bigint& d, bigint& e, unimod& m); // Compute the quadratic covariant of a real quartic: vector quadratic_covariant(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const bigint& e); // Given a pos. def. quadratic x^2+b*x+c, returns a unimod which // reduces it (whose inverse takes its root into the fundamental // region). unimod reduce_quad(const bigfloat& b, const bigfloat& c); #endif eclib-20250122/libsrc/eclib/saturate.h000066400000000000000000000162201474421343600173750ustar00rootroot00000000000000// saturate.h: declaration of class saturator for sieving E(Q)/pE(Q) ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // This is used for proving that points are p-saturated // allow for multiple includes #ifndef _ECLIB_SATURATE_H #define _ECLIB_SATURATE_H #include #include #ifndef MAX_REPEAT #define MAX_REPEAT 10 #endif // automatic saturation will only saturate at primes less than this, // unless overridden by the sat_bd parameter: const long SAT_MAX_PRIME = 100000; // Bound for the index of saturation for the given set of points If // egr is set it determines the egr subgroup of the group the points // generate and only searches for points with egr, This might be // faster in some cases. // The points parameter is not const, since the heights of the points // may be computed and set. // We can recover the curve from the points, unless the list is empty // in which case the bound is 1. bigint index_bound(vector& points, int egr=1, int verbose=0); class saturator { private: Curvedata *E; // the curve vector Plist; // the points vector Plistp; // the p-cotorsion vector Plistx; // the points plus p-cotorsion vector AllTorsion; // all torsion on E ZPoly pdivpol; // p-division poly (not always used) bigint the_index_bound; // set initially, but may get reduced vector tam_primes; // primes dividing any Tamagawa index int rank; // = #Plistx bigint disc; // discriminant of E vector badp; // E's bad primes int p; // current prime to saturate at int log_index; // current points have index p^log_index in original primevar qvar; // loops over possible sieving primes q map Emodq; map Emodq_order; int newq; // =1 iff we are using q not yet cached map q_tally; // key=q, value = count of number of times q used bigint maxq; // largest q used int maxp; // p for which largest q used int egr_flag; // 1 if we are using the EGR subgroup mat_l TLimage; int TLrank, stuck_counter, verbose, use_div_pols; // apply TL map (mod current q) to P, result in (ntp*)[0..p-1]: vector TLmap1(const Point& P); // apply TL map (mod current q) to Plistx, result is a (ntp*rank) matrix: mat_l TLmap(); // public: explicit saturator(Curvedata* EE, int egr=1, int verb=0) :E(EE), egr_flag(egr), verbose(verb) { use_div_pols=0; disc = getdiscr(*E); AllTorsion = torsion_points(*EE); CurveRed C(*E); tam_primes = tamagawa_primes(C, 1); // 1 means include 2 if E(R) has 2 components badp = getbad_primes(*E); maxq = 0; the_index_bound = bigint(0); // means not set } ~saturator() {; } // initialize point list void set_points(const vector& PP) { Plist = PP; the_index_bound = bigint(0); } // initialize index bound void set_index_bound(); // return current index bound (compute if necessary) bigint get_index_bound(); // test whether p is greater than the saturation index and not a Tamagawa prime int trivially_saturated(long p); // find next usable q and use it void nextq(); // test p-saturation by using q until saturated (return 1) or stuck // (return 0): int test_saturation(int pp, int ms=MAX_REPEAT); // try harder with same p (no initialization, but same point set) int test_saturation_extra(int pp, int ms=MAX_REPEAT); // enlarge basis if dim(kernel)>0: int enlarge(); // repeat testing p-saturation and enlarging until done: returns // log_p of index, or -1 if failed int do_saturation(int pp, int maxntries=10); // As above but for all primes in plist, returns success flag, sets // index and unsat = list of primes in plist at which saturation // failed = empty iff success flag=0 int do_saturation(vector plist, long& index, vector& unsat, int maxntries=10); int do_saturation(vector plist, long& index, vector& unsat, int maxntries=10); // Either (when sat_bd=-1) auto-saturate, finding an upper bound ib // on saturation index, or (when sat_bd>0) saturate only for primes // up to min(ib,sat_bd). If sat_low_bd>0 then we do no p-saturation // for p& unsat, long& index, long sat_bd=-1, long sat_low_bd=2, int maxntries=10); // replace the generating points & reset matrices and ranks // (then can use test_saturation_extra()) // (for re-saturating at a prime p already used) void reset_points(const vector& PP); // get p-rank of input + p-cotorsion long getprank() const {return rank;}; // get rank of current image long getTLrank() const {return TLrank;}; // get current q: long get_q() const {return (long)qvar;}; // get current generators (not including p-cotorsion) vector getgens() const {return Plist;}; // get current generators (including p-cotorsion) vector getxgens() const {return Plistx;}; // get # steps since last rank increase long stuckfor() const {return stuck_counter;}; // get a nonzero kernel vector (if any) vec_l kernel_vector(); // test if saturated: int is_saturated() {return rank==TLrank;} void show_q_tally(); // display list of q used with multiplicity. }; // auxiliary functions, not part of the saturator class: // Use this where Torsion already computed: vector pCoTorsion(const vector& AllTorsion, int p); // Use this for a one-off computation where Torsion not yet computed: inline vector pCoTorsion(Curvedata* EE, int p) { return pCoTorsion(torsion_points(*EE),p); } // Saturate the given points automatically (using egr strategy if set) // Returns success flag and index, and (if success==0) a list of // primes at which saturation failed. The array points will be // changed (if necessary) into a basis for the saturation. // If sat_bd>-1 it is used to truncate the upper bound. // No p-saturation is done for p& points, long& index, vector& unsat, long sat_bd=-1, long sat_low_bd=2, int egr=1, int verbose=0); #endif eclib-20250122/libsrc/eclib/sieve_search.h000066400000000000000000000270751474421343600202170ustar00rootroot00000000000000// sieve_search.h: declarations of classes point_processor and qsieve ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // File : sieve_search.h // Author : Sophie Labour // Adaption of M. Stoll's code // Last change : SL, Apr 21 1999, first definitions // Last change : JC, Dec 2 1999, adapted for direct use in mwrank et al. // Last change : JC, Aug 19 2002, adapted for stdc++ library #ifndef _ECLIB_SIEVE_SEARCH_H #define _ECLIB_SIEVE_SEARCH_H #include class point_processor { //An abstract class to be used as interface in qsieve public: virtual int process(const bigint& x,const bigint& y,const bigint& z)=0; // where x/z is the point found and y the square root of f(a,b); // #!# different if the degree is even or odd, poly monic or not; // true homogeneous coordinates are [a*b^n-1:y:b^n] where n=degree/2 if // degree even or degree odd & polyn monic (b is a square so b^n is // (sqrt(b))^degree), n=(degree+1)/2 otherwise // if no_check option, process(x,0,z) is called // the int return value is to signal the search to stop (if set to 1) virtual ~point_processor() {;} }; class point_printer : public point_processor { public: point_printer() {}; ~point_printer() {}; int process(const bigint& xx, const bigint& yy, const bigint& zz) override {cout<<"x= "< coeff, int verb=0); qsieve(point_processor* acurve, int deg, vector coeff, bigfloat h_limx, int verb=0); //qsieve(point_processor* acurve, int deg, vector coeff, double h_lim, // double up, double low, int verb=1); ~qsieve(); void set_intervals(vector interv,int nb_bnd,int start_low,int pos_x_only=0); //the search will be made on the intervals thus defined: //nb_bnd bounds are given in interv, the first one being a lower bound //for the first interval if start_low=1, and the upper bound for the first // interval (the lower bound being -height) otherwise. //we must have interv[i]0"<0"<0"<0) b_low=b;}; //upper bound for the denominator (default:height) void set_b_high(long b) {if (b>0) b_high=b;}; //all perform sieve-assisted fast search according to the info provided: //h_lim(logarithmic, default:5), b_low,b_high(bounds z, optional) //intervals for x/z, optional, must be set AFTER height //the sieve uses height, so it is set every time search is called long search(); long search(double h_lim); }; /* This is a comparison function needed for sorting in order to determine the `best' primes for sieving. */ int compare_entries(const void *a, const void *b); #endif eclib-20250122/libsrc/eclib/sifter.h000066400000000000000000000035001474421343600170360ustar00rootroot00000000000000// sifter.h: declaration of class for sifting E(Q)/2E(Q) ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // NB This is used for proving that points are independent; now // largely obsolete, being superceded by general saturation algorithms // allow for multiple includes #ifndef _ECLIB_SIFTER_H #define _ECLIB_SIFTER_H #include class sifter { private: Curvedata *E; bigint I, J, disc; bigint r,s,t; // tranforms E to E_{I,J} (u=6) int rank; int verbose; int num_aux, max_dim_im; vector> eps_mat, squares; vector pivcols, nroots; vector auxs, all_p; vector> thetamod; public: sifter(Curvedata* EE, int na, int verb=0); int code(const bigint& x, const bigint& z2, int i); vector eps(const bigint& x, const bigint& z2); void process(const Point& P); void process(const vector& Plist); int getrank() {return rank;} void vecout(const vector& v); }; #endif eclib-20250122/libsrc/eclib/smat.h000066400000000000000000000124201474421343600165070ustar00rootroot00000000000000// smat.h: declarations for sparse integer matrix class smat ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // Should not be included directly by user: include smatrix.h instead // We cannot use one macro to prevent this being included twice since // we want it to be included twice by smatrix.h which defined _ECLIB_SMATRIX_H // Original version by Luiz Figueiredo int eqmodp(const smat&, const smat&, const scalar& p); class smat { friend class smat_elim; protected: int nco; // number of columns int nro; // number of rows int **col; // holds cols of entries scalar **val; // holds values of entries public: // constructors smat (int nr=0, int nc = 0); smat (const smat&); // copy constructor explicit smat (const mat &); // conversion constructor ~smat(); // destructor // member functions & operators mat as_mat( ) const; smat& operator=(const smat&); // assignment with copy scalar elem(int i, int j) const; // returns value of (i,j) entry smat& operator+= (const smat&); smat& operator+= (const scalar&); // adds scalar*identity smat& operator-= (const smat&); smat& operator-= (const scalar& s) // subtracts scalar*identity {this->operator+=(-s); return *this;} smat& operator*= (scalar); void sub_mod_p(const scalar& lambdal, const scalar& p); // subtracts scalar*identity mod p void reduce_mod_p(const scalar& p); smat& mult_by_scalar_mod_p (scalar scal, const scalar& p); smat& operator/= (scalar); mat operator*( const mat& ); void set_row ( int, int, int*, scalar* ); smat select_rows(const vec_i& rows) const; void setrow ( int i, const svec& v); // i counts from 1 void setrow ( int i, const vec& v); // i counts from 1 svec row(int) const; // extract row i as an svec int nrows() const {return nro;} int ncols() const {return nco;} long rank(scalar mod); // implemented in smat_elim.cc long nullity(const scalar& lambda, scalar mod); // nullity of this-lambda*I static smat scalar_matrix(int n, const scalar& a); // nxn scalar matrix a*I static smat identity_matrix(int n) {return scalar_matrix(n, scalar(1));} // nxn identity matrix I // non-member (friend) functions and operators friend inline vector dim(const smat& A) {vectord; d.push_back(A.nro);d.push_back(A.nco);return d;} friend vec operator* (const smat& m, const vec& v); friend svec operator* ( const smat& A, const svec& v ); friend svec operator* ( const svec& v, const smat& A ); friend svec mult_mod_p( const smat& A, const svec& v, const scalar& p ); friend vec mult_mod_p( const smat& A, const vec& v, const scalar& p ); friend svec mult_mod_p( const svec& v, const smat& A, const scalar& p ); friend smat operator* ( const smat& A, const smat& B ); friend smat mult_mod_p ( const smat& A, const smat& B, const scalar& p ); friend smat mult_mod_p_flint ( const smat& A, const smat& B, const scalar& p ); friend scalar maxabs( const smat& A); friend smat transpose(const smat&); friend int operator==(const smat&, const smat&); // Equality mod p: friend int eqmodp(const smat&, const smat&, const scalar& p); friend ostream& operator<< (ostream&s, const smat&); friend istream& operator>> (istream&s, smat&); friend int get_population (const smat& ); //mainly used for testing friend inline double density (const smat& m) {return (((double)(get_population(m)))/m.nro)/m.nco;} friend void random_fill_in( smat&, int, scalar ); //the elimination program friend int liftmat(const smat& mm, scalar pr, smat& m, scalar& dd); friend int liftmats_chinese(const smat& mm1, scalar pr1, const smat& mm2, scalar pr2, smat& m, scalar& dd); }; // Declaration of non-friend functions smat operator+(const smat&); // unary smat operator-(const smat&); // unary smat operator+(const smat& m1, const smat& m2); smat operator-(const smat& m1, const smat& m2); smat operator*(scalar scal, const smat& m); smat operator/(const smat& m, scalar scal); int operator!=(const smat& m1, const smat& m2); inline void display_population(const smat& A) { cout << " number of non-zero entries: " << get_population(A) << endl; } eclib-20250122/libsrc/eclib/smat_elim.h000066400000000000000000000121561474421343600175230ustar00rootroot00000000000000// smat_elim.h: declaration of class smat_elim, for sparse elimination ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // Original version by Luiz Figueiredo // Not to be included directly by user: use smatrix_elim.h which // defines _ECLIB_SMATRIX_ELIM_H and includes this twice class smat_elim : public smat{ private: class list { public: typedef int type; //use this till smat is made a template class. static int listsize; int maxsize; type *list_array; int num; int index; void put( const type& X) { if( num >= maxsize ) { // cout<<"About to grow list from size "< // The following class must be a base class of any class wishing to // use the form_finder class; the using class must implement some or // all of these virtual functions before creating a form_finder with // "this" as first parameter in the constructor: // // In all cases implement opmat, matdim, matden, use; implement eigrange // iff you are going to use the recursive search function find() // // opmat(i) returns the i'th operator for i>=0; opmat(-1) should return // the conjugation matrix in the case where target dimension is 2 (i.e. // plusflag=0) and basis vectors bplus, bminus are required. // // matdim() returns the size of the matrices, i.e. dimension of ambient space // // matden() returns the implicit denominator of all matrices, needed to scale // eigenvalues // // eigrange(i) returns a list of possible eigenvalues for opmat(i) // // use(basis1, basis2, eiglist) provides whatever processing is done with the // 1-dimensional eigenspaces as found. // (basis2 will not be used when plusflag=1) class splitter_base { public: virtual mat opmat(int,int,int=0) = 0; virtual vec opmat_col(int i, int j, int verb=0) = 0; virtual mat opmat_cols(int i, const vec& jlist, int verb=0) = 0; virtual mat opmat_restricted(int,const subspace& s, int,int=0) = 0; virtual smat s_opmat(int,int,int=0) = 0; virtual svec s_opmat_col(int i, int j, int verb=0) = 0; virtual smat s_opmat_cols(int i, const vec& jlist, int verb=0) = 0; virtual smat s_opmat_restricted(int,const ssubspace& s, int, int=0) = 0; virtual long matdim(void) = 0; virtual long matden(void) = 0; virtual vector eigrange(int) = 0; virtual long dimoldpart(const vector) = 0; virtual void use(const vec&, const vec&, const vector) = 0; virtual ~splitter_base() {;} }; #endif eclib-20250122/libsrc/eclib/sqfdiv.h000066400000000000000000000046541474421343600170510ustar00rootroot00000000000000// sqfdiv.h : declaration of class sqfdiv for managing square-free divisors ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_SQFDIV_H #define _ECLIB_SQFDIV_H 1 //flags that this file has been included #include class sqfdiv { vector* primebase; // includes all relevant primes bigint d; // product of current subset long np; // number in current subset int positive; // flag for sign long factor; // counts log_2 of saving index since initialisation vector subgp; // subgp factored out (complete) vector gens; // generators of latter long nsub, maxnsub, ngens, maxngens; // current, max number in subgp vector pivs; public: sqfdiv(const bigint& dd, int posd, vector* plist); void usediv(const bigint& e); vector getdivs() const; vector getsupp(int bothsigns=0) const; vector getsubgp() {return vector(subgp.begin(),subgp.begin()+nsub);} long getfactor() {return factor;} void display(); }; bigint sqfred(const bigint& a, const vector& plist); inline bigint sqfred(const bigint& a) { return sqfred(a,pdivs(a));} bigint sqfmul(const bigint& a, const bigint& b); bigint makenum(const vector& supp, long mask); long makeindex(const vector& supp, const bigint& n, bigint& n0); // support(n) is like pdivs(n) but includes -1 always // (except for n=0, but it should never be called with 0) vector support(const bigint& n); #endif eclib-20250122/libsrc/eclib/sub.h000066400000000000000000000071761474421343600163500ustar00rootroot00000000000000// sub.h: declaration of class subspace ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // Not to be included directly by user: use subspace.h which defines // _ECLIB_SUBSPACE_H and includes this twice // class subspace { public: // constructors subspace(int n=0) :denom(1),pivots(vec_i::iota(n)),basis(mat::identity_matrix(n)) {} subspace(const mat& b, const vec_i& p, const scalar& d) :denom(d),pivots(p),basis(b) {} subspace(const subspace& s) :denom(s.denom),pivots(s.pivots),basis(s.basis) {} // assignment void operator=(const subspace& s); // member functions & operators inline void clear() { pivots.init(); basis.init();} inline scalar den() const {return denom;} // the denominator inline vec_i pivs() const {return pivots;} // the pivot vector inline mat bas() const {return basis;} // the basis matrix // non-member (friend) functions and operators friend int dim(const subspace& s); // the dimension friend scalar denom(const subspace& s); // the denominator friend vec_i pivots(const subspace& s);// the pivot vector friend mat basis(const subspace& s) ;// the basis matrix friend subspace combine(const subspace& s1, const subspace& s2); friend mat restrict_mat(const mat& m, const subspace& s, int cr); friend subspace pcombine(const subspace& s1, const subspace& s2, const scalar& pr); friend mat prestrict(const mat& m, const subspace& s, const scalar& pr, int cr); friend int lift(const subspace& s, const scalar& pr, subspace& ans); // Implementation private: scalar denom; vec_i pivots; mat basis; }; // Declarations of nonmember, nonfriend operators and functions: mat expressvectors(const mat& m, const subspace& s); subspace kernel(const mat& m, int method=0); subspace image(const mat& m, int method=0); subspace eigenspace(const mat& m, const scalar& lambda, int method=0); subspace subeigenspace(const mat& m, const scalar& l, const subspace& s, int method=0); //The following work with subspaces "mod p" using "echmodp" from //matrix.h/cc to do gaussian elimination. The "denom" of each is 1. subspace oldpkernel(const mat& m, const scalar& pr); subspace pkernel(const mat& m, const scalar& pr); subspace pimage(const mat& m, const scalar& pr); subspace peigenspace(const mat& m, const scalar& lambda, const scalar& pr); subspace psubeigenspace(const mat& m, const scalar& l, const subspace& s, const scalar& pr); inline int dim(const subspace& s) {return s.basis.ncols();} // the dimension inline scalar denom(const subspace& s) {return s.denom;} // the denominator inline vec_i pivots(const subspace& s) {return s.pivots;} // the pivot vector inline mat basis(const subspace& s) {return s.basis;} // the basis matrix eclib-20250122/libsrc/eclib/subspace.h000066400000000000000000000036051474421343600173550ustar00rootroot00000000000000// subspace.h: manage declarations of subspace classes ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #if !defined(_ECLIB_SUBSPACE_H) #define _ECLIB_SUBSPACE_H 1 //flags that this file has been included #include "matrix.h" #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim #define scalar int #define vec vec_i #define mat mat_i #define subspace subspace_i #define svec svec_i #define smat smat_i #define smat_elim smat_i_elim #include "sub.h" #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim #define scalar long #define vec vec_l #define mat mat_l #define subspace subspace_l #define svec svec_l #define smat smat_l #define smat_elim smat_l_elim #include "sub.h" #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim #define scalar bigint #define vec vec_m #define mat mat_m #define subspace subspace_m #include "sub.h" #undef scalar #undef vec #undef mat #undef subspace #endif eclib-20250122/libsrc/eclib/svec.h000066400000000000000000000136431474421343600165130ustar00rootroot00000000000000// svec.h: declarations for sparse integer vector class svec ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // Not to be included directly by user: use svector.h which defines // _ECLIB_SVECTOR_H and includes this twice int eqmodp(const svec&, const svec&, const scalar& p); class svec { friend class smat; friend class smat_elim; protected: int d; // dimension map entries; // (i,x) in the table means v[i]=x public: // constructors svec (int dim=0) :d(dim) {;} explicit svec (const vec &); // conversion constructor // member functions & operators void clear() {entries.clear();} vec as_vec( ) const; scalar elem(int i) const; // returns value of i'th entry void set(int i, const scalar& a); // sets i'th entry to a void add(int i, const scalar& a); // adds a to i'th entry void sub(int i, const scalar& a); // subtracts a from i'th entry void add_mod_p(int i, const scalar& a, const scalar& p); // adds a to i'th entry, mod p void sub_mod_p(int i, const scalar& a, const scalar& p); // subtracts a from i'th entry, mod p svec& add_scalar_times(const svec&, const scalar&); svec& operator+= (const svec& w); svec& operator-= (const svec& w); svec& operator*= (const scalar&); svec& operator/= (const scalar&); void reduce_mod_p(const scalar& p); svec& mult_by_scalar_mod_p(const scalar&, const scalar& p); svec& add_scalar_times_mod_p(const svec&, const scalar&, const scalar& p); // Same as previous except returns two sets of indices: "ons" are // indices for which an entry is created, and "offs" are indices for // which an entry is deleted svec& add_scalar_times_mod_p(const svec&, const scalar&, std::set& ons, std::set& offs, const scalar& p); // two hand-coded special cases: svec& add_mod_p(const svec& w, const scalar& p); svec& sub_mod_p(const svec& w, const scalar& p); int size() const {return entries.size();} // functions to enable iteration over the entries without direct // access to the entries map: map::const_iterator begin() const {return entries.begin();} map::const_iterator end() const {return entries.end();} map::iterator begin() {return entries.begin();} map::iterator end() {return entries.end();} void erase(int i); // erases v[i]; error if not set int first_index() const {return entries.upper_bound(0)->first;} std::set support() const; // non-member (friend) functions and operators friend inline int dim(const svec& v) {return v.d;} // Equality mod p: friend int eqmodp(const svec&, const svec&, const scalar& p); friend ostream& operator<< (ostream&s, const svec&); friend scalar operator*(const svec&, const svec&); //dot product friend scalar operator*(const svec&, const vec&); friend scalar operator*(const vec& v, const svec& sv) {return sv*v;} friend scalar dotmodp(const svec&, const svec&, const scalar& pr); friend scalar dotmodp(const svec&, const vec&, const scalar& pr); friend scalar dotmodp(const vec& v, const svec& sv, const scalar& pr) {return dotmodp(sv,v,pr);} friend inline svec operator+(const svec& v1, const svec& v2); friend inline svec operator-(const svec& v1, const svec& v2); friend inline int operator==(const svec& v1, const svec& v2); friend inline int operator!=(const svec& v1, const svec& v2); friend int operator==(const svec& v1, const vec& v2); friend inline int operator!=(const svec& v1, const vec& v2) {return !(v1==v2);} friend inline int operator==(const vec& v1, const svec& v2) {return v2==v1;} friend inline int operator!=(const vec& v1, const svec& v2) {return v2!=v1;} friend smat transpose(const smat&); friend smat operator* ( const smat&, const smat&); friend scalar content(const svec& v); friend scalar make_primitive(svec& v); // divides by & returns content friend svec operator* ( const smat& A, const svec& v ); friend svec operator* ( const svec& v, const smat& A ); friend svec mult_mod_p( const smat& A, const svec& v, const scalar& p ); friend svec mult_mod_p( const svec& v, const smat& A, const scalar& p ); friend smat mult_mod_p ( const smat&, const smat&, const scalar&); }; // Declaration of non-friend functions inline svec operator+(const svec& v) {return v;} // unary + inline svec operator-(const svec& v) // unary - {svec ans(v); ans*=scalar(-1); return ans;} inline svec operator+(const svec& v1, const svec& v2) { if(v1.entries.size() #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim #define scalar int #define vec vec_i #define mat mat_i #define subspace subspace_i #define svec svec_i #define smat smat_i #define smat_elim smat_i_elim #include "svec.h" #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim #define scalar long #define vec vec_l #define mat mat_l #define subspace subspace_l #define svec svec_l #define smat smat_l #define smat_elim smat_l_elim #include "svec.h" #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim #define scalar bigint #define vec vec_m #define mat mat_m #define subspace subspace_m #define svec svec_m #define smat smat_m #define smat_elim smat_m_elim #include "svec.h" #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim #endif eclib-20250122/libsrc/eclib/symb.h000066400000000000000000000070201474421343600165150ustar00rootroot00000000000000// FILE SYMB.H: Declarations for M-symbols, modular symbols ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_SYMB_H #define _ECLIB_SYMB_H 1 //flags that this file has been included #include #include class symb { private: long c,d; const moddata * N; // needs to be creatable from a const thing public: symb() {c=d=0; N=0;} symb(long ic, long id, const moddata * iN) { c=ic; d=id; N=iN;} long cee() const {return c;} long dee() const {return d;} long ceered() const {return N->reduce(c);} long deered() const {return N->reduce(d);} long modulus() const {return N->modulus;} int operator==(const symb& s) const {return 0==((xmodmul(c,s.d,N->modulus)-xmodmul(s.c,d,N->modulus))%(N->modulus));} int eq(const symb& s) const {return ((c==s.c)&&(d==s.d))||((c==-s.c)&&(d==-s.d));} symb normalize() const; friend ostream& operator<< (ostream&s, const symb&); long orbitlength() const {long n=N->modulus, cr=N->reduce(c); cr=cr*cr; return n/N->gcd(cr);} }; class modsym { private: rational a,b; public: modsym() :a(0), b(0) {} modsym(const rational& ra, const rational& rb) :a(ra), b(rb) {} explicit modsym(const symb&); //conversion rational alpha() const {return a;} rational beta() const {return b;} friend ostream& operator<< (ostream& s, const modsym& m); }; #include class symblist { private: vector list; map,long> hashtable; long num,maxnum; public: symblist(long n=0); void add(const symb& s, long start=0); long index(const symb& s, long start=0) const; symb operator[](long n) const {return list[n];} symb item(long n) const; void display() const {for(long i=0; i classes ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_TEMPLATES_H #define _ECLIB_TEMPLATES_H 1 //flags that this file has been included #include #include #include #include #include #include #include #include #include #include using std::string; using std::vector; using std::cout; using std::cerr; using std::cin; using std::endl; using std::flush; using std::ios; using std::ostream; using std::istream; using std::ifstream; using std::stringstream; using std::istringstream; using std::ostringstream; using std::ofstream; using std::ios_base; using std::numeric_limits; using std::ostream_iterator; using std::complex; using std::ws; using std::skipws; using std::map; using std::unordered_map; using std::min; using std::max; using std::pair; using std::sort; using std::abs; using std::setw; template inline ostream& operator<<(ostream& os, const vector& v) { os <<"[ "; copy(v.begin(),v.end(), ostream_iterator(os, " ")); os << "]"; return os; } template inline void vec_out(ostream& os, const vector& v, unsigned int n=0) { unsigned int m=v.size(); bool trunc=0; if((n>0)&&(m>n)) {m=n; trunc=1;} os <<"[ "; copy(v.begin(),v.begin()+m, ostream_iterator(os, " ")); if(trunc) os << "..."; os << "]"; } template inline ostream& operator<<(ostream& os, const std::set& v) { os <<"{ "; copy(v.begin(),v.end(), ostream_iterator(os, " ")); os << "}"; return os; } // NB The following will only work properly, giving a result with no // repeats, if the input vectors are sorted! template vector vector_union(const vector& a, const vector& b) { vector c; set_union(a.begin(),a.end(),b.begin(),b.end(),inserter(c,c.end())); return c; } // the following returns true if the entries of a and b are equal from // index "from" to index "from+l-1": template int startswith(const vector& a, const vector& b, long l, long from=0) { return equal(a.begin()+from,a.begin()+from+l,b.begin()+from); } #endif eclib-20250122/libsrc/eclib/threadpool.h000066400000000000000000000046501474421343600177120ustar00rootroot00000000000000// FILE threadpool.h : Declaration of class threadpool ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 Marcus Mo // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // Include only if Boost installed #ifdef ECLIB_MULTITHREAD #ifndef _ECLIB_THREADPOOL_H #define _ECLIB_THREADPOOL_H // Include headers based on // available packages on system #include #include #include #include #include #include class threadpool { public: threadpool(); threadpool( unsigned int numThreads, int verbose ); ~threadpool(); void start( unsigned int numThreads, int verbose ); void close(); /** * post() * * Add a job to the job queue so that the next * idle thread in the threadpool may execute it. * Templated function must reside in header file. */ template< class Task > void post( Task &task ) { // Check start() was called if( verbose_ == -1 ) { std::cout << "Must call start() before using post(). Exiting ..." << std::endl; exit(1); } // Add reference to new task to job queue io_service_.post( boost::bind< void >( boost::ref( task ) ) ); } unsigned int getThreadCount(); unsigned int getMaxThreads(); private: unsigned int maxThreads_; unsigned int threadCount_; int verbose_; boost::asio::io_service io_service_; boost::shared_ptr< boost::asio::io_service::work > work_; boost::thread_group threads_; }; #endif // THREADPOOL_H #endif // ECLIB_MULTITHREAD eclib-20250122/libsrc/eclib/timer.h000066400000000000000000000047521474421343600166740ustar00rootroot00000000000000// timer.h: declarations of timer functions ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // Marcus Mo (timer class) // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_TIMER_H #define _ECLIB_TIMER_H 1 // Timer header files #ifdef _WIN32 #include #else #include #endif #include #include void init_time(); void start_time(); void stop_time(); void show_time(ostream& s = cout); // New class object for modularity (same code) class timer { public: timer(); explicit timer( string filename ); ~timer(); void stream( string filename = "" ); void start( string name = "default" ); void split( string name = "default" ); void stop( string name = "default" ); void stopAll(); void write( string message ); void show( int nline = 0, string name = "default", int idx1 = 0, int idx2 = -1 ); void showAll( int nline = 0 ); void clear( string name = "default" ); void clearAll(); void add( string name ); void list(); int count( string name = "default" ); double total( string name = "default" ); double average( string name = "default" ); typedef unordered_map< string, vector > timers; private: ostream* s_; ofstream file_; timers times_; double getWallTime(); template< typename T > string toString( T el ); }; #ifndef TIME_CONICS #define TIME_CONICS 0 #endif void init_conic_timer(); void start_conic_timer(); void stop_conic_timer(); void show_conic_timer(ostream& s = cout); #endif eclib-20250122/libsrc/eclib/tlss.h000066400000000000000000000045531474421343600165400ustar00rootroot00000000000000// tlss.h: definition of class TLSS for sieving E(Q)/pE(Q) at one prime q ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // NB: TLSS = Tate--Lichtenbaum--Samir-Siksek: we use a simple // discrete log a la Siksek when the p-torsion in E(F_q) is cyclic, // else use the Tate-Lichtenbaum pairing // allow for multiple includes #ifndef _ECLIB_TLSS_ #define _ECLIB_TLSS_ #include #include class TLSS { private: int p; // the prime to saturate at. int rank; // p-rank of E mod q (0,1,2) bigint q; // the modulus bigint q1p; // = (q-1)/p; galois_field Fq; // F_q vector mu_p; // all p'th roots mod q curvemodqbasis Emodq; // E over F_q (including its structure) vector Pi; // basis for p-torsion of E(F_q) (length = rank = 0,1,2) vector TLpolys; // in the function field Fq(E) int verbose; void init_tlpolys(void); public: TLSS(void) :Emodq() {;} void assign(const curvemodqbasis& E) {Emodq=E; Fq=get_field(Emodq); q=Fq.characteristic(); } void init(int pp, int verb=0); void init(int pp, const ZPoly& pdivpol, int verb=0); ~TLSS() {; } // apply map to P, result in (ntp*)[0..p-1]: vector map1point(const Point& P) const; // apply map to all P in Plist, result is a (ntp*#Plist) matrix: mat_l map_points(const vector& Plist) const; // give the current p-rank int get_rank() const {return rank;} }; #endif // #define _TLSS_ eclib-20250122/libsrc/eclib/transform.h000066400000000000000000000044671474421343600175720ustar00rootroot00000000000000// transform.h: declaration of quartic transformation functions ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // // Notation: g(x,z) is replaced by g(m11*x+m12*z,m21*x+m22*z)/m00^2 // #ifndef _ECLIB_TRANSFORM_H #define _ECLIB_TRANSFORM_H 1 //flags that this file has been included #include void apply_transform(bigint& a, bigint& b, bigint& c, bigint& d, bigint& e, const unimod& m); void apply_transform(bigint& a, bigint& b, bigint& c, bigint& d, bigint& e, const scaled_unimod& m); int check_transform(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const bigint& e, const unimod& m, const bigint& xa, const bigint& xb, const bigint& xc, const bigint& xd, const bigint& xe); int check_transform(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const bigint& e, const scaled_unimod& m, const bigint& xa, const bigint& xb, const bigint& xc, const bigint& xd, const bigint& xe); void xshift(const bigint& alpha, const bigint& a, bigint& b, bigint& c, bigint& d, bigint& e, unimod& m); void zshift(const bigint& gamma, bigint& a, bigint& b, bigint& c, bigint& d, const bigint& e, unimod& m); void m_invert(bigint& a, bigint& b, bigint& c, bigint& d, bigint& e, unimod& m); void m_invert(bigint& a, bigint& b, bigint& c, bigint& d, bigint& e, scaled_unimod& m); #endif eclib-20250122/libsrc/eclib/twoadic.h000066400000000000000000000050541474421343600172020ustar00rootroot00000000000000// twoadic.h: declarations of functions for existence of 2-adic points ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_TWOADIC_H #define _ECLIB_TWOADIC_H 1 //flags that this file has been included #include // Case 1 is A=0, B=0, x=2 (mod 4) // Case 2 is A=1, B=2, x=1 (mod 4) // Here A = -27*I, B = -27*J // The following macros are due to Michael Stoll: #define HIGH 0x7FFF /* 2-adic valuation function */ #define val1(a,s) (((a)&(0x1<<(s))) ? (s) : (s)+1) #define val2(a,s) (((a)&(0x3<<(s))) ? val1(a,s) : val1(a,(s)+2)) #define val4(a,s) (((a)&(0xF<<(s))) ? val2(a,s) : val2(a,(s)+4)) #define val8(a,s) (((a)&(0xFF<<(s))) ? val4(a,s) : val4(a,(s)+8)) #define val16(a) (((a)&0xFFFF) ? val8(a,0) : val8(a,16)) inline long val(long a){long r = (a) ? val16(a) : HIGH; return r;} inline long val(bigint a){long r = (a==0) ? HIGH: val(2,a); return r;} // try1(poly), with poly a deg 3 polynomial in x, determines if // there is a 2-adic integer a such that poly(a) is a square // in Q_2. Returns 1 if successful, 0 otherwise. // These were originally used to determine the index in the ambiguous // cases, but were much slower than the non-recursive functions, // called case1() and case2() // In all cases the return value is 0 if the index is 1 // and 1 if the index is 2 // so add 1 to get the index, which is also the "number of I,J pairs" long try1(long poly[4]); long try1(bigint poly[4]); long case1(long a, long b); // A=4a, B=4b long case2(long a, long b); // A=4a+1, B=4b+2 long case1(bigint a, bigint b); // A=4a, B=4b long case2(bigint a, bigint b); // A=4a+1, B=4b+2 #endif eclib-20250122/libsrc/eclib/types.h000066400000000000000000000036121474421343600167120ustar00rootroot00000000000000// types.h: typedefs for scalar, vector, matrix types ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #if !defined(_ECLIB_TYPES_H) #define _ECLIB_TYPES_H 1 //flags that this file has been included #include // SCALAR_OPTION may be set to 1 or 2 or 3 by user #if (SCALAR_OPTION==1) // scalar is int typedef int scalar; typedef vec_i vec; typedef mat_i mat; typedef subspace_i subspace; typedef ssubspace_i ssubspace; typedef svec_i svec; typedef smat_i smat; typedef smat_i_elim smat_elim; #else #if (SCALAR_OPTION==2) // scalar is long typedef long scalar; typedef vec_l vec; typedef mat_l mat; typedef subspace_l subspace; typedef ssubspace_l ssubspace; typedef svec_l svec; typedef smat_l smat; typedef smat_l_elim smat_elim; #else #if (SCALAR_OPTION==3) // scalar is bigint typedef long scalar; typedef vec_l vec; typedef mat_l mat; typedef subspace_l subspace; typedef ssubspace_l ssubspace; typedef svec_l svec; typedef smat_l smat; typedef smat_l_elim smat_elim; #endif #endif #endif #endif eclib-20250122/libsrc/eclib/unimod.h000066400000000000000000000120341474421343600170370ustar00rootroot00000000000000// unimod.h: declarations of classes unimod and scaled_unimod ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_UNIMOD_H #define _ECLIB_UNIMOD_H 1 //flags that this file has been included #include #include class unimod { friend class quadratic; friend class cubic; friend class scaled_unimod; protected: bigint m11, m12, m21, m22; public: unimod() :m11(1), m12(0), m21(0), m22(1) {;} unimod(const bigint& a11, const bigint& a12, const bigint& a21, const bigint& a22) :m11(a11), m12(a12), m21(a21), m22(a22) {;} unimod(const unimod& m) :m11(m.m11), m12(m.m12), m21(m.m21), m22(m.m22) {;} void reset() {m11=1; m12=0; m21=0; m22=1;} void set(const bigint& a11, const bigint& a12, const bigint& a21, const bigint& a22) {m11=a11; m12=a12; m21=a21; m22=a22;} void operator=(const unimod& m) {m11=m.m11; m12=m.m12; m21=m.m21; m22=m.m22;} bigint operator()(int i, int j) const { if(i==1) {if(j==1) return m11; else return m12;} else {if(j==1) return m21; else return m22;} } void operator*=(const unimod& a) { set(m11*a.m11 + m12*a.m21, m11*a.m12 + m12*a.m22, m21*a.m11 + m22*a.m21, m21*a.m12 + m22*a.m22); } friend unimod operator*(const unimod& a, const unimod& b); bigint scale_factor() const {bigint ans; ans=1; return ans;} bigint det() const {return (m11*m22-m12*m21);} void x_shift(const bigint& a) {m12 += (a*m11); m22 += (a*m21);} void y_shift(const bigint& a) {m11 += (a*m12); m21 += (a*m22);} void negate() {m11*=-1; m12*=-1;m21*=-1; m22*=-1;} void seminegate() {m12*=-1;m22*=-1;} unimod inverse() // return inverse matrix { unimod ans(m22,-m12,-m21,m11); if (det()<0) {negate();} return ans; } void invert() // multiples by [0,1; -1,0] { bigint temp = -m11; m11 = m12; m12 = temp; temp = -m21; m21 = m22; m22 = temp; } void output(ostream& os=cout) const { os<<"["<& arr); vec(const vec&); // copy constructor // member functions & operators void init(long n=0); // (re)-initializes vec& operator=(const vec&); // assignment scalar& operator[](long i); // the i'th component scalar operator[](long i) const; // the i'th component vec& operator+=(const vec&); void add_row(const mat&m, int i); void addmodp(const vec&, const scalar&); vec& operator-=(const vec&); void sub_row(const mat&m, int i); vec& operator*=(const scalar&); vec& operator/=(const scalar&); vec slice(long i, long j=-1) const; // returns subvec with indices i..j of 1..i if j=-1 vec operator[](const vec_i&) const; // subscript composition vec operator[](const vec_l&) const; // subscript composition void set(long i, const scalar& x); // sets v[i]=x void add(long i, const scalar& x); // v[i]+=x void add_modp(long i, const scalar& x, const scalar& p); // v[i]+=x mod p void red_modp(const scalar& p); // reduce mod p in place scalar sub(long i) const; // same as v[i] (no ref) const vector get_entries()const {return entries;} static vec iota(long n); // (1,2,...,n) // non-member (friend) functions and operators friend long dim(const vec&); // the dimension friend scalar operator*(const vec&, const vec&); // dot product friend scalar operator*(const svec&, const vec&); friend scalar content(const vec&); friend scalar maxabs(const vec&); friend vec operator*(const mat& m, const vec& v); friend int operator==(const vec&, const vec&); friend int operator!=(const vec&, const vec&); friend int trivial(const vec&); // is v all 0 friend int member(const scalar& a, const vec& v);//tests if a=v[i] for some i friend vec reverse(const vec& order); // add/sub row i of mat to v (implemented in mat.cc) friend void add_row_to_vec(vec& v, const mat& m, long i); friend void sub_row_to_vec(vec& v, const mat& m, long i); friend ostream& operator<< (ostream&s, const vec&); friend istream& operator>> (istream&s, vec&); friend void swapvec(vec& v, vec& w); friend mat restrict_mat(const mat& m, const subspace& s, int cr); friend mat prestrict(const mat& m, const subspace& s, const scalar& pr, int cr); friend scalar dotmodp(const vec& v1, const vec& v2, const scalar& pr); // Implementation private: vector entries; }; // Declaration of non-member, non-friend functions scalar content(const vec&); vec operator+(const vec&); // unary vec operator-(const vec&); // unary vec operator+(const vec&, const vec&); vec addmodp(const vec&, const vec&, const scalar&); vec operator-(const vec&, const vec&); inline vec operator*(const scalar&, const vec&); // componentwise vec operator/(const vec&, const scalar&); // componentwise void makeprimitive(vec& v); void elim(const vec& a, vec& b, long pos); void elim1(const vec& a, vec& b, long pos); void elim2(const vec& a, vec& b, long pos, const scalar& lastpivot); vec express(const vec& v, const vec& v1, const vec& v2); int lift(const vec& v, const scalar& pr, vec& ans); //lifts a mod-p vector to a rational //and scales to a primitive vec in Z. Returns success flag // inline function definitions inline long dim(const vec& v) {return v.entries.size();} inline int operator!=(const vec& v, const vec& w) { return !(v==w);} inline vec operator+(const vec& v) { return v;} inline vec operator-(const vec& v) { return scalar(-1)*v;} inline vec operator+(const vec& v1, const vec& v2) { vec w(v1); w+=v2; return w;} inline vec addmodp(const vec& v1, const vec& v2, const scalar& pr) { vec w(v1); w.addmodp(v2,pr); return w;} inline vec reduce_modp(const vec& v, const scalar& p) { vec w(v); w.red_modp(p); return w; } inline vec operator-(const vec& v1, const vec& v2) { vec w(v1); w-=v2; return w;} inline vec operator*(const scalar& scal, const vec& v) { vec w(v); w*=scal; return w;} inline vec operator/(const vec& v, const scalar& scal) { vec w(v); w/=scal; return w;} inline void makeprimitive(vec& v) { scalar g=content(v); if (g>1) v/=g;} inline void elim(const vec& a, vec& b, long pos) { (b*=a[pos])-=(b[pos]*a);} inline void elim1(const vec& a, vec& b, long pos) { (b*=a[pos])-=(b[pos]*a); makeprimitive(b);} inline void elim2(const vec& a, vec& b, long pos, const scalar& lastpivot) { ((b*=a[pos])-=(b[pos]*a))/=lastpivot;} eclib-20250122/libsrc/eclib/vector.h000066400000000000000000000046151474421343600170540ustar00rootroot00000000000000// vector.h: manage declarations of integer vector classes ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #if !defined(_ECLIB_VECTOR_H) #define _ECLIB_VECTOR_H 1 //flags that this file has been included #include class vec_i; class vec_l; class vec_m; class mat_i; class mat_l; class mat_m; class svec_i; class svec_l; class svec_m; class smat_i; class smat_l; class smat_m; class smat_i_elim; class smat_l_elim; class smat_m_elim; class subspace_i; class subspace_l; class subspace_m; #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim #define scalar int #define vec vec_i #define mat mat_i #define subspace subspace_i #define svec svec_i #define smat smat_i #define smat_elim smat_i_elim #include "vec.h" #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim #define scalar long #define vec vec_l #define mat mat_l #define subspace subspace_l #define svec svec_l #define smat smat_l #define smat_elim smat_l_elim #include "vec.h" #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim #define scalar bigint #define vec vec_m #define mat mat_m #define subspace subspace_m #define svec svec_m #define smat smat_m #define smat_elim smat_m_elim #include "vec.h" #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim vec_m to_vec_m(const vec_i& v); vec_m to_vec_m(const vec_l& v); vec_i to_vec_i(const vec_m& v); vec_l to_vec_l(const vec_m& v); #endif eclib-20250122/libsrc/eclib/version.h000066400000000000000000000032741474421343600172370ustar00rootroot00000000000000// version.h: declaration of functions show_version(), eclib_version() ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // #if !defined(_ECLIB_VERSION_H) #define _ECLIB_VERSION_H 1 //flags that this file has been included #include #include // Return the current eclib version as a string, e.g. 'v20210317' string eclib_version(); // Return the current eclib version as a triple [y,m,d], e.g. string, e.g. [2021,3,17] vector eclib_date(); // Display the current eclib version and compilation information void show_version(ostream& os = cout); // compare current eclib version date with a triple (y,m,d), returning // +1 if the current version is later (more recent) than (y,m,d), 0 if // equal and -1 if earlier (older). int compare_eclib_version(int y, int m, int d); #endif eclib-20250122/libsrc/eclib/xmod.h000066400000000000000000000213511474421343600165150ustar00rootroot00000000000000// xmod.h: declarations of basic modular arithmetic functions ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // All are inline functions, there's no .cc file #ifndef _ECLIB_XMOD_H #define _ECLIB_XMOD_H 1 #include // undefine this to use int/long/longlong arithmetic only //#define USE_DMOD // We'll define BIGPRIME to be one of the following, the largest prime // possible for the given strategy without overlow. // We allow all residues a with |a|>1; // = 536870894; const int TWO_BIGPRIME = 2147483578; // 2*BIGPRIME const int64_t INV_BIGPRIME = 4294967436LL; // = 2^32+140 = [2^62/p] inline bigint xmod(const bigint& a, const bigint& m) {return a%m;} inline int xmod(int a, int m) {return a%m;} inline long xmod(long a, long m) {return a%m;} inline int xmod(long a, int m) { return (int)(a%(long)m);} inline long xmod(int a, long m) { return (long)((long)(a)%m);} inline int xmod0(int a) {return a%BIGPRIME;} inline int mod0(int a) {a%=BIGPRIME; if(a>0) while(a>HALF_BIGPRIME) a-=BIGPRIME; else while(-a>HALF_BIGPRIME) a+=BIGPRIME; return a; } inline long xmod0(long a) {return (a%(long)BIGPRIME);} inline long mod0(long a) {return mod0((int)(a%BIGPRIME));} inline int xmodmul0(int a, int b) { return ((int)( ( (int64_t)(a)*(int64_t)(b) ) % (int64_t)(BIGPRIME) ))%BIGPRIME; } inline long xmodmul0(long a, long b) { return (long)(((int)( ( (int64_t)(a)*(int64_t)(b) ) % (int64_t)(BIGPRIME) ))%BIGPRIME); } // This special version only works modulo BIGPRIME, not a general modulus: // It should work faster (no divisions)! Thanks to David Harvey. inline int xmm0(int a, int b) { if (a==1) return b; if (a==-1) return -b; if (b==1) return a; if (b==-1) return -a; // check: // int r2 = (a*(int64_t)b) % BIGPRIME; if(a<0) a+=BIGPRIME; if(b<0) b+=BIGPRIME; int64_t ab = a*(int64_t)b; int64_t r = ab-((INV_BIGPRIME*(ab>>30))>>32)*BIGPRIME; r -= ( ((r>=TWO_BIGPRIME)?BIGPRIME:0) + ((r>=BIGPRIME)?BIGPRIME:0) ); if (r>HALF_BIGPRIME) r-=BIGPRIME; // check: // if (r!=r2) // { // cout << "Problem with "<0)&&(a<20)) return table_invs[a]; long ma=-a; if ((ma>0)&&(ma<20)) return -table_invs[ma]; // if a = BIGPRIME-ma with ma small, use look-up table: ma+=BIGPRIME; // = BIGPRIME-a if ((ma>0)&&(ma<20)) return -table_invs[ma]; // if a = -BIGPRIME+ma with ma small, use look-up table: ma=a-BIGPRIME; if ((ma>0)&&(ma<20)) return table_invs[ma]; // General code, use Euclidean Algorithm: long x=0,oldx=1,b=BIGPRIME; while (b!=0) { long q = a/b; long c = a - q*b; a = b; b = c; long newx = oldx - q*x; oldx = x; x = newx; } if (a==1) {return oldx;} if (a==-1) {return -oldx;} cout << "invmod0 called with " << a << " -- not invertible!\n"; return 0; } inline int invmod0(int aa) { int a=aa; // if |a| is small, use look-up table: if ((a>0)&&(a<20)) return table_invs[a]; int ma=-a; if ((ma>0)&&(ma<20)) return -table_invs[ma]; // if a = BIGPRIME-ma with ma small, use look-up table: ma+=BIGPRIME; // = BIGPRIME-a if ((ma>0)&&(ma<20)) return -table_invs[ma]; // if a = -BIGPRIME+ma with ma small, use look-up table: ma=a-BIGPRIME; if ((ma>0)&&(ma<20)) return table_invs[ma]; // General code, use Euclidean Algorithm: int x=0,oldx=1,b=BIGPRIME; while (b!=0) { int q = a/b; int c = a - q*b; a = b; b = c; int newx = oldx - q*x; oldx = x; x = newx; } if (a==1) {return oldx;} if (a==-1) {return -oldx;} cout << "invmod0 called with " << a << " -- not invertible!\n"; return 0; } #endif // ifndef _XMOD_H eclib-20250122/libsrc/eclib/xsplit.h000066400000000000000000000073321474421343600170740ustar00rootroot00000000000000// xsplit.h: Declaration of class form_finder ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // Marcus Mo (parallel code) // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #if !defined(_ECLIB_XSPLIT_H) #define _ECLIB_XSPLIT_H 1 //flags that this file has been included // Disable multithreading // #undef ECLIB_MULTITHREAD #ifdef ECLIB_MULTITHREAD #include #endif #include #include #ifdef ECLIB_MULTITHREAD #include #endif // flags set on construction: // dual: use dual bases throughout (the usual case) // plusflag: if 1 then targetdim=1 and conjmat not used // if 0 then targetdim=2 and conjmat is used // bigmats: if 1 then uses opmat() to get operators on ambient space, // does its own restriction to the current subspace; if 0 then uses // opmat_restricted() to get operators restricted to current space // directly -- ONLY possible when dual=1 class form_finder { public: form_finder(splitter_base* hh, int plus, int maxd, int mind=0, int dualflag=1, int bigmatsflag=0, int v=0); ~form_finder(void); void find(); void find(ff_data &data); void recover(vector< vector > eigs); void splitoff(const vector& eigs); void store(vec bp, vec bm, vector eigs); vec getbasis( const ff_data &data ) const {return data.bplus_;} vec getbasisplus( const ff_data &data ) const {return data.bplus_;} vec getbasisminus( const ff_data &data ) const {return data.bminus_;} friend class ff_data; protected: splitter_base* h; int plusflag, dual, bigmats, verbose, targetdim; int gnfcount; // Global newform counter long maxdepth, mindepth, dimen; SCALAR denom1; vector< vector > gaplist; // Vector to hold all (sub)eiglists vector gbplus, gbminus; // Vector to hold all bplus/bminus ff_data* root; // Always points to root data node void make_opmat(long i, ff_data &data); // Puts it in the_opmat void make_submat(ff_data &data); smat make_nested_submat(long ip, ff_data &data); void go_down(ff_data &data, long eig, int last=0); void go_up( ff_data &data ); void make_basis(ff_data &data); vec make_basis1(ff_data &data); // current space has dim. 1 vec make_basis2(ff_data &data, const vec& v); // current space has dim. >1 and // relative basis vector v #ifdef ECLIB_MULTITHREAD threadpool pool; // Job queue boost::mutex store_lock; // Lock for store() function #endif }; vec getbasis1(const ssubspace* s); // Assuming dim(s)=1, get basis vector vec lift(const vec& v); // Lift basis vector #endif eclib-20250122/libsrc/eclib/xsplit_data.h000066400000000000000000000141051474421343600200610ustar00rootroot00000000000000// FILE xsplit_data.h : Declaration of class ff_data ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 Marcus Mo // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #ifndef _ECLIB_XSPLIT_DATA_H #define _ECLIB_XSPLIT_DATA_H // Include headers #include #include #include #include // Disable multithreading // #undef ECLIB_MULTITHREAD #ifdef ECLIB_MULTITHREAD #include #endif // Header files for macros and custom data structures #include // Forward declaration of classes ... prevents circular includes. // form_finder only required as pointer class form_finder; // Ennumerate node and child flags, exposed to global scope for outside access enum nodestatus { INTERNAL, ALL_OLD, FOUND_NEW, MAX_DEPTH }; enum childstatus { NOT_COMPLETE, COMPLETE, DESTROYED }; /** * ff_data (form_finder_data) * * Class name follows convention of that contained in xsplit.cc for ease of use. */ class ff_data { public: // Constructor, destructor. explicit ff_data( form_finder* ff ); ~ff_data(); #ifdef ECLIB_MULTITHREAD void operator()(); // Executed upon submission to job queue #endif // Getters (to maintain consistency) nodestatus status(); // Return status of current node ssubspace* abs_space(); // Return parent absolute subspace ssubspace* rel_space(); // Return parent relative subspace long depth(); // Return current depth long subdim(); // Return subdimension long eig(); // Return associated eigenvalue vector< long > eiglist(); // Return sequence of eigenvalues ff_data* child( long eig ); // Return pointer to child int numCompleteChildren(); // Return number of complete children bool complete(); // Return true if all children complete // Modifiers (available if needed i.e. not a friend class) void setStatus( nodestatus s ); // Store status of current node void increaseDepth( long delta = 1 ); // Increase current depth void decreaseDepth( long delta = 1 ); // Decrease current depth void increaseSubmatUsage(); // Locked counter incrementer void storeBplus( vec bp ); // Store vector bplus void storeBminus( vec bm ); // Store vector bminus void addChild( long eig, ff_data &child ); // Store new child of current node void eraseChild( long eig ); // Destroy child given eigenvalue void eraseChild( int idx ); // Destroy child given index void setParent( ff_data *parent ); // Store parent node pointer void setEigenvalue( long eig ); // Store eigenvalue void setChildren( vector eigs ); // Stores number of children // and eigrange void childStatus( long eig, childstatus flag ); // Sets completed children void eraseChildren(); // Destroys all children recursively // Make form_finder class a friend to gain access to protected/private methods friend class form_finder; private: form_finder* ff_; // Back-pointer to form_finder class // Allows access to form_finder methods nodestatus status_; // Status of current node long depth_; // Indicator of current depth long subdim_; // Dimension of current subspace long eigenvalue_; // Corresponding eigenvalue vector< long > eigrange_; // List of all of all eigenvalues at this depth (used by map) vector< long > eiglist_; // Sequence of eigenvalues leading to current vec bplus_, bminus_; ssubspace* abs_space_; // Current absolute subspace (dynamically created) ssubspace* rel_space_; // Current relative subspace (dynamically created) smat conjmat_; // Used only when plus==0 and bigmats==1 smat the_opmat_; smat submat_; ff_data* parent_; // Pointer to parent data node vector children_; // Pointers to corresponding data nodes ff_data* child_; // Pointer to favoured child int numChildren_; // Number of children vector completedChildren_; // Flags for child completion int submatUsage_; // Counter for submat #ifdef ECLIB_MULTITHREAD boost::mutex childComplete_lock_; // Lock for completed children boost::mutex submat_lock_; // Lock for submat usage boost::mutex go_up_lock_; // Lock for go_up() method #endif // Helper methods int map( long eig ); // Map eigenvalue to index }; #endif // end of XSPLIT_DATA.H eclib-20250122/libsrc/egr.cc000066400000000000000000000525601474421343600154110ustar00rootroot00000000000000// egr.cc: implementation of functions for reduction of points & component groups ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include typedef mat_l mat; typedef long scalar; #include #include //#define DEBUG_EGR //#define DEBUG_EGR_EXTRA // Returns [m] for cyclic of order m, [2,2] for 2*2 (type I*m, m even) vector ComponentGroups::ComponentGroup(const bigint& p) const { vector ans(1); if(p==0) ans[0]=conncomp; // 1 or 2 else { ans[0]=1; auto ri = reduct_array.find(p); if(ri==reduct_array.end()) return ans; // p has good reduction ans[0] = (ri->second).c_p; // usual case: cyclic of order cp int code=(ri->second).Kcode.code; if((code%10==1)&&even((code-1)/10)) // Type I*m, m even: [2,2] {ans[0]=2; ans.push_back(2);} } return ans; } // Returns 1 iff P and Q have same image in the component group at p: // int ComponentGroups::InSameComponent(const Point& P, const Point& Q, const bigint& p) const { if(P==Q) return 1; return (P-Q).has_good_reduction(p); } // For reduction type Im, multiplicative reduction where component // group is cyclic of order m, using Tate curve formula from Silverman // Returns a such that P mod pr maps to +a or -a mod m in the // component group long ComponentGroups::ImageInComponentGroup_Im_pm(const Point&P, const bigint& p, int m) const { #ifdef DEBUG_EGR cout<<"In ImageInComponentGroup_Im_pm() with point " <

0 such that j*P has good reduction at p; the // component group order is given so we only test j dividing this // // Since ComponentGroups are small we use nothing fancy here... int ComponentGroups::OrderInComponentGroup(const Point& P, const bigint& p, vector grp) { #ifdef DEBUG_EGR cout<<"In OrderInComponentGroup() with point " <

& Plist, const bigint& p) { int j,k,m,n,n0,n1,npts=Plist.size(); #ifdef DEBUG_EGR cout<<"in gr1prime with p="< CG = ComponentGroup(p); long CGexpo=CG[0]; long CGOrder=CGexpo; if(CG.size()>1) CGOrder*=CG[1]; // =4 #ifdef DEBUG_EGR cout<<"Component group structure = "<1) { #ifdef DEBUG_EGR cout<<"Non-cyclic component group "<0) // Make this the first point in list { Plist[k]=Plist[0]; Plist[0]=Pk; Pk=Plist[k]; } logm+=1; m*=2; break; } // end of case 0 case 1: // one generator so far: do we have a second generator? { if (InSameComponent(Pk,Plist[0],p)) // no { Plist[k]=Pk-Plist[0]; } else // yes { if(k>1) // Make this the second point in list { Plist[k]=Plist[1]; Plist[1]=Pk; Pk=Plist[k]; } Third = Plist[0]+Plist[1]; logm+=1; m*=2; } break; } // end of case 1 case 2: // we already have 2 generators { if (InSameComponent(Pk,Plist[0],p)) { Plist[k]=Pk-Plist[0]; } else if (InSameComponent(Pk,Plist[1],p)) { Plist[k]=Pk-Plist[1]; } else { if (InSameComponent(Pk,Third,p)) { Plist[k]=Pk-Third; } else { cerr<<"Problem in non-cyclic component group case!"<0) Plist[0]=2*Plist[0]; if(logm>1) Plist[1]=2*Plist[1]; return m; } // end of cyclic switch #ifdef DEBUG_EGR cout<<"Cyclic component group of order "<=n1 for convenience if(n1>n0) { #ifdef DEBUG_EGR cout<<" swapping "<n0: we gain something { long a,b,g=gcd(n0,n1); // Now find u (coprime to g) s.t. (n1/g)P1 == u* (n0/g)P0 Point Q0=(n0/g)*P0; Point Q=Q0; // (P0.getcurve()); Point Q1=(n1/g)*P1; long u=1; //0; #ifdef DEBUG_EGR cout<<"Looking for u"<1 || (!InSameComponent(Q,Q1,p))) {u++; Q=Q+Q0;} #ifdef DEBUG_EGR cout<<" u="<& Plist, int real_too) { static const bigint zero(0); if(Plist.size()==0) return 1; vector plist = the_bad_primes; if(real_too && (conncomp==2)) plist.push_back(zero); #ifdef DEBUG_EGR cout<<"Using primes "< moduli, const mat& image); //#undef DEBUG_EGR //#define DEBUG_EGR bigint egr_index(const vector& Plist, int real_too) { static const bigint zero(0), one(1); if(Plist.size()==0) return one;; // Compute minimal model and map points to it if necessary #ifdef DEBUG_EGR cout<<"Plist = "< Plist_min = Plist; if (!is_min) std::transform(Plist.begin(), Plist.end(), Plist_min.begin(), [&Emin, u, r, s, t] ( const Point& P ) {return transform(P, &Emin, u, r, s, t);}); // Construct the ComponentGroups class from the minimal model ComponentGroups CGS(Emin); vector plist = getbad_primes(CGS); if(real_too && (getconncomp(CGS)==2)) plist.push_back(zero); #ifdef DEBUG_EGR cout<<"Using primes "< > > imagematrix; vector moduli; int n=0; // Loop through bad primes (possibly including infinity), computing // the image in the local component group for( const auto& p : plist) { #ifdef DEBUG_EGR cout<<"p = "< > im=MapPointsToComponentGroup(CGS,Plist_min,p); #ifdef DEBUG_EGR cout<<"image = "; for(unsigned int j=0; j CG=CGS.ComponentGroup(p); for(unsigned int ni=0; ni PointReps; // the three nonzero images: vector > ims(3); ims[0]=vector(2); ims[0][0]=1; ims[0][1]=0; ims[1]=vector(2); ims[1][0]=0; ims[1][1]=1; ims[2]=vector(2); ims[2][0]=1; ims[2][1]=1; for (int k=0; k 10*m // I*m -> 10*m+1 // I, II, III, IV -> 1, 2, 3, 4 // I*, II*. III*, IV* -> 5, 6, 7, 8 // //#define DEBUG_INDEX bigint comp_map_image(const vector moduli, const mat& image) { bigint ans; ans=1; mat m=image; #ifdef DEBUG_INDEX cout<<"In comp_map_image, m="<0, z-w2/2 is real // and 0\le z-w2/2\le w1. // Here, [w1,w2] is the standard period lattice basis // c.f. Cohen page 399 //#define DEBUG_ELOG bigcomplex ellpointtoz(const Curvedata& E, const Cperiods& per, const bigfloat& x, const bigfloat& y) { bigint za1,za2,za3,za4,za6; E.getai(za1,za2,za3,za4,za6); bigfloat ra1=I2bigfloat(za1); bigfloat ra2=I2bigfloat(za2); bigfloat ra3=I2bigfloat(za3); bigfloat xP(x), yP(y); int posdisc = (sign(getdiscr(E))>0); bigcomplex e1,e2,e3; getei(E,e1,e2,e3); if (posdisc) reorder1(e1,e2,e3); else reorder2(e1,e2,e3); bigfloat re1=real(e1); bigcomplex w1,w2; per.getwRI(w1,w2); #ifdef DEBUG_ELOG cout<<"w1 = "< ans; ans.push_back(cx); ans.push_back(cy); return ans; } // Second function, expects to return a rational point. // User supplies a denominator for the point; if it doesn't work, the // Point returned is 0 on the curve Point ellztopoint(Curvedata& E, const Cperiods& per, const bigcomplex& z, const bigint& den) { if(is_complex_zero(z)) {return Point(E);} #ifdef DEBUG_EZP cout<<"In ellztopoint() with z = "< CP = ellztopoint(E,per,z); Point P(E); bigcomplex cx=CP[0]; bigint nx,ny,dx,dy; boundedratapprox(real(cx),nx,dx,den); #ifdef DEBUG_EZP cout<<"Rounded x = "< Plist = points_from_x(E, xP); #ifdef DEBUG_EZP cout<<"Candidates = "< 0) { P = Plist[0]; if (Plist.size()==2) // check we don't need -P instead { bigfloat wR = per.get_real_period().real(); bigfloat zPreal = elliptic_logarithm(E, per, P).real(); bigfloat d1 = (zPreal-z.real())/wR; bigfloat d2 = (-zPreal-z.real())/wR; d1 = abs(d1-round(d1)); d2 = abs(d2-round(d2)); #ifdef DEBUG_EZP cout << "ellztopoint finds two rational points from\nz = "<< z< division_points_by2(Curvedata& E, const Point& P) { #ifdef DEBUG_DIVBY2 cout<<"Trying to divide P="< q = {xPd, -4*xPn, -(b4*xPd+b2*xPn), -2*(b6*xPd+b4*xPn), -(b8*xPd+b6*xPn)}; #ifdef DEBUG_DIVBY2 cout<<"Looking for rational roots of "< xans = roots(q); // q.rational_roots(); #ifdef DEBUG_DIVBY2 cout<<"Possible x-coordinates:"< ans; ans.reserve(4); // will be truncated later for( const auto & x : xans) { vector x_points = points_from_x(E,x); std::copy_if(x_points.begin(), x_points.end(), std::back_inserter(ans), [P] (const Point& Q) {return 2*Q==P;}); } return ans; } //#define DEBUG_DIVPT // Returns a (possibly empty) vector of solutions to m*Q=P // With the MPFP option we set the bit precision to a high enough // value. otherwise we cannot: this method will not work at all well // for large examples unless MPFP is used. vector division_points(Curvedata& E, const Point& P, int m, int only_one) { if(m==2) { return division_points_by2(E,P); } #ifdef MPFP // Multi-Precision Floating Point int zero_flag = P.is_zero(); long original_prec, new_prec; if (!zero_flag) { bigint den = P.getZ(); long nbits = I2long(Iceil(log(I2bigfloat(den))/log(to_bigfloat(2.0)))); #ifdef DEBUG_DIVPT cout<<"den= "< ans = division_points(E,cp,P,m, only_one); #ifdef MPFP if (!zero_flag) { set_bit_precision(original_prec); #ifdef DEBUG_DIVPT cout<<"resetting bit precision back to "< division_points(Curvedata& E, const Cperiods& per, const Point& P, int m, int only_one) { #ifdef DEBUG_DIVPT cout<<"division_points("<<(Curve)E<<","< ans; if(m==0) { cout<<"division_points() called with m=0!"<0); int k, egg; Point Q(E); bigcomplex z(to_bigfloat(0)), w; bigint den(1); int zero_flag = P.is_zero(); if(zero_flag) { if(even(m)) ans=two_torsion(E); // computed algebraically else ans.push_back(P); // (more robust) } else { z = elliptic_logarithm(E,per2,P); den = P.getZ(); } if (only_one and ans.size()>0) { return ans; } #ifdef DEBUG_DIVPT cout<<"posdisc= "< Qlist = division_points(E, P, m, 1); if (Qlist.size() == 0) { return 0; } else { Q = Qlist[0]; return 1; } } // Returns a vector of solutions to m*Q=0 (including Q=0) // First version will compute the Cperiods itself, so best to use the // second one if more than one call is to be made for the same curve vector torsion_points(Curvedata& E,int m) { Cperiods cp(E); return torsion_points(E,cp,m); } vector torsion_points(Curvedata& E, const Cperiods& per, int m) { Point P(E); return division_points(E,per,P,m); } void boundedratapprox(bigfloat x, bigint& a, bigint& b, const bigint& maxden) { #ifdef DEBUG_EZP cout<<"bounded ratapprox of "< eps ) { c = Iround( xx ); rc=I2bigfloat(c); x2 = x0 + c*x1; x0 = x1; x1 = x2; y2 = y0 + c*y1; y0 = y1; y1 = y2; diff = abs( x - I2bigfloat(x2)/I2bigfloat(y2) ); // cout<<"x2 = "<= 0; i--) result = result*value + PolyCoeff(f,i); return result; } gf_element ffmodq::evaluate(const pointmodq& P) const { // cout<<"In ffmodq::operator() with this = "<<(*this)<<", P="<=3 ffmodq fT = weil_pol(T, m); // cout<<"T = "<>n>>i>>c6; if(n!=0) fixc6table[pair(n,i)] = c6; } datafile.close(); datafile.open("fixc4.data"); n=1; while(n) { datafile>>n>>i>>c4; if(n!=0) fixc4table[pair(n,i)] = c4; } datafile.close(); #endif // MPFP } // end of constructor void fixc6::operator()(long N, int i, bigint& c4, bigint& c6) { pair key(N,i+1); auto j = fixc6table.find(key); if(j!=fixc6table.end()) c6=j->second; j = fixc4table.find(key); if(j!=fixc4table.end()) c4=j->second; return; } map< pair, bigint > fixc6::fixc6table; map< pair, bigint > fixc6::fixc4table; fixc6 c4c6fixer; // the one and only instance of the class eclib-20250122/libsrc/fixc6.data000066400000000000000000024573471474421343600162150ustar00rootroot00000000000000 906 5 -85605664779593 1290 8 2895537481474571 1599 3 9749413927720 1738 2 -1015642654780797 1785 4 -3454002229112 1938 2 596996083434907 1968 5 -6508442882240 2006 5 148010927544595 2130 14 8902649401955279 2170 2 23154905933307 2184 4 -388282155134336 2226 7 -4614461259785 2331 3 36178673358024 2370 5 80615589850979 2438 1 -4385729320397 2470 1 -498155866640333 2568 2 -748266368759072 2574 4 124723254108627 2590 6 -1291380394655609 2718 4 2311352949049011 2730 11 -544338003618037 2730 9 -598792356989 2740 1 -35250796618048 2758 7 193528644975343 2790 27 312100842385359 2914 1 -24746574539341 2970 5 -7783629686541 3030 8 50122235596283 3054 2 -269064798198410269 3066 1 -254643857535941 3198 4 -54534921891137 3306 3 42551261819675 3360 17 -5357537080064 3390 1 3844547874451 3444 3 209168279187904 3476 2 -17504412052053312 3486 11 32044852604058407 3538 2 -308343282977493 3630 12 21165317427419 3870 21 -78179511999813417 3894 9 -253517039870201 3906 13 -2189441987433 3914 3 -3709354521277 3990 27 -281400139351426969 3990 3 -64459252245653 3995 1 -11106625123287333 4068 2 -108394822207872 4278 2 15353773474699 4290 21 -265855499627561 4294 4 -13233234456807957 4333 2 401151541561128 4368 8 388282155134336 4390 3 -99516432764659141 4434 3 1498044828125123 4446 1 82827608700699 4522 2 49969218316851 4554 11 1006753924179 4554 15 51136812730539 4578 6 -226342007398457 4590 13 -12708379508337 4590 17 -1485543984270201 4590 7 55020147565563 4596 2 46723629511808 4602 1 77138950600171 4650 23 -1444911307339625 4650 47 119279787104375 4719 7 -109524498957368 4730 11 -4386156984441 4770 9 -229166997431013 4774 5 -218576299016629 4797 4 -263234176048440 4814 3 -10430602997337 4830 3 2437884900667 4845 1 -154171650048533 4898 2 -3577141348280404569 4930 3 -53283599946117 4935 1 -242762843396177 4970 8 -2817884518157673 4998 27 -118626083955953 5073 5 -639819605342168 5082 16 1248808458823255 5136 7 748266368759072 5160 10 -2157215048643968 5166 1 4619506457763 5215 1 -2058445206712 5229 2 44348477019435 5265 12 -43831221618744 5334 4 -98993690939737 5355 14 93258060186024 5418 5 11481206084811 5439 9 459603146733416 5454 11 -880651310254281 5454 2 -118982305411317 5454 7 32616715194603 5475 3 66870526825000 5478 10 270193158518295367 5538 12 -1827220692067217 5566 8 69326027277111 5586 2 13739521480162219 5610 16 -212386961348677 5622 6 296603267908015 5626 3 -1023944954606793 5655 8 -9438074238061 5681 4 -347284548113112 5730 13 -9437376802033 5814 18 -16118894252742489 5838 6 -16249273182325 5862 8 203054170934863 5890 7 -14102024054993 5904 17 175727957820480 5910 3 -13293622664621 5982 14 1173723751495943 6006 15 -1806439626671653 6018 11 -206561048163193 6045 1 330725471624488 6045 5 242317792327112 6090 15 394811576410931 6132 6 942063006979520 6230 6 -463082664973977 6258 15 18744144028430239 6258 20 44216406800495 6346 3 32173304293063 6355 7 -18325223896229 6358 3 1716397903168083 6360 8 8432474854291136 6369 6 -6151016900728 6370 2 54414222679747 6382 1 799914640594807 6390 7 -240371533852792533 6405 12 -476983651953061 6426 16 -37767135120777 6432 13 -39987658885760 6435 6 84598709055147 6450 24 361942185184321375 6466 1 -22921697149424173 6486 5 387968714904115 6510 13 186676460646607 6510 19 -249765611201 6510 24 -8704868257513 6552 25 10483618188627072 6555 14 -12057465304 6555 5 2060638676032897864 6558 9 -460557278487429805 6594 17 -1344542907961 6622 2 75826922329243 6630 15 -288938762351461 6634 4 -4934542031109 6666 3 -1669385766421 6680 2 11430089894304 6690 1 12996804161467 6790 5 2734647861807 6798 1 7277537227902283 6818 8 46581079710367 6834 10 9324867068551 6834 2 -3602189982903029 6851 1 -50400542151361 6864 10 295640306035264 6890 5 3972699296379 6910 7 -8145449232769 6954 15 -398483971085665 6990 5 -5799866142509 7014 7 -248006580034933 7030 10 -3383896961521 7095 2 -3808839765689 7102 3 -8560872009361961 7104 19 27829064804608 7104 26 -27829064804608 7104 9 -13254942476800 7105 3 -8222006486456 7110 18 -2176620925976433 7150 17 109723667546375 7170 12 87176991434759 7191 9 -354535940442456 7239 2 69968456267176 7242 5 -4906505151701 7248 9 5478762545893952 7257 11 -908611276274965 7268 2 2595083102693056 7293 2 -608762852066537 7310 5 208382425130907 7353 11 785891624103 7359 1 -4855084159418936 7378 8 -205917200425637 7410 13 49466539937771 7440 10 739794589357888 7464 6 -14944312441216 7491 4 -36784818215864 7526 10 -10862487610633 7526 13 -3964498092225 7530 9 -1879714018752949 7590 24 180267694503911 7590 4 555413739931 7590 5 -728544511421 7626 7 -42769162558313 7644 4 -307040522622848 7650 31 -283996282258125 7650 60 1140321848529375 7704 17 20203191956494944 7719 3 -2405262887687672 7730 5 1176116978367251 7824 11 -68714179039936 7854 6 2062048580227 7872 2 52067543057920 7872 29 -52067543057920 7878 3 -7850794016177 7890 7 -5904621734777 7898 2 404593593989283 7910 2 3531794057182006883 7922 2 -607550454605213 7950 13 -35821826840125 7950 18 1060958321439875 7954 5 65054923534037303 8008 1 73674947521664 8010 14 8782410410631 8025 10 -10920399109075000 8025 8 -87363192872600 8055 9 139475308596264 8118 16 268843194294831 8142 7 16458427191311 8162 5 255937778927559 8190 39 14697126097686999 8190 42 2779186296951 8202 7 19090319133311 8211 7 -16772521232305 8214 8 -1311333205619825 8226 7 -310611340389753 8227 4 -50532813266968 8244 1 9163990891296 8255 1 13358557709090927 8265 3 9283558278824 8274 13 -3453689695577941 8274 8 -6437820573829 8294 1 190328257297907 8350 3 691677967177241875 8350 5 5533423737417935 8374 1 5537494455232771 8415 2 91604357527203 8418 8 115647003327743 8445 2 726083874073439 8478 6 1847168140383 8526 18 -1313736902755361 8526 9 -40615728081229 8547 7 60055008803432 8549 1 -203270071337803025 8550 25 -2152477229625 8554 3 73792423491515 8580 1 129695826107008 8582 3 5123665827979047 8610 8 3920336242019 8610 9 98055234380503 8670 8 246160566914147 8680 1 11738560938112 8690 6 -379877544039097 8710 11 23186766460585599 8710 13 694674911737639 8710 7 1670225960411 8715 4 -102499666613 8722 10 -3986169599721925 8734 1 38158434953637299 8766 17 -6870047318325 8775 8 -200774962085625 8778 19 -30303546574321 8810 3 6384155108903 8814 1 -67229334559997 8850 5 -125450433378125 8866 7 31800325499883 8869 9 17840054412243 8880 24 -33988208920768 8901 5 -965153104390953 8904 10 -22424735961693568 8925 15 -431750278639000 8970 5 -26720886643957 8974 1 -282255682661 9024 30 981236505088 9030 14 -30688805541113 9030 15 2097029119231999 9063 4 1377631657224 9090 23 74838202851087 9090 25 -1353300361099641 9162 21 7264749551357077263 9198 7 6875384153470407 9205 8 9193529056104 9210 5 809772261264143 9222 4 -598773171077 9240 5 74316694197376 9240 7 4581433231264 9246 1 -25482361855013 9270 12 -48276734177709 9282 12 -15667405800229 9282 21 14672838560687 9285 3 -419611709731256 9306 12 -232845526199169 9324 5 1000136171320992 9350 11 -284554757243125 9350 6 -158602226591125 9390 3 17118016536779 9398 5 -45832407177329 9416 2 -5349580204210048 9438 13 6148394489577131 9450 12 -55460545221285 9450 16 187179340121836875 9450 47 -54920321713125 9450 75 -1946194347560625 9450 88 1497434720974695 9450 93 -6932568152660625 9485 3 -10599394436504 9490 4 -17397497915461 9510 5 16099757136577294291 9546 6 -227096129265949 9570 10 -1652123013970573 9570 13 -1517298807349 9570 27 -96963943516417 9576 24 -99019714261824 9585 2 1945566819548712 9585 3 -52530304127815224 9594 9 1472442891060699 9614 3 36660274241355 9660 6 -162500630817664 9690 13 -41784480369329351509 9690 13 -41784480369329351509 9690 20 -182511008610121 9702 55 -40476775212657 9744 12 -245128751534528 9768 11 -150670721768032 9790 13 -25623176274873 9790 15 56140888697703 9830 3 -41081473330857 9842 13 -11841055717401 9870 13 -122701432717457 9870 4 -58381823397941 9918 17 -1148884069131225 9930 19 21019630625423 9935 3 -7053241184216 9936 45 -135394909843392 9954 10 -14222740265217 9968 15 -743775085662400 9990 18 -105289115931261 9996 17 440258860345472 9999 10 -41557205696472 10005 12 11473082406728 10005 13 -116901804855448 10010 11 -213829149667869 10010 22 -2807253785381921 10030 12 164537197273719 10030 8 -126363648074782221 10062 3 86334707649195 10080 14 -144653501161728 10080 20 144653501161728 10086 15 -66162054394529 10086 3 7008881123232235 10087 3 -37425845547441 10089 6 -3283590842361 10122 2 -1317944982745 10146 6 -6334434720109 10230 6 -11951688196493 10230 7 -189886315992821 10234 10 7444183414751 10252 1 103760981063360 10285 10 -51719188081176 10318 4 69011850341323 10320 23 -185314398814372544 10320 9 2157215048643968 10322 5 -4526158316653 10332 5 -5647543538073408 10350 9 -264896929567125 10382 4 -267907005973457 10450 21 -357048357854625 10458 4 -865211020309576989 10498 1 732698112839980807 10510 3 44669219684248539 10515 3 -90517393521944 10527 7 -13034216899931480 10550 6 2921301011968875 10582 5 -27098282236329 10614 14 20877848951599 10626 16 2428215181250039 10642 1 466336181369915 10650 2 1112831175244409875 10654 4 56690883786347 10656 15 93921186472704 10656 16 -93921186472704 10675 11 -50641568459000 10686 8 5751690251111 10710 35 38136171834279 10725 6 -391660690070125 10770 8 -1568558333424061 10803 2 -69944563753325 10842 8 -89671327680637 10850 27 2894363241663375 10906 14 17154045035096031 10906 3 -473081854954886477 10914 10 -13156269465833 10950 13 -53868746125 10950 3 6296513912875 10960 4 35250796618048 10998 22 -20753264249145 11011 6 211048598322199 11022 20 -53530657178257 11067 11 -10185698739448 11115 1 -422927670814512408 11115 2 15663987807944904 11118 1 -134732583213821 11130 26 -340885022800841 11130 29 11907788276663 11130 4 509320894709467 11154 13 -10148777380616797 11211 2 -12150997532056 11214 13 -313780114263825 11242 6 -26036155275129 11270 12 105659919645623 11271 2 132385727355175 11286 17 6676260459828579 11286 46 -247268905919577 11305 4 -20738346663077 11322 27 18295402422159 11330 5 765168068305603 11346 1 -2124490697458469 11418 9 2636158220231975 11430 4 867466706895171 11430 9 -23421601086169617 11466 15 -22183526543157 11466 67 10064159215551 11470 2 10451023589223 11495 6 -431001254800809 11509 2 -2399541758136 11526 10 -21136769566273 11544 8 733438649717792 11550 29 -4664629348525 11550 33 -130903137713125 11550 53 -583078668565625 11571 10 2209538641967 11590 11 -526940684730593 11590 13 273941566998463 11609 1 -26486093955160 11620 2 319386720430951552 11634 9 -2629824259437521 11640 3 13052259400832 11658 19 -2706411733623001 11661 13 113392168919783 11682 5 6844960076495427 11690 7 -674245532714697 11714 3 -501135658527717 11726 11 3284347990661847 11730 16 55382677035119 11730 6 1815801078088979 11770 9 -35399957665390713 11774 7 106932302930503 11781 6 -2331032921496 11830 16 -348536580837913 11830 21 -10436398335649 11830 2 -22928767143420853 11835 1 -690020988408 11850 22 10076948731372375 11862 13 -10207867972617 11925 24 -98326857555000 11946 5 43319037043351 11949 3 -14152801359370456 11970 15 7597803762488528163 11970 45 20840260691727 11970 53 1740399810632631 11998 1 99337620491731 12006 10 21886880871771 12036 2 367294559658112 12054 17 122326003774331 12054 6 -16000369195013 12054 8 -34881186072005 12090 24 -115771534379441 12090 29 -5879321381839177 12090 34 -284052602828658529 12093 6 18401736473531 12122 6 -180740644561305 12138 23 -30379386149713 12144 41 121213185731648 12173 3 -275308700418296 12201 5 563389911765415 12210 12 220093439580323 12210 4 -55489486657157 12222 5 -68688302854653 12255 2 -110914104110968 12270 11 -73807203299993 12270 13 251921975118823 12330 22 -19050563426481 12342 14 -40802351539213 12342 19 769075064369315 12342 26 456820320974831 12350 16 -62269483330041625 12350 27 -6398555753825 12350 5 -799819469228125 12351 6 -1239672299941 12360 4 -141448793451328 12369 4 -10719397580905 12376 10 -170023573097771392 12376 11 7387762062938048 12376 4 -31288207132736 12390 1 86945513748787 12410 4 -15607080243621 12415 3 -29746397921176 12420 3 -60255847349568 12432 50 85756855367168 12441 4 11703658237435 12442 3 -22789543547701 12450 6 7162600029875 12470 5 -27740898669501 12474 16 -37578713445657 12474 4 1014625263032739 12495 14 1184722764585416 12530 5 5082944741531 12530 9 2909797585071903 12540 11 -160327185616864 12558 16 187576776831079 12558 6 -6418688190949 12582 4 -5800170994677 12600 29 171733220280000 12630 10 1506574741375943 12642 38 145853840262599 12648 6 -7228642147552 12662 3 -895249859373 12670 9 7453533410891 12673 3 55580182386687 12684 2 30312620043040 12696 5 -353445451438400 12702 3 -4473812033009 12720 3 -8432474854291136 12720 38 -543210660577216 12727 1 173859182628695 12730 3 -14976211147813 12810 1 -214736680709837 12810 13 218136752850871 12810 2 8283026023147 12834 14 112054389195519 12834 20 -414551883816873 12864 14 -319901271086080 12864 9 319901271086080 12870 15 7178098489944147 12870 29 -137932938407421 12870 42 -23700312190017 12873 3 -4567783387672 12880 7 -991524663424 12903 2 -15730113524408 12927 5 91131353781335 12950 4 -161422549331951125 12978 16 -119738789383725 12978 2 -1225419019534557 13032 5 -103594662897984 13050 23 -83282883463125 13055 1 106840645869448 13065 17 -3969819542584 13072 10 -11969957919168 13098 17 -141110909974873 13101 2 9062072335315 13104 18 -10483618188627072 13104 58 18408923521344 13110 20 1941194696896063 13110 2 3038203066267 13110 27 -497680926209 13110 3 2435440396854187 13110 34 -33094593531373033 13110 42 346250719162079 13110 6 -3849681992319341 13158 11 -1179412628016897 13158 1 31844140956456219 13158 21 14702128809615 13175 7 1401321869846875 13195 4 427888595997127 13209 5 866494659295432 13221 7 51392967929928 13224 6 -29039881122080 13230 43 -128134565520381 13232 3 -102918845882304 13242 4 -5490978918121 13260 3 -1064855526747488 13282 2 1119401709038191 13286 5 -23891273114441013 13290 10 18443972906063 13294 9 51011403670567 13300 18 -53942532400000 13302 17 -40447210359378321 13325 4 4962571892875 13325 5 -1126505909125 13335 8 337925623321822339 13350 12 -40659307456625 13359 4 55091426745959 13374 7 43642772349975 13390 5 90336122864623 13395 5 -1382597438333464 13398 11 3576490638659 13398 29 -38398416952337 13410 17 23876000344863 13410 22 -134040113501049 13425 5 -645719021279000 13426 14 -1011241560567329 13432 2 6040897318813248 13440 12 -180061420670144 13440 19 -1440452318416768 13440 32 180061420670144 13440 41 1440452318416768 13474 5 866494659295432 13524 5 37755437055616 13530 21 7540021491454871 13530 7 -2039083847054677 13533 2 1494326314675 13534 2 11485215447435 13545 7 21390014818647 13566 13 999666067283407 13566 6 13107926819035 13580 7 -10736435062144 13582 1 1874944629603 13588 4 -567450864813376 13630 1 -11355308663093 13650 11 145685892563875 13650 19 1372157396875 13650 36 -974396259325 13650 52 -68042250452254625 13650 58 -121799532415625 13662 1 14480614679859 13700 1 -4406349577256000 13706 6 12056666012788123 13730 2 -549040754856309057 13734 3 6111234199758339 13764 2 967926424802336 13770 15 -28202927151069 13770 26 -43152912858033 13776 28 -209168279187904 13788 2 -1261537996818816 13790 1 127351252184694427 13794 11 20292039053011 13794 1 -1701625592586293 13806 8 -2082751666204617 13815 2 -30857949560952 13816 4 -79355601058240 13818 14 3780104526415 13858 6 12945569972371075 13860 16 -247791795733728 13878 10 -1195168096161 13896 6 33305983728192 13904 4 17504412052053312 13904 9 65001129905971008 13905 6 2197217063304 13926 20 -112294956514753 13938 1 -10161321615557 13950 14 39012605298169875 13950 39 -3220554251818125 13950 4 -26822408374125 13965 2 -92385501814277 13970 5 14733940813219 13995 6 -39059406009432 14007 9 10123193969288 14025 23 -1252866826444600 14025 3 -156608353305575000 14030 1 -6425035301717 14058 4 -16531899474645 14070 4 -18886541229346141 14079 3 342225131606632 14098 2 -9793568324794941 14110 6 -46581157621793737 14118 14 83812804846919 14130 16 68004925590951 14145 3 -259620750877177 14154 15 -1676985660001 14157 19 2957161471848936 14170 12 -20968602511537 14170 6 -133219620004301 14196 17 265679508142880 14210 10 4866153962607 14210 17 -1669090809174201 14235 9 -9250624576102456 14245 4 7974678532488571 14259 13 262599079300712 14266 2 2367415079315 14274 13 -14708391404744601 14274 1 544755237212763 14280 17 -2624866758678592 14280 38 -1739286682256096 14280 40 -18284353541504 14280 44 305690266214432 14322 1 -160718163427781 14358 4 -10171813669289 14370 2 1870497657460243 14370 7 49261814191 14385 1 8943603113467 14430 14 627652814163954587 14430 2 4869670499834707 14430 30 32245716372897799 14448 33 27214710719552 14478 6 25626926380818195719 14478 8 107855816481902231 14490 14 2527236240507 14490 19 10052805908979 14490 33 -34811246416113 14490 3 -41051740093533 14490 38 -49278436885593 14490 5 1289305422819 14490 55 -65822892318009 14514 14 384400575847 14514 5 -292474998917 14514 8 -3102532417057357 14518 3 34557698011339 14535 12 4162634551310391 14547 2 1659814803739 14553 14 1548332253749736 14553 7 -57345639027768 14570 3 102223929930740019 14570 6 450314504370927 14575 2 -441663803577125 14660 1 -524697113687392 14706 5 -5049825997149 14718 12 -1037852557057 14730 15 410063202715679 14790 10 -12375187682797 14790 30 -76825926948889 14790 5 -1183025700886589 14805 7 6554596771696779 14833 2 -3897357687621 14835 6 -61345364995261 14850 51 1821461448375 14874 2 -211743286968880981 14882 5 271938881020283 14882 6 65454267554747 14886 10 -43418888106597 14910 11 -1429168490261 14910 1 6223426825267 14910 16 22352886036208043 14910 19 -196897384840717 14910 33 2033720310887 14910 38 4491625565951 14916 5 694642849414784 14938 14 8432906816447 14938 17 99717798147479 14942 2 -28413288001593 14944 1 -28910273431744 14944 4 28910273431744 14945 7 138960463851496 14950 21 -427104565465625 14970 1 19638010683683 14994 14 3202904266810731 14994 56 422766345976191 14994 72 577001710774503 15006 1 6062019334903 15015 11 200960208652328 15015 15 -3132581538997 15015 20 -156372912954649 15026 6 11232773005375 15042 10 -13448381843825 15050 12 7560014900586875 15050 15 -44298997537315625 15050 18 60480119204695 15050 28 -1890182741035625 15050 3 -15121461928285 15090 4 2583039192592067 15102 3 26602915436667 15114 8 -29060703590401 15150 23 -346473161347625 15150 30 6265279449535375 15162 1 1153081055998747 15162 14 -31255807711717 15170 9 -3185429505781553 15189 1 -164294115165701 15189 5 37460668343219 15190 14 -1863887298144389 15190 20 -7942132735124301 15204 7 992180198377376 15210 35 65832594986223 15219 2 -135623362738329 15219 3 17275129344238536 15225 6 -7157617991000 15246 16 -157068769119669 15246 34 -372991914711009 15246 7 -33717828388227885 15270 7 -1122142960619317 15288 1 -150540578361152 15288 19 133180779211077248 15290 9 74682956065167 15308 1 -4943391390080 15314 12 58678090134513903 15330 11 -8815509943068709 15330 22 -143279524164041 15342 2 -188530788855365 15390 12 -77647742283141 15408 10 -20203191956494944 15430 6 668250386488711 15450 13 223503398970875 15470 6 23121521615154691 15470 9 -1546538830561061 15480 9 58244806313387136 15486 11 1954673347087 15498 23 7511538929607 15498 6 -202811551099389 15504 26 -38207749339834048 15510 10 -115526038970629 15510 11 6224534452927 15521 1 -340544345892984 15570 18 4308826051500903 15570 2 -159586150055589 15570 26 2347413030806319 15582 22 1582760212106255 15600 67 -585822714846400 15610 2 -1194012958573 15642 9 27422351679081519 15648 6 43023444443648 15660 13 -770639584443264 15660 9 20807268779968128 15675 12 -1416857778125 15686 3 -59988724616125 15726 2 -13930685165465 15730 27 -1168337612033801 15730 29 -873302758715321 15730 8 -7823885646797 15744 8 1252729656640 15759 1 4979897673579 15762 5 -7798951324405 15810 21 -69921246826801 15818 1 123416007226891019 15834 17 -14438269795249 15834 3 26270231151835 15855 9 11905102917224 15867 5 -102869463221208 15870 35 6121968492001247 15870 3 -954963242086877 15878 6 164837165987007 15906 7 32718637164151 15906 8 17873502783823 15925 17 1743480197620875 15938 3 197434652194359 15942 2 15137224865767 15960 16 -840502696654144 15965 2 -12217060602953 15975 16 -3786318135000 15986 2 -3295096795325429 16002 1 2672829655372899 16005 6 -38767906787669 16005 7 -2502504345673 16042 2 -665882753952833 16044 4 -212628575294848 16048 18 -1382362136362432 16048 26 -9472699362854080 16050 17 -921193090035625 16068 2 193120570682272 16074 4 -3669587222085 16082 1 -13985001455865965 16086 7 -807352620481 16100 3 -177582935132000 16107 9 -9391990641958072 16120 8 -11751707850624 16126 2 24922503270495 16135 1 26410225104712 16170 13 17495208493651 16170 2 105865689292867 16170 23 -312829592174533 16170 55 -77934883813129 16170 8 1947954320564707 16185 2 17186610748744 16185 6 407350080060776 16192 16 26667863235072 16260 2 1796380123550752 16290 4 -70597075275333 16302 14 -8631430621793 16302 8 7196766808774427 16306 7 -53878526696881 16317 13 -12409284961802232 16390 17 -925511439726953 16392 4 -4994024552595008 16414 3 -21982591260865 16422 23 -20067193039513465 16425 4 -132815048355000 16425 8 -1805504224275000 16434 1 312017831064963 16434 8 -7295215279993974909 16456 13 943799851988928 16506 18 82307154202335 16506 4 -5878191941901 16510 2 1747293853267 16560 36 135627227938368 16566 6 -216141476088709 16590 10 -404671819006477 16590 1 26267453917363 16590 21 15522456619727 16590 7 8617929120904643 16606 17 -12114072499577977 16610 9 7859706488520903 16614 20 -118910306452185 16614 6 49334958685814859 16650 14 87373888396875 16650 27 -1792346954806125 16650 38 14534808496875 16650 41 -17801019158625 16695 4 361660448043 16695 8 -9764832097161 16698 18 49629239743787 16698 26 11788295157199 16698 29 24008010958063 16698 6 2520855472012867 16710 9 -17443959649721 16720 1 9094971892032 16720 28 182808759221568 16720 33 -12172072669984 16720 34 -20724327804096 16744 6 1201813688347264 16758 23 1081536676280991 16758 31 -370967079964379913 16758 8 -892486499414517 16770 10 11326704127506539 16770 24 12166101935047 16770 3 -207887407316909 16785 4 -7612874593317 16800 18 -669692135008000 16800 9 669692135008000 16821 8 4874027730984 16830 16 34258080943683 16830 32 216389098275939 16830 65 5734447956414279 16866 2 -8008288233516405 16870 4 -794939418364994433 16872 1 6537796470836864 16880 17 -1495706118128064 16884 8 -131004286040160 16905 23 -1203498913980664 16926 1 421678177966963 16926 18 7662827639195 16926 35 -811910704753 16932 4 -56754371942748224 16950 20 480568484306375 16954 19 8951288013143 16965 6 -116477277297048 16965 9 254828004427647 16985 4 530469748871784 16994 1 334009457096131 16998 5 -1276379538773057 17004 3 -11741652891008 17006 1 -12200660798741 17006 2 -1209828989133 17010 21 1518799786083 17010 37 -78549757409313 17031 2 1722094050851 17034 1 -62498637729484073 17040 16 -569769561725137856 17066 3 -9672741433629 17067 1 822908777196104 17094 24 -11852939718577 17094 27 905203653983 17094 5 -1186864717840397 17110 6 -571623853123881 17127 2 29496552790455 17127 4 -796406925342285 17130 17 3301614548288279 17157 2 99729156886696 17170 1 9300614291625347 17186 3 -1299321396433 17190 11 254809173654891 17202 3 -131296675766885 17214 11 664142930013239 17214 8 7845169777615 17220 7 29394844633216 17238 7 -50717727127405 17262 1 -79602105350781 17270 1 -140481177039564877 17271 9 48912634219752 17286 1 4586448399314443379 17325 30 -226172696175000 17334 8 -115649998527681 17340 4 -477664239854816 17346 24 255607747501463 17346 31 -15757530198697 17358 7 -13114298897081 17360 27 -1481913979731648 17360 4 -11738560938112 17385 3 24900852801907 17395 9 -494375731787672 17402 8 1709403246963 17420 12 -291668994554976 17430 35 9810816806447 17430 7 -9989103412357139069 17442 13 -5586809861169 17472 30 5454495858176 17472 40 -3106257241074688 17472 52 3106257241074688 17478 4 14273111739051 17490 5 -41195889558701 17505 15 71335370293416 17505 8 -565422678070857 17510 4 2516409080603 17514 21 -82428455168865 17514 23 438730375922775 17526 2 38680273601379107 17526 5 33250617855255707 17538 5 -90156082438981 17544 5 -14109346841408 17550 27 -20183230063125 17574 6 258001026178571 17586 8 -5482462615241301 17610 5 377052340262167 17615 2 1461176837407 17630 1 277714701093051 17630 2 -85676354931879261 17640 41 -1245618916339392 17661 3 -8387678466312461 17670 10 4371005515807 17670 17 7822117578871 17670 21 173936612182967 17670 7 -133992898985269 17688 12 -2212728094328950144 17694 7 -18633009909645 17706 1 1161625271140547 17710 12 3381106154831 17730 10 -23346576109269 17730 20 358927811944767 17738 12 -189773881052049 17760 11 44934537480128 17760 2 -44934537480128 17775 24 126054549543375 17790 7 88640174826251 17808 27 295325520626240 17808 7 22424735961693568 17814 17 -1451534692969 17841 3 -13123171171736 17850 48 -14973502902625 17901 2 -13526145980469 17905 2 -398510305433973 17914 4 174657292514315 17918 4 303574569059223 17946 7 -31690541290390461 17955 12 669309615378216 17955 17 -6042187363347864 17955 23 223784717161032 17974 10 -9649332572298049 17978 3 1575590660063 17979 3 417206992232575 17986 11 -126329279149153 18015 3 -72334481970401 18018 31 15906861305343 18018 45 48773869920134631 18042 9 840722423471 18054 10 -583184026277901 18054 16 -3996295043704065 18054 5 5577148300406211 18060 6 -3949991661781376 18074 7 -262255190546917 18078 12 21185488986823 18078 3 5645065030939 18088 6 -531840465242547264 18088 7 12744833955633856 18096 18 -26273309789888 18130 17 442943475366873887 18135 11 -8929587733861176 18135 14 -6542580392832024 18150 20 3624492313151875 18150 55 2645664678427375 18165 10 -10850684601709 18165 8 -776379751768837 18174 1 32406528241459 18190 4 -742857956549 18231 6 1637666216358839 18246 3 -10394319346982533 18249 4 -768656153285 18249 8 5381536225960 18255 3 37297743560119 18258 3 -105073396314461 18266 2 -4706478664561 18270 31 -223696977859377 18270 41 -10659912563095137 18278 8 -67169165723009 18282 9 402104570425343 18290 3 11178962249059 18304 12 -4413438605376 18304 17 35307508843008 18304 6 -35307508843008 18318 1 62453456647075 18318 4 -12228024229885 18326 10 -8829322877001501 18326 13 -4563805099861 18326 16 -15823871224021 18326 2 -2212763172282845 18330 1 1649913121497763 18330 19 1033115288257567 18330 8 23362205336387 18354 18 -3770572153697 18354 1 934786705483 18354 20 77518859462479 18354 21 -40579860958402193 18354 23 -20346359714066665 18354 4 -1825529301989 18384 11 -46723629511808 18390 10 -2663632701521 18391 1 -6664880239992 18396 9 -25435701188447040 18414 12 -14191018742266929 18414 9 525593286750627 18426 3 20609454574475 18430 10 -6475301890921 18438 3 -79717089997 18450 16 -343218667618125 18450 40 13041308937375 18480 30 -4581433231264 18480 35 -74316694197376 18486 11 11219895190899 18510 5 5712047199919 18513 2 287928917047035 18515 19 -6826888398878136 18515 3 -1942448197435353 18525 20 -11177733075625 18564 7 30919561946272 18590 12 1928503180795087 18642 1 527727134923795 18655 1 10650611218467527 18666 2 4961943346419 18678 4 -14789590488346971133 18715 2 9631987868367 18734 6 -32522852723041 18774 11 -506091888767616453 18774 15 -1193842983613365 18774 23 330326815743 18774 25 -1317252462777 18790 2 -3199339375677 18794 3 -2468565742121 18798 2 1983555134891 18810 12 -7044865738749 18810 34 77122445296599 18832 1 5349580204210048 18850 9 1409473442051875 18870 23 272178142715159 18870 3 39538555824043 18894 8 25592072792311 18906 1 -7053906506813 18906 5 13444595782091 18914 7 -12871177229124585 18942 13 63988839062636671 18960 11 71946803144512 18960 12 -5159397750462656 18990 8 -631001018585277 19006 2 20794275179891 19006 6 132889359487607 19010 2 -54050207106889 19019 1 64891713692962675 19019 4 -12341206382968 19026 11 6725159165619 19026 2 11490315507243 19038 3 -38562715065221 19038 4 -37404409131773 19040 3 30799216455552 19041 4 1473243157160 19045 4 -5520436571989 19074 14 150610032390799 19074 28 414980264450519 19074 30 -16569888421372777 19074 8 8359247579765435 19075 11 -4049151164225 19075 6 -506143895528125 19080 3 -227676821065860672 19082 4 447882267906487 19090 5 -37013032389293 19095 1 26681113200341827 19107 10 166077456319656 19110 16 186707935240986691 19110 29 205385778447227 19110 47 -399762089195273 19110 55 -16284454580681 19110 57 89347332240271 19110 72 -1994813099402473 19110 8 -1842598546290341 19110 85 98754165632591 19118 7 1351820373513240807 19134 2 10992806259147 19140 10 -13665682549216 19152 24 99019714261824 19175 2 -4882144482125 19182 5 699926296336379 19194 7 -107808648049549 19194 9 -335897379992341 19195 4 2309717916328104 19215 14 12878558602732647 19215 9 89072065009467 19230 3 -148649805905309 19266 13 24275450825171 19270 4 2572240563667 19278 7 -9994671564165 19296 16 -1079666789915520 19296 8 1079666789915520 19306 13 -66380325226542649 19306 7 -118330920411165 19314 5 -2982363025653 19320 24 302760038480192 19350 17 -9772438999976677125 19383 4 -35643814850008 19395 6 29424826351827 19398 1 2063812941403363 19398 12 -62207704305721 19398 13 31008617118791 19425 22 -167493858139000 19434 4 -16029013696957 19449 2 -1255134469977 19458 12 -10475155302411105 19470 10 -17741762551333 19470 9 96925041569611 19474 4 15344733060847 19491 1 -604004439966776 19494 45 396381671600679 19504 8 280686676505408 19514 2 -6977773055944809 19530 19 6743671502427 19530 25 -5040264437458389 19530 33 235031442952851 19530 39 13521876123951 19530 54 -625182460199289 19536 3 150670721768032 19546 1 -15112683485893 19550 10 -882481922550125 19565 5 -12564724607372664 19602 29 145547925596271 19635 15 -197793393655481 19635 20 -281397202561 19635 2 5733002905183 19646 9 -43048686187190601 19665 13 -55637244252888242328 19665 24 -429973078427064 19674 13 12435046519160604735 19685 1 10565046604072 19698 19 -33758801431201 19701 4 -4057774592409 19705 3 -560045745801674936 19710 23 248857280315703 19710 5 -9216936307989 19722 5 88293518825203 19722 7 -6717658998473 19734 16 -2891376731105 19734 23 9965870014823 19760 14 31881975464981312 19782 10 36302658514947 19786 1 -251183980752697 19838 2 -51806271442996377 19842 1 -4946561855317 19855 3 -2221065068879601 19866 18 17675205652298375 19890 23 7801346583489447 19902 7 1452649083191 19950 27 -9611481567925 19950 3 -35175017418928371125 19950 37 136422718881875 19950 5 2278283686946875 19950 53 210166874545375 19950 61 -1201435195990625 19950 76 -8057406530706625 19950 77 -96482688387625 19950 78 -7101170196625 19975 4 -1388328140410916625 19992 21 68387030367040 19998 15 45073415693367 20010 14 936678157757531 20010 6 -381615562507869629 20022 10 -313201857945681377 20025 17 195189620265000 20034 7 4420149545475 20070 22 102075783166143 20070 33 -350913712359609 20070 7 -2756046145485861 20085 2 19479092204872 20102 9 163840129709867 20130 5 69153631622747 20130 9 3585131874265211 20140 3 -15859308129632 20172 10 532656400621760 20181 16 2524682155358629160 20184 12 -1088479397426573888 20185 2 -121312238584472 20202 10 50139070881983 20202 11 -943938512605873 20230 11 -41071604509909 20286 4 338204133675891 20306 1 -2178362163492477 20310 2 -1187133839189 20310 6 -47196030792637 20322 5 -9640670148585 20328 16 -199051914362048 20350 10 164900626431875 20370 11 47089149339779 20382 4 42788522833739 20394 12 -746748162045 20394 24 -196493505153361641 20400 103 -673176372760000 20400 66 2702985122440000 20406 3 66683132852147 20440 5 2362503680704 20442 4 4820101007743 20454 7 5608502057707039 20475 12 -53409739307625 20502 16 -251771410850877 20502 27 97259129538381783 20502 6 -33768887462037 20514 4 8785823068979 20514 7 383255660338975 20532 4 -1752193428198602624 20544 16 -5986130950072576 20544 22 5986130950072576 20545 2 -8095263968728 20550 25 88197052900375 20550 27 -944098438625 20570 4 1688796508742299 20586 4 562636555716577715 20586 6 -6724009316197 20592 23 521233562295360 20592 38 -7982288262952128 20592 49 -19269545789376 20600 10 460254431800000 20600 22 3682035454400 20631 7 -627966554049613 20646 16 -1738626414367473 20646 6 46942913187921771 20650 1 123732115526755 20650 34 15466514440844375 20670 22 -7184123670257 20670 28 2034704181671 20670 3 5541136129963 20670 6 -494428502948957 20670 7 -1262695218353837 20670 9 -36305782194869 20680 1 -13734874173312 20698 1 187865286647499 20700 14 329220503568000 20702 1 -165700093886425269 20706 19 -8675636223113 20706 30 -2378939468977 20710 11 1722272850423 20710 12 30105353138543 20720 20 82648345257958976 20787 4 21419462399200840 20790 13 -163417056137469 20790 18 -7754900105637 20790 19 11195426609163 20790 33 -32130955867473 20790 42 56029072359807 20790 55 -21647259247041 20790 6 -1512784953714789 20790 8 -699374650869 20805 1 -19113624634697 20806 1 16180300257459139 20826 18 -2302746010183809 20826 3 85286889266067 20838 1 59815725962419 20839 1 1431471018888 20859 2 -33301386931213 20862 15 10759067219312955 20865 14 -17572884476536 20874 11 61470654650027 20874 20 -296050829192657 20878 3 -299666396659213 20886 4 -245499010290485 20886 6 539847275046355 20895 5 102009449389931 20900 4 1521509083748000 20904 3 -36282509607232 20910 15 -2243593049689 20925 21 182320259470875 20930 4 -261330530910877 20938 3 -46788716012293 20944 13 -1647453831277248 20958 1 904524642379 20958 5 -151279843735693 20962 2 197138470163527 20962 3 -1733410107369 20970 16 156596385847743 20970 7 -61501978439613 21010 9 -134190865714409 21012 1 30502603912384 21014 7 -589057835060449 21042 18 6696177660943191 21042 24 263653076936367 21054 11 -123490120550885 21054 28 6353558712718327 21054 5 -8456586646628093237 21054 7 -197884957736213 21090 13 49826020102343 21090 3 53203277224907 21105 8 -177214800924909 21126 4 -4097170217701 21140 9 -23166319468384 21147 2 1120165339663 21150 14 -304235547355125 21150 40 -1517275677173625 21150 54 13849109031375 21153 1 -6537332557592 21156 3 -63720775101824 21165 2 3911055639967 21175 34 -440555815755000 21177 5 36797282727048 21182 3 -99177884973 21186 17 -14363171201601 21186 22 -91106776313145 21190 10 -1972428846701481 21190 1 -16748522368109 21190 3 9733274127251 21200 14 8621634600000 21210 1 -3280441786397 21210 2 573354382987 21242 4 9652519275889391 21252 11 20580435703959200 21270 5 -8609431925646901 21280 10 -81614914666496 21280 8 81614914666496 21285 5 102838673673603 21294 66 -631943827756137 21312 17 357883446873600 21312 50 -357883446873600 21312 57 751384749724416 21312 60 -751384749724416 21318 21 -919393941716497 21318 5 -243517238364293 21318 7 -1842647359241357 21330 4 3569471945307 21330 8 -96375742523289 21350 11 -208102705147485 21350 26 -26012838143435625 21380 1 -3043816379519552 21385 12 -934257021489 21385 3 -4059574031512 21406 4 -660377885102865 21420 14 -64110278643552 21420 21 6607140519456 21420 3 32968699660270368 21420 7 -1221062950380384 21424 16 -6672348270784 21424 8 -103863103350976 21450 18 1951318458296875 21450 24 -33231937453445125 21450 33 151333430721875 21450 3 638578418552875 21450 65 7561369451375 21450 69 -35226195279625 21450 75 -1662717075625 21450 9 -577422472725125 21456 4 -24849987378624 21456 8 670949659222848 21462 18 87342843134827763 21480 10 160945768014683264 21480 1 64366302477952 21483 12 -4966339521816 21483 2 52467739474536 21490 4 22008754816371 21510 10 -2353778768738493 21552 10 92496241749824 21574 3 396404961853209191 21580 6 298342000268064 21588 8 39933579135075560864 21594 3 933223693555 21615 1 -401582396262968 21615 3 16194958103656 21616 8 -2401619074822080 21630 14 62742612394783 21630 2 -7922390957109341 21630 37 7249212804959 21645 5 -16100359967853 21648 33 -2056132651456 21648 34 637257942032192 21648 5 21698978582080 21658 20 4946019999529679 21660 24 5869303154196128 21675 15 -3678849487000 21684 9 -69862969351928800 21690 7 -622430764615053 21698 2 -14440889720897 21702 10 284525260223743 21714 13 -5091510553952257 21714 9 -7391943258728057 21717 1 -160039628517816 21717 2 5927393648808 21717 9 -1889148319213752 21720 3 9787559112038368 21726 30 -1725221228611185 21744 24 -147926588739136704 21756 2 12705433583818528 21758 11 -16554516522022513 21770 3 -312951887338509 21771 13 597445570869192 21771 2 24532504459424055 21777 6 -296611590815749 21783 1 1112890088483 21834 7 -1144650470193 21840 34 34837632231554368 21840 40 -74591176992704 21840 50 18426433237568 21840 57 38322710847296 21845 2 -3304196860333861 21846 8 97956571073667083 21855 3 -14555665108801 21858 3 -42786139455449 21879 10 16436597005796499 21930 10 46528418631495083723 21930 31 278136142037119 21936 18 -736263917960896 21942 6 118414691650719 21945 17 -182195830631737 21945 21 23971671810653687 21945 2 -882056316653 21945 29 -29972770356376 21950 6 -12439554095582392625 21990 8 7179958567943 22014 3 -17962219409769 22018 1 -2088490382651701 22020 4 1489529583560096 22038 2 -17876088165437 22064 11 -12385833278421952 22077 2 71212562716336479 22077 4 -1922739193341084933 22077 5 131087272304311272 22080 24 40185845315072 22080 50 -40185845315072 22110 12 -29787546671873 22110 4 78897462179147 22134 13 93951260661203 22134 6 728322273272035 22134 9 2072281531139 22150 2 -4929700807125 22160 10 -11069594606016 22165 9 -51038436776696 22170 10 10449160888823 22185 19 1182557852919 22185 8 46622767775112 22218 13 -1406883641431141 22218 25 -14389246474231553 22230 38 -1335596578319817 22230 41 13450208399288991 22230 43 73441975541319 22236 1 -40236022313958464 22242 3 -61971970114493 22242 6 8625019447347967 22253 11 424161657159624 22256 6 -663775272068544 22270 2 7933794395723 22270 6 -1483464253497273 22286 5 234717622313247 22287 2 44083170401320 22302 6 -275259027358701 22320 22 13733073087552 22320 56 -19974453912662976 22321 2 1729043343719011 22330 1 -5262123749209237 22344 13 245613858160832 22344 4 -1257917110807616 22350 16 -110537038633625 22350 25 620556081023375 22350 3 22681320974875 22379 1 2227476530952 22385 8 98327332936008 22386 20 394927665210359 22386 28 65332832459831 22392 3 403496435912832 22398 4 24327933111827 22410 13 78000249948831 22422 12 100836392888375 22422 9 225499204991879 22425 4 6451534417375 22470 1 -35160211128293 22470 18 -495691704901 22470 22 -3362508492713 22470 25 -763527979157777 22470 41 41570205296831 22470 5 285475579489603 22470 6 -4689498948317 22473 5 993190091828328 22477 6 -8467470938788056 22491 10 8502710283144 22491 5 -225734781912129 22498 3 -10178749842605 22506 22 875063762705143 22506 34 892824780653927 22530 5 -11315241211952737 22534 5 94043519587855 22540 6 487287574002208 22542 17 -164302150505290669 22542 19 289677506314591 22542 25 1423185588523585583 22550 21 -91096692565625 22550 7 -27365351751125 22555 3 -333946887994296 22575 3 -99027846382625 22578 3 1312141282816132639 22590 8 50752278506329623 22594 9 -223731465059305 22602 2 -137009618735869 22605 3 36869510079811 22608 15 57504221552448 22620 10 394342407661184 22630 5 -256867813709 22630 8 -9445682761857 22644 2 -31916566990656 22646 8 -44794531389569481 22650 7 -10700708097449125 22678 4 8585467987571 22678 5 120949842824941103 22680 25 -513519309069696 22685 7 20466424390737096 22698 13 2201027589099 22698 20 423722721390356439 22698 4 -15693434125568757 22704 26 1835390410048 22713 1 -318087286931789 22720 22 -5439427910144 22722 13 -8636457202626905 22746 1 -10797549358517 22746 4 78451647242579 22746 6 -12834215618653 22764 3 8103353160736 22770 15 -4867227751605597 22770 30 1637378137186551 22770 3 -44209209704036877 22792 3 -21745767352896 22794 7 596251748869831 22806 5 -14938468770861 22827 3 -33732958097537 22827 6 25570478269475 22834 7 3739716681155 22848 25 -10268428229632 22848 75 1595032778240 22855 1 -43809484147064 22857 5 6138376037962091 22878 1 1154767389074451 22885 2 5905627772264 22890 5 38313977393467 22902 13 -3621516257089 22906 4 11617524882855 22932 27 8290094110816896 22935 12 -659445926189869 22950 24 -1588547438542125 22950 41 -8647555190625 22950 43 6877518445695375 22950 7 -185692998033775125 22983 2 -3145801424777 22990 17 -11256350726180989 22990 2 -347285788824997 22990 28 3801850914436047 23001 5 -576505843525 23010 12 -3160302397419617 23025 3 142860877597000 23046 5 -86115519759709 23050 14 504812198684375 23055 8 -456441507195256 23066 5 7248027759255 23067 4 227118658684392 23075 1 -8483981295275000 23075 5 -67871850362200 23088 4 -733438649717792 23100 13 -114485584688000 23100 22 1147184239508000 23118 6 -525551274511597 23130 10 -13415395906809 23130 6 -91568223533421 23146 5 10565283820370255 23157 5 64942097967567144 23160 4 -244328154999488 23161 4 34075261707407 23166 4 28216806441075 23170 1 -8819913193813 23199 3 3745195810811 23205 6 -138668137243901 23226 13 -180681478184053 23226 19 -24380152811245 23230 2 4529715086339 23254 1 6335996687566435 23256 12 -74903000463936 23280 1 -13052259400832 23290 2 2860547576131 23298 8 8076274615135 23310 12 34867270655701443 23310 35 67170661101783 23310 38 -10062997170057 23310 47 -7678570995369 23312 5 1583780770517824 23322 15 53245255499839 23325 11 180830583377000 23330 1 -6403359373041997 23349 1 166200494882984 23358 2 -19777220819801 23370 15 234259425567631 23370 24 248043216172031 23370 5 583051006963187 23376 6 -16284556606400 23380 1 14148379617408 23406 2 -14817767146469 23406 5 -14691404531485 23415 10 1549561587848 23415 8 -2165705046258795224 23450 16 -14091676565625 23460 4 -146603572819424 23470 4 59679699368127967 23472 21 1855282834078272 23478 13 -48908607051205 23478 16 -244764775013725 23485 1 199862926366888 23490 10 -154735254756261 23490 17 4177851878419047 23490 27 -1104493278949281 23490 5 78281631387 23495 1 -5018916115477 23520 32 -1837635218461952 23520 44 1837635218461952 23534 7 -313061195712005 23546 2 -4333200422229 23550 11 4159738248875 23550 19 -314837618476625 23562 30 -695019585070089 23562 31 -34682289080265 23562 38 -55675311666129 23585 2 244111327749999 23595 19 109058078671784 23595 4 4170403027866691 23595 6 -8661678075809 23598 19 -19709119537101 23598 30 729967390263 23607 2 -15670608990849 23616 18 -1405823662563840 23616 56 1405823662563840 23622 7 -13186978710069581112401 23634 1 211971438436779 23638 4 -17564473874313 23650 6 -548269623055125 23650 9 -826271473880125 23655 5 -29668946979893176 23670 9 159424786838979 23698 5 -40117460370085 23712 18 2637541125086336 23712 3 -2637541125086336 23714 4 -1067296615413389 23718 10 -2190313586724085 23730 11 65187928933861411 23730 16 1609853033627 23730 9 -336537500741 23760 70 498152299938624 23790 10 520132877623 23790 20 63710394872921783 23826 1 140927316765211 23826 20 -3789083929514797 23826 24 37997002354237543 23842 3 -3018658273556869 23850 24 107034789679875 23850 69 967189324683375 23850 74 -28645874678876625 23850 85 -392692969535625 23855 4 851518049032 23862 10 -4940998186913 23862 2 1074970327487635 23865 4 -30727088279128 23870 14 -89726101790697 23874 7 17963791444783 23881 2 -258934726933397 23898 9 -1893618582841 23905 2 -5700649843313272 23919 6 -556648830424 23920 12 -14895659014848 23954 1 29705935295331 23954 4 -13975400877733 23970 1 -851173260119117 23970 20 -20939268777553 23985 17 -24614682811029 23985 4 -6125081228856 23985 9 32680140977736 23994 16 180553368541275 24016 11 64278361890368 24024 16 105152551582112 24024 19 -89094592653760 24030 31 151355743466391 24035 2 7124752481707 24046 7 795807218166047 24058 3 52131287390399 24075 13 294850775945025000 24075 27 2358806207560200 24090 11 2527160983967791 24090 8 667974226113467 24102 10 -5848192670445 24102 27 -43817246726193 24108 10 -71744719761451072 24108 1 29580897416758912 24108 13 -86241683430784 24135 6 8166858756488 24150 33 -46540768097125 24150 37 53953996553675 24150 4 224403208847875 24150 46 228140911507375 24150 50 6744249569209375 24150 62 304735612583375 24154 1 15761504693778111 24168 16 199978990415936 24174 2 21341998445355 24206 4 -2260692124677 24213 3 -1281743912726857 24225 12 -19271456256066625 24240 23 -3207823078162112 24240 28 177394258609984 24246 11 29470834156887 24255 27 -76229103118392 24262 3 20477544095079 24262 6 -61776932750721 24274 2 3917045539430443 24276 12 -6306098486522752 24310 3 -26207088978932213877 24318 17 -757191276993537 24318 5 -1013183047190565 24321 9 -13198470430904 24330 8 -339549955664057 24339 5 -3281696806089673 24360 3 1629533681290432 24390 9 -30221496349389 24402 15 65124747027991 24402 17 -10991384443192033601 24418 1 61688073539259 24420 1 -1185310228211072 24426 7 -444377534165397 24432 10 17220147084698257216 24442 5 -593386099185077 24450 24 134207380937375 24450 8 12748185717875 24479 3 174479502375144 24486 1 3916110661219 24496 5 -9075493657216 24510 10 1166112878239 24510 17 399752495956727 24510 19 49964177656367 24522 2 -1740646383489773 24528 20 16297206882300224 24528 9 -942063006979520 24534 17 73938734030007 24570 17 -5473932737337 24585 3 5809375471528 24585 6 -1409950098296 24600 38 -174718757260000 24605 2 127182605353831432 24606 6 -515438616599397 24630 4 -17230336466536117 24633 4 452858073272235 24642 10 35405996551735275 24643 5 36710915618441096 24650 22 -6660449993264625 24654 5 -1669757054797 24675 17 -30345355424522125 24675 25 4726483285985000 24713 4 -1141815084461 24720 1 141448793451328 24720 17 -114433740273088 24735 2 4709118930025123642888 24752 13 170023573097771392 24752 14 -7387762062938048 24768 33 42610447775232 24780 7 -65257887899744 24790 1 -4054371812703814077 24794 45 13973408315279 24794 7 17865384940683 24795 8 -250656073528248 24816 12 -551930136175808 24822 11 -5225273414334261 24822 26 93249621780604407 24822 31 173821155493383 24822 35 -6944981553945 24846 11 -55143637103717441 24846 14 -3715638555272411393 24850 12 -6786575803125 24850 21 1110406323375 24850 4 -352235564769709125 24852 4 -24366721112371072 24860 1 -214562619876672 24882 10 -6891649750614149 24910 10 -710535181714057 24910 11 28959981088447 24910 6 -5315771566349 24934 7 -3283201832361697 24935 1 -8802040700321 24950 14 9286660894375 24955 2 13145980724703 24970 12 904916432718143 24990 20 41087291964803 24990 34 484470627376211 24990 48 -12241377952993 25014 14 -190312808664025 25025 9 33530689438875 25026 1 1124641998942499 25038 6 -280030192903917 25060 5 -3697372208069504 25086 7 950276335927403951 25090 3 630976568097699 25095 6 1207478510344 25102 8 -280351334171889 25143 5 26536612465714231 25158 11 -6221661722081 25158 5 1061613273175104007 25185 2 -201197409997409 25185 5 37851927104747528 25194 10 33206499350747 25194 17 -902622677273 25194 9 57197376857323 25198 3 11971913970023 25212 4 -1293879107824480 25228 7 3104007518342592 25230 14 -268265451447109 25230 27 -464121193514329 25238 1 -568324531852641 25254 4 -26982333927189 25254 9 -3122469089849061 25278 13 1652428858832135 25278 3 -3203760158749 25278 4 -3883828332493 25305 4 1133090428803976 25305 9 -279484668856 25311 5 118461093128 25330 4 -2136108093093 25335 3 -19604264599982853 25338 7 16311124601767 25346 1 670797728565608979 25350 61 20110195383086575 25350 76 -304780532343625 25362 11 56208489885279 25380 7 5611573232816544 25398 14 80038730170143 25402 1 39551755886475507 25410 11 43292311678099 25410 13 99593691218659 25410 27 -71589705956224093 25410 34 68140022461379 25410 49 -9982547749788713 25410 50 -39023899393193 25410 54 -633877045743689 25410 60 84301600470263 25410 62 53786405677103 25450 4 24009209692875 25454 5 2381244083011 25454 9 -256726015641809 25458 4 146465291501099 25466 3 -159652216607905701 25482 7 25987885399592639 25488 33 -482770224418752 25494 2 -11100886214165 25498 6 60319377650781135 25502 2 2165761708328007 25530 22 8320541077979 25530 33 -7118778306457 25530 37 127111100954008031 25530 8 -25193351459468069 25536 22 130275808209280 25536 32 -130275808209280 25536 4 29339174596096 25542 2 -138183096863136069 25542 26 5117892476412447 25550 17 -6988653283625 25578 12 35470896374394747 25578 26 385724208363291 25578 42 1096624658193183 25584 24 3490235001032768 25584 26 -623962491374080 25590 15 -12772963043657 25590 17 -8062879234121 25590 28 1965819182066639 25599 5 -7156260925624 25606 3 -7635548274985 25631 3 -731780509464 25641 12 56383569362007 25641 13 -1621485237692664 25645 2 28291180467087 25650 27 -35422112737125 25650 32 8270211121875 25650 35 -341986248986625 25650 4 12666157369875 25650 54 956397043902375 25662 11 116095251643883 25662 16 1153825723259 25662 27 17563072913330615 25662 4 15417400105171 25665 12 -1145830433533741 25690 11 -5053265707897 25690 14 -188590906327041 25690 6 -9562945013189 25715 1 -100875809700023237 25740 6 -3501787304889216 25760 11 -569558611137536 25760 13 569558611137536 25773 16 -50757164280856 25782 6 -4041722785193 25800 12 -269651881080496000 25806 1 34882752915379 25806 7 9416014193915 25810 1 16363394989587 25818 1 -315009957612221 25830 17 -2647491328273581 25830 24 -265128934079241 25830 5 -18871709545557 25850 3 10675519496875 25861 6 -123783019318701 25870 4 -64532103917841 25890 7 -8698101613633 25893 4 -15550690316265 25914 6 -59792795813465 25935 11 -238796311407389 25935 5 41148940155688 25937 2 -8313147062973080 25942 7 -13740202183401 25950 24 -10867652920399625 25960 3 -287025860804832 25970 14 19446551208539 25970 2 -1495406230033373 25970 3 5964766312633723 25974 6 1859539734027 25978 3 11718875802671 25998 3 -2367405471155633 26010 16 24784541625267 26010 50 -6646335306681969 26010 53 -110274496916121 26025 1 31009951300375 26026 10 -1410774957092969 26040 15 -47694069980864 26061 6 5537099639240 26064 6 103594662897984 26070 25 -573720932411729 26070 28 -2133367961502169 26070 8 -70631400283957 26075 2 -257305650839000 26076 2 45930784273353856 26082 22 -135346314966561 26103 3 -10739900417912 26103 6 146341722398248 26110 4 20514808565243 26110 9 2745767040407 26115 3 -60856843807576 26124 9 -65757300729184 26130 15 2723907829447 26130 23 -63839168412193 26130 2 -394948424632013 26130 25 -328385930178097 26130 29 -831551050723609 26130 6 99439740058339 26145 3 11234133900072 26166 10 -1580564105933869 26166 8 5711149434838211 26187 5 -773356979015704 26190 10 127896240757491 26190 14 -3453198500452257 26196 1 149848309207072 26202 3 6471182567915 26208 32 -30190862780352 26222 4 2341146838745007 26226 23 668157512562207 26226 25 -489584231073 26229 3 326722749419240 26234 6 39848964670367 26235 15 95399381572659 26270 6 8556408347463 26270 8 -595945014691923361 26325 10 202922322309000 26325 11 -5478902702343000 26331 2 208668070268803 26334 12 818195757506667 26334 14 8191352580867 26334 23 2784237542379 26352 16 94382174309472 26370 2 8610087566403 26384 2 -20114779057984 26390 2 6093694459763 26390 5 19464006955203 26400 13 -1070492068160000 26418 13 -57480729515873 26418 2 -15051753134405 26430 3 46210376578931 26442 7 1815192033119919 26446 2 -13170941192429 26448 15 -2723280756459200 26460 1 82705481707968 26466 3 11859963166196315 26466 4 21754290337379 26490 6 -13688967318949 26490 9 10339162058231 26508 2 316547482941568 26510 6 -287273927889 26520 20 -292547117600300096 26520 31 5110771749722144 26544 14 -33713162110144 26550 68 3387161701209375 26562 11 -1338533001824467841 26565 17 -186141118098601 26572 4 37778516377960896 26598 4 43513158059171 26598 9 87811925979383 26600 13 755135317880000 26610 19 -87903125144929 26611 4 58809094874462440 26622 9 -363884767159689 26640 52 18465436033344 26642 5 5989486279571451 26670 14 -748150404033493 26675 2 592823913861375 26680 5 -24403377928256 26712 5 605467870965726336 26730 1 12169754325603 26733 3 114939329636872 26742 1 -198263662905149 26745 2 -2992676951672 26775 21 -112503502972125 26775 28 11657257523253000 26775 9 -296850021075000 26780 1 1182179362850208 26782 4 -6875202774532877 26790 17 40279523627287 26818 13 12273930286551 26818 7 2404310210251011 26826 5 1321228292480947 26832 19 204645232946240 26838 24 -20845201678281 26840 5 -73929340007488 26864 1 -6040897318813248 26873 2 5302305253160 26874 4 23661523036539 26894 5 -41838210598694201 26897 1 22530829664520 26910 37 721463939386839 26910 38 -6284106146889 26922 3 3433973456915 26922 6 36552476735335 26922 9 -6287428452745 26928 41 145956828204864 26928 44 52972549556544 26934 6 -168456459725497 26940 2 -35580240724701536 26950 46 125623163684375 26950 52 -286661063299625 26950 55 -22810853606625 26950 68 -641469834077625 26950 72 98324744711771375 26950 82 5280761614279375 26961 5 -2901326071096 26967 1 -13849420057784 26967 3 288962214056 26970 4 129240241723043 26970 7 -21944428715269 26994 7 -7024065859961 26994 8 -24138372433985 27018 3 27117433922499 27030 12 -5815940533937 27030 17 57421496094653663 27049 1 -192230366550488 27066 14 285741455130071 27066 16 -12972589617025 27066 19 -758797304329 27072 16 26493385637376 27075 10 290642024521000 27084 2 -35175447960128 27090 19 828597749610051 27090 28 -370035191202417 27090 40 -786355556686209 27090 5 -56619786219263973 27094 14 -1607687625313 27094 8 -1616136337169 27102 10 -934291649017 27102 11 37476441041831 27115 4 1074056457411 27120 17 -15643693158848 27120 28 -246051063964864 27126 6 -12416742363141 27150 2 326838311459875 27170 6 18719783622883 27174 8 4226441868068743 27186 13 8749073057874407 27186 3 -795296813455349 27186 5 138851984525651 27222 13 172602225013447 27222 6 3395008241587 27240 6 -8697848829472 27258 16 -75595528064701 27258 24 8938815229863847 27258 28 254496904775 27258 37 128968820083151 27258 41 -878728830841 27265 7 -1474854490584 27279 1 6333352242120 27285 2 -9398242254633281 27315 3 2854942475211 27326 1 -28038617598061 27342 25 750978601689519 27370 23 401222796465303 27370 24 103988785998007 27370 28 -7709509712416833 27370 33 -7288910946017 27370 40 -19854783032041 27380 5 -1722767439844224 27390 26 6709946521463 27390 4 -2697395954488237 27398 9 2343522849751 27405 5 264640997109334383 27405 7 -9801518411456829 27450 34 7472659971375 27454 1 15722883 27456 62 2365122448282112 27456 7 -2365122448282112 27468 8 4284697031712 27489 18 5582763442151 27494 3 -133475738878241 27501 1 4744831188239 27510 15 2705516778229019 27511 2 -20291992056856 27534 6 -23337253905857 27534 9 6208682721983 27550 7 -26378827031125 27552 15 1221001241116672 27552 27 -1221001241116672 27573 1 -16400678901261173 27582 1 77511508928659 27590 1 778657261923 27591 3 4700196985544 27600 22 -3511216041400000 27600 34 -627903833048000 27600 87 5015381480000 27606 3 -10976562888121 27608 2 1479078726439616 27610 1 3523658929147 27615 2 -123237779876146921112 27630 6 -21863851054131861 27632 2 79355601058240 27645 6 201426309233416 27646 7 -1253672279065 27650 25 31735667946375 27666 2 -5922214196877 27672 4 3840705705785536 27675 22 261332012564775 27675 39 32666501570596875 27675 4 -1209870428540625 27678 16 24875269299719 27690 28 -1011740053897 27706 2 18022210295643 27710 3 -255574190713077 27720 28 -123698697244128 27720 31 -2006550743329152 27720 41 6843850197696 27720 45 70192410359616 27726 2 -238733420101577 27730 3 -31890929119846749 27738 14 688023770085351 27762 4 -9200623577168393 27792 7 -33305983728192 27794 5 4523963690007 27794 7 -5094253475155961 27807 4 59212119989359 27816 4 -74288016298924352 27830 7 6628629984427 27846 17 -396166641138549 27846 42 423019956606183 27855 3 11329516162743912 27885 12 -27499679409176 27885 1 -6883828288672517 27885 21 -180015476214808 27888 21 -2050870566659738048 27888 29 105122315897920 27909 4 -11831081282901 27918 10 -36805438506645 27918 28 993746839679415 27930 18 -2363711123923318814309 27930 21 -576697903752509 27930 36 6891286075578188963 27930 38 264748496935643 27930 40 1240458568690859 27930 45 19556687268251 27930 51 22109523520258979 27930 55 96520247797539450367 27930 57 -4820385938417 27930 62 374834570466223 27930 73 15943887826111 27930 82 -2217221792278633 27930 8 -3616497284813 27930 87 -128568257669914489 27930 91 -18526290677209 27935 10 307350557791336 27948 2 -1592641424000384 28014 23 -4015978325159401 28014 2 3580967753299 28014 3 -8520309419525 28050 28 -1001801380907125 28050 37 43085870475875 28050 39 113844253011875 28050 48 19840409027646875 28050 59 -26548370168584625 28050 73 158723272221175 28082 3 -18657062215994341 28086 4 1289467509967 28098 1 149061209141979 28098 9 -4024652646833433 28122 14 -162645672171601 28140 16 -4388537258848 28152 15 67094902549440 28170 17 -462186446493033 28175 14 88930388953000 28182 19 8136223934543962055 28194 3 -1372244794721 28200 8 -15331820392000 28203 8 -18885736300969 28245 1 262636826131 28258 6 427227746210955 28260 18 -574912213098336 28266 15 86230768068719 28275 11 539246654153000 28275 4 -1179759279757625 28282 4 -23174871126805 28294 10 -1578685096673 28294 13 -42679049885081 28304 2 19733970110559552 28314 23 -400746335088429 28314 36 -401482564476345 28314 41 -7317487950993 28314 55 -166006651218582537 28314 7 10840029240861315 28352 1 -20192054505984 28362 10 9824372117013167 28365 3 1437751943451496 28392 20 -853055894830136192 28392 3 -2969456422826816 28392 9 148184278360768 28395 1 11919106797003 28400 20 -28851824600000 28470 14 -2312573458444938521 28470 8 -360300160693 28474 1 -66563212555845 28490 2 -2181670260088733 28518 21 24282392602447 28518 27 -872595847375777 28518 33 -103581062437825 28530 10 -20163446279253 28530 22 -434693442687586945857 28530 35 -40313870546121 28538 3 41121759368655 28542 4 107431111938048931 28560 1 2624866758678592 28560 43 1739286682256096 28560 7 -305690266214432 28560 87 221056142663168 28560 93 90396851755328 28566 26 -25739841688508601 28566 3 953327469944763 28578 4 21196294774307 28600 3 -27552763016000 28611 1 39363184724715 28611 6 -1062805987567305 28635 3 -8042603285501 28635 6 -1626869329649 28638 17 6131595490180623 28644 1 -52980392196811232 28644 8 64175891451328 28650 1 -1179672100254125 28650 46 32689816409375 28658 2 8305969344371 28658 3 253057121970435 28665 35 93438417713256 28665 9 146556324660123 28686 2 1449115012217195 28686 4 -64864883828053 28686 7 1202607290402407 28704 13 5706565199360 28706 1 -6369206315360329 28710 19 2618026474943259 28710 35 40967067798423 28710 39 44607321377205471 28734 5 318404637107 28749 2 -67872531170518136 28770 11 536742920224099 28770 2 11779777983516944563 28770 23 -49480109888273 28770 3 -183323120968133 28770 33 -180178373017 28770 40 6812998878239 28770 47 -735821106698161 28770 7 2330417685763 28776 10 -124934176114496 28776 7 -804843609760 28782 17 7357106659599 28791 2 147922719291432 28798 15 80921271178366487 28798 28 -34261891397344017 28810 2 563652712079 28815 2 9829866672523 28830 3 344362822055638147 28830 34 -1038264532503641 28830 35 -2683210119577057 28840 4 -13979010942677376 28842 1 -76205556491957 28865 1 4432461422857416 28866 4 -2224499624383789 28886 6 1126084464146611 28886 9 -19536716682370025 28899 14 2959681087880712 28910 26 -1723152293711793 28914 1 9910133880801931 28917 14 46930165713495 28920 17 -230814039179584 28934 4 -497320475409 28938 17 -1088148695833700857 28938 23 145135911311 28938 4 -20096298282997 28965 8 143457573738536 28980 5 38357913988512 28987 1 -618524428422733272 28992 18 43830100367151616 28992 7 -43830100367151616 29010 8 2910383570431 29022 7 -26673500964529 29040 3 50076077727808 29040 70 -1354580315354816 29040 82 -216258571258048 29070 25 -283628744730153 29070 28 1128180969971892490743 29070 3 10504768323339 29070 41 -19176644409561 29070 9 4927797232473267 29072 13 -2595083102693056 29085 6 -4921006252159864 29094 4 1555286684095 29110 14 16158711692071 29118 4 1755527750603 29121 7 -397636886518164856 29130 6 -785786545477 29146 1 -9272420395633 29150 1 -65459367972125 29150 9 23883113266875 29175 11 -330256343951000 29175 19 -565032867260455000 29175 3 -4520262938083640 29175 6 2617697583661375 29190 5 1498901043475247147 29192 1 -816351780652480 29202 9 22197227137517359 29205 1 170933103149832 29205 4 -4615193785045464 29210 2 -4070555914933 29230 5 -470359818748349 29232 42 6618476291432256 29232 48 71971863951168 29238 9 81625818055682735 29267 1 -2029748350328 29274 21 -1849020493573 29274 2 -934782163052093 29274 33 112399123568311 29274 39 -8919325186561 29298 10 -1327016880901 29298 18 3339235523071 29298 5 2285077083859 29298 8 -85865230697597 29304 12 4068109487736864 29328 25 841601943872 29330 3 -749034112636837 29370 11 81062545725107 29370 21 122034977296327 29370 24 273722693819188519 29370 28 91450397941759 29370 34 871505043100127 29370 40 7916446837511 29370 42 -13131620900641 29376 60 -7862068998144 29382 3 -11499452736688724077 29400 87 2181647946520000 29406 24 901913462630999 29410 18 6542015812199 29410 2 -48507836836717 29414 2 -270768884496389 29415 1 -7974221553368 29425 4 -739379519303625 29432 2 -20348668760820544 29436 3 -27468870997888 29438 2 -24635489000779989 29442 4 -373246854115337 29445 3 -922948488688312 29450 22 75810491734375 29450 8 -1762753006874125 29488 8 -649670047058368 29490 9 105167554916527 29512 3 -32886977448515392 29526 19 -4039581240001 29535 1 -57075435390617 29550 10 108086000505875 29550 22 -1661702833077625 29580 2 -29525405825322208 29582 2 14471114165999 29600 20 1140822813248000 29600 22 -1140822813248000 29610 11 3312938683371339 29610 25 1576309231744407 29610 6 6413368803003 29624 11 -391222167033888 29640 6 -8177362082144 29640 7 -217685526036256 29666 10 3971933996815 29666 1 -197313042129965 29670 14 -39068043039253 29670 6 -196547432669 29673 4 1216151327439 29714 1 -4201994971117 29715 2 -4478053596409 29722 2 -183442991660965 29739 1 1240615708712 29744 20 -14289009074082496 29757 5 -4501530857069 29760 14 -5918356714863104 29760 75 5918356714863104 29766 30 13252973763200743 29766 47 -135355273066585 29766 5 -42761133735749 29770 14 -23376450104721 29770 16 -5993052526449 29778 11 -168029772877 29778 2 -28772024746877 29778 3 -5776392896189 29790 11 -567530026886421 29790 16 -5611910876649 29822 5 -900848202021 29850 8 63961821296875 29862 11 46113150163851 29862 9 6102774526108779 29887 1 185639116131656 29888 2 231282187453952 29888 6 -231282187453952 29890 14 -622709011184617 29890 16 376290505219447 29890 24 -209978352408321 29898 1 -3503332947429 29910 5 -252985405011229 29925 14 -909041016394125 29930 4 -1637682315733 29930 8 -39745855625221 29946 11 -1612470623359933 29946 19 471851428810103 29946 7 2164656189740003 29946 8 -15949086273469 29946 9 543161044187 29964 2 -5765102505629056 29982 1 -180665224095653 29982 4 -17714321843617 29988 34 -11886989229327744 30015 10 -309773224981656 30015 11 3156348731097096 30030 19 -43620067069669 30030 28 1753356303343 30030 40 -99255581714953 30030 46 -228061350217 30030 47 751803217703 30030 52 248906705111 30030 7 148711213064539 30054 4 15035977756063 30058 6 1465442817744879 30060 8 150354100861344 30082 5 228429190262403 30084 2 -196392502022464 30087 3 6257396799432 30135 16 2660338110787336 30135 20 -7756087786552 30135 31 -27456749784856 30144 11 17038287867392 30144 17 -17038287867392 30150 23 295798259662875 30150 45 -167538002315625 30160 18 19906994503232 30162 2 10152231869683 30162 5 -1241083492370585 30186 11 -641932616817317457 30186 8 23775282104345091 30210 19 -171325911200057 30210 29 337943907865237159 30225 11 30289724040889000 30225 20 918146884825000 30225 23 41340683953061000 30225 5 -304739208899000 30234 4 -1296490052161 30246 2 415488118589963 30258 17 -189239790327270345 30258 8 1786375468652283 30261 4 3372585452648 30264 1 -123434964679616 30270 13 464164836433759 30270 6 2468035647827 30270 7 -13065339689173 30282 38 -1521126102171025 30282 45 115104311919359 30282 46 -284424021708841 30290 6 -171738573196501 30294 12 -2641290798168369 30294 5 97825585117347 30315 1 -38046809405187928 30318 2 330313213512667 30330 13 -24575358596337 30331 7 -137594978755466904 30338 4 7376624370991 30345 1 163771765956163 30345 17 5705687890311751 30345 29 -16969512951627256 30360 3 2297931738588352 30360 5 -36211506221888 30381 7 -26973850369606633 30408 3 -194536196747360 30422 3 -62168479580845 30426 1 30041646635467 30430 14 -1339705985329 30438 16 171029737442943 30448 9 563380835711552 30450 10 478767092840875 30450 17 -1275562427958125 30450 19 -21593673108125 30450 23 -189590610753125 30450 25 -487940437649125 30450 33 25783770867875 30450 57 49351447051366375 30450 71 17864683625375 30450 74 -10204499423665 30492 31 240677727193728 30495 5 -8733735731096 30498 17 -47452279848475969 30498 3 -1979606056661 30514 4 -2605168973475749457 30550 23 -14939461140625 30552 2 12232878083782336 30552 7 271770715452032 30561 3 -140762666031476957 30573 1 -46158381571032 30576 16 -133180779211077248 30576 19 150540578361152 30576 46 -52583174028224 30576 58 23855784807232 30576 82 307040522622848 30590 16 -89084982169 30590 6 3763913628663 30590 7 -3679416497850633 30615 1 404501206888 30630 9 5880279310191323 30634 4 244422051751547 30654 8 -4003459088985 30660 17 10629175252256 30690 13 -38587469770269 30690 16 375163978782051 30690 30 5126930531806167 30690 40 322695581305311 30702 4 6242094120907 30702 5 -36089677295405 30705 2 -1300457656169 30723 1 -68901967038968 30723 5 -62306094754232 30723 8 35406423070291 30756 3 312586334130304 30794 4 54027405582623 30798 4 20356439093955 30800 37 -4256252568000 30810 18 -3018219806843389 30810 33 -271634215449817 30810 9 -11953783460457701 30821 10 8532850170600 30822 8 652179631519 30846 2 27035334455239 30850 11 -464632215144625 30850 9 -26904234840625 30855 13 -8482830452576029 30866 12 -97261034854609 30873 2 1769440022280584 30885 8 -1038735361657 30888 13 -3852708591168 30888 7 104023131961536 30891 1 -21334968103105 30914 3 666018232914059 30926 3 1638238007398483 30930 14 -20827813525361 30940 1 11161688353306912 30950 10 -12817515912525 30950 25 -1602189489065625 30950 6 -40395879983125 30954 12 -5404407239197 30954 16 -5048172146177 30954 21 -5962793746265 30954 25 545667870969215 30960 11 -58244806313387136 30960 34 5003488767988058688 30965 1 -5165505533591297 30966 11 -388319550039077149 30970 2 100749868722019 30975 14 21935019651175 30975 30 2741877456396875 30996 12 -1074960873552212352 30996 2 29023943585909733504 31002 2 -50765658356485 31020 8 -167440436673475904 31031 1 4959659371815 31040 14 -1951424 31046 5 -1282842833868333 31050 27 264443183287875 31065 1 -2333795494663133 31080 22 -8310655865678048 31080 24 16907951987648 31080 8 -366984048400192 31086 1 -9210660111333 31086 20 248687823005991 31086 26 39381944003199 31110 14 4148905528567 31110 23 -1217709964152919657 31146 6 -17495972709733 31150 25 1452685714184375 31150 3 -619437662928125 31150 7 -57885333121747125 31152 27 16225090551692864 31155 3 -1502260382974897 31160 2 896902681657536 31161 7 3251930737544 31200 29 84254149504000 31200 48 -84254149504000 31234 5 -615442713913 31248 26 140124287195712 31252 1 13902968647872 31255 2 -7462182229937 31262 12 -85340788148426265 31274 3 -2225077676721 31284 3 472619125405439424 31290 3 -216109633448213 31296 18 -5377930555456 31296 19 549713432319488 31296 30 -549713432319488 31302 12 -273881112113241 31311 8 1204732055045043 31312 12 237398689361728 31314 6 2463768973768303 31320 7 -92051645500224 31326 5 -2615575340161 31326 6 -2740644261925633 31339 2 -5543951901389 31350 19 45147708381471875 31350 26 13835477349771875 31350 41 361181667051775 31350 42 110683818798175 31350 56 72032601251375 31374 14 -364453662113001 31374 17 40385988659871 31374 4 13498283781963 31395 11 623305306038802967 31414 1 111703990526451 31416 4 -378157141728064 31418 1 1131708251105451 31430 7 -2308720775409 31434 16 25972731685927 31434 17 -87192106375049 31434 3 57062091513981619 31450 10 15547906128375 31450 22 61800946747775 31450 6 7725118343471875 31458 3 2535841866772459 31458 37 -929251428647689 31458 39 1905548825255327 31473 12 6338183101992 31506 16 928749120105896423 31506 5 -340891326555245 31535 7 38869828265771 31542 2 -13109703636077 31542 3 40626220555243 31545 3 2443969625092488 31563 4 -103079304660312 31563 9 3817752024456 31575 5 -68403504053125 31581 18 -264405602027160 31581 5 -609020985359160 31581 8 351923856298149960 31598 1 -506395917176869 31605 10 727690247901064 31605 2 271732410473923 31610 10 -79815269404593 31610 8 -12372427209349 31626 13 -120458845792053 31626 14 26492578063083 31626 18 -6043295342421 31632 8 -24196427786944 31650 12 -4018621297625 31654 24 -158457101836033 31654 8 -17139441882679893 31658 1 -14099986293013 31675 2 9230398813000 31710 3 110266872199758107 31710 8 32253525409482343 31713 4 306228616867259 31722 1 -14306177110733 31740 4 1186852108714624 31746 18 -51768746916589 31746 31 19918363327903 31746 38 748449176770884311 31749 2 2880885119912 31755 5 -150581818285336 31770 10 84319474923279 31775 6 -2290652987028625 31790 11 -4450186541861 31790 14 -6233701913937577 31800 5 1054059356786392000 31820 1 4437699809408 31824 34 -11317681748160 31830 15 70711931972159 31842 22 4089574615311 31842 29 8325268640392311 31842 9 -563701921693173 31850 3 -828912762369125 31866 12 35943987680279 31866 8 -21235678253873 31878 17 -65561809893751053 31906 3 -22746843214173 31920 12 840502696654144 31920 28 -107605439767232 31920 30 -17238111125696 31920 3 1406336254912 31920 34 18009608918491326016 31920 43 3635799140672 31920 46 4125392143721792 31920 59 49399136454464 31922 4 -87476283725373 31926 3 -675857335654189 31930 2 -71240405531912677 31950 32 2746371771016875 31950 52 21970974168135 31950 64 -30046441731599066625 31974 3 1185944252872067 31974 7 -838028826112285 31980 5 26278896310633088 31990 11 -463598015833 31992 1 92861342393536 32004 5 -44323112677248 32016 23 51880013918272 32025 23 -412370671340125 32025 4 -59622956494132625 32046 11 14332526045803 32046 21 -7885909661581 32046 28 77635308537670751 32058 11 -11469141083349 32058 7 -155295636779997 32065 2 4702836180489227 32070 5 -2376912343481 32074 1 -35215563320965 32079 3 1066618402063912 32110 13 -40784656193541 32110 32 -1094448439008811601 32118 11 -67099210643753 32130 2 -5050482300837 32164 5 64721156002208 32175 18 276537201741000 32175 9 10574838631893375 32186 13 9942723926222219 32186 22 -371459932475841 32186 7 -132491998187109 32186 9 -38193382348605 32190 10 -130492053708157 32190 11 -4352854754701 32190 12 -164088779509 32205 4 955402599582728 32214 18 -15629317877753 32214 23 888233569052311 32215 2 -12053141965881 32226 2 1098239310201115 32230 6 -66510460200141 32230 9 -670362776479529 32240 8 11751707850624 32258 8 97562304858871 32262 3 -1559060691909157 32295 4 -27988837523576 32295 6 -156506166792881 32298 4 119685006678455 32310 24 42351075002449647 32340 28 -3147873553209952 32340 6 314148444383872 32364 8 -1216661925536064 32370 17 -343060302505913 32370 21 -965754480833 32370 8 -221647349789 32382 20 18738930644559 32390 6 1463217984071 32395 2 -3163411723537 32395 6 -3881731001912 32406 8 72879116164255 32409 8 1888503221339775 32410 6 497745887387211 32410 8 -16569828697617 32430 19 -143266081501 32430 26 306307322684207 32430 6 -5855593539581 32436 4 -46643994370944 32472 21 585872421716160 32490 5 19495199907719739 32490 53 -258628020493761 32494 2 15007992464627 32495 1 -2705022602332309 32509 2 -642491261981 32526 20 2421125847377199 32538 19 -13296544268185 32538 21 82211846521247 32538 8 -2528354391229 32550 21 -31220701400125 32550 26 23334557580825875 32550 34 -309669520403125 32550 45 43660428934375 32550 6 -1088108532189125 32550 67 19393351861124375 32550 9 155146814888995 32565 6 -11859400186993 32592 31 -162816717877696 32595 4 -2857965535288 32606 6 21204610009183 32630 1 -195207791448977 32634 17 208342853751627 32634 44 53402977381887 32634 51 -43550677145745 32634 61 -239753949761025 32634 9 -466513378853949 32658 2 2761698048773188730923 32658 3 -1108778044085 32658 4 -17655745365965341 32670 25 -32365362047733 32670 42 -403943355438777 32670 4 45790624212003 32670 56 10360011112786071 32670 6 -383704115288373 32670 79 873864775288791 32718 18 -60370134066841033 32718 5 -73131292744021 32721 2 -637748640385784 32725 11 5080907498038875 32725 15 321489998325000 32725 7 10791819081000 32730 16 -7229093733359857 32742 1 355219275577491 32757 6 836359098371 32760 39 18424777506624 32775 13 5605396496875 32775 23 257579834504112233000 32775 6 1990616103829000 32784 3 4994024552595008 32790 4 9191081431403 32799 1 54472457080072 32799 8 -552514399645528 32802 2 -4863983800157 32813 2 -15957551247389 32850 43 -170005875647625 32856 15 2058873630254144 32864 7 1663885737792 32868 3 32288476277952 32880 6 -45156891084992 32890 15 397664427103839 32890 17 8503878584151054359 32890 8 -8838117849861 32912 12 -943799851988928 32926 4 -2157798668158801 32929 2 -8299889626257 32934 1 -316172217144595877 32942 6 -1333529077609 32946 15 -942510500682209 32946 24 115494092199647 32946 3 -914214737980709 32946 6 -817050334072213 32946 8 2933041757915698091 32970 14 -14054971648409 32970 8 82654130420891 32980 2 78492490091712 32994 11 -1668754583849601 32994 4 45056373763939227 33015 4 -853245924965272 33033 11 -203327303890040 33033 18 -668983478218264 33033 9 170806201303375 33046 2 -295310456397 33060 11 -188598642574816 33066 13 1445327743812939 33066 21 33001258556583 33066 23 -2538209173959873 33066 3 68531647696916571 33066 5 -6535467076077 33090 14 2538708704191 33090 21 29118685609799 33108 4 -61879811373152 33110 16 -41071013263421 33110 23 -6941892440897 33110 30 1154614274720479 33135 11 487795217781851 33150 2 -121476861522125 33150 33 -36117345293932625 33150 63 -8057816340625 33150 8 -22159807146125 33165 15 -7232911698744 33170 3 -6702887355029 33170 5 -467647279208873 33174 4 -274079551102749 33180 14 281885669792 33180 16 14804934770816 33180 9 -114966502879278464 33198 4 4822974919236691 33201 14 275013865965096 33210 13 -36057959133057 33210 17 3346267655727 33210 18 -14101014265713 33234 1 -18145734127525 33243 2 -10194233929417 33246 4 24089779527255 33270 3 599867141546251 33276 1 304230152891008 33278 3 -687420154261 33278 4 -101679220110313 33282 14 -921769840155069 33298 1 -131111145796437 33306 15 -250033029084665 33306 16 5771279276335 33306 2 -120473551021517 33306 6 1079532388922447699 33306 7 -367470364348292869 33319 2 2265282425813347 33340 1 -72070184693797407296 33342 3 118566242574407 33354 10 -5367177483993 33354 13 -29635942903569 33354 2 48248120302659 33354 7 3637779746773167 33370 1 16354908737335547 33390 16 9203895615622707 33390 19 8835834848499 33390 20 -321510283469901 33390 44 -13751664157155609 33394 4 1823960425463 33417 5 4341909455208 33418 15 74971670562703747 33418 2 229146303845627 33426 6 -5301240090849 33429 1 13958140963618675 33440 21 722603845037952 33440 7 -722603845037952 33450 18 -182827559578625 33450 25 1624600520183375 33456 14 4465697753152 33462 14 -17892970880670405 33462 35 661487376550923 33462 45 662702625210015 33462 64 -6028175703128553 33462 76 274016989276653519 33462 9 -2574914584437 33482 1 -16050967994286333 33488 1 -1201813688347264 33550 6 84370149962875 33558 12 34103518020690299 33558 18 -18210396547601 33558 21 82507676518135 33558 22 40448819544967 33558 27 -150964276005593 33558 37 -36710724031632001 33558 8 -724070211733 33558 9 432541723165019 33570 17 4701413288943 33570 4 -140297096608533 33570 9 -12253733117937 33592 10 -540244683084608 33600 191 50883917120000 33626 10 29390584784183 33633 2 328076933365512 33635 14 -108247012500024 33649 4 -776695015601 33660 8 47867826488256 33666 16 20603640659329367 33670 20 -1935597469833 33670 23 2799672728800247 33670 5 1178124099208659 33672 8 -751617433190080 33702 15 199145669581439 33744 5 -6537796470836864 33745 6 -64291328095896 33759 9 -369404780113413 33768 14 -29240045047346400 33768 3 789481216278352800 33796 4 -216204095967840 33801 2 -45063056902904 33810 12 -626018661176237 33810 16 11048975471611 33810 27 -59610696934323493 33810 29 -26921376841933 33810 41 -836194520928781 33810 61 -615762405078569 33810 67 -6777275778280889 33810 76 32105260388663 33813 8 -3574414638589725 33825 1 -26378470895158520 33825 25 -3297308861894815000 33825 5 -13318076303000 33840 27 -28772042470848 33840 30 776845146712896 33840 57 155768600245824 33852 5 -30342889272032 33864 2 -46876732873280 33866 2 -211720480115116355389 33915 16 -12747397841389 33930 16 8398263306051 33930 20 -185549438945313 33930 33 76481979904719 33930 6 35718256603251 33934 4 -932211065047445 33963 2 5322632906611 33966 13 31437976440735 33975 16 -1292321721771000 33975 23 150458468250375 33984 56 16524466076160 34010 7 42949256470551 34026 2 -166390015141 34026 6 -20633828029217 34026 8 -346380970405769 34038 9 57361248831378663 34050 4 3601290005875 34062 2 11831098404691 34075 1 -5214330919125 34080 16 -1231031664016768 34080 24 1231031664016768 34086 5 60321028022918551 34096 4 5820022594368 34102 12 106117893374197319 34102 4 727177687026595235 34104 11 -16705711759744 34122 13 522099716760919 34122 22 -11478422050781257 34146 2 11570362308315 34146 9 -428531937345 34155 16 -16463423049048 34155 23 18482005764775656 34155 5 -499014155648942712 34160 18 -39179634268608 34194 10 15402014342063 34194 5 6003769578175 34224 1 -820863698336 34224 19 265610404019008 34224 31 -7641281103040 34224 37 -982641502380736 34230 24 -9001333143361 34230 4 82780765088363 34230 9 -102979778416105427101 34238 5 -1992127318857 34242 4 1363552087422923 34242 9 2758457879874379639 34251 8 -5433384941432 34254 13 -71176271946263325 34254 5 237676290065811 34293 10 114559881836471 34293 15 -396447283009 34306 4 -9402591816377 34314 10 611081753772923 34314 1 -11118335449229 34314 11 464380499595851 34314 17 99365880366199 34314 22 12126972333743 34314 24 -107003940973201 34314 7 84938956828033211 34320 19 7734110619968 34320 42 5243964714496 34320 44 18035811983168 34320 45 -21573770272192 34320 56 200530273315904 34320 63 -3871421159104 34320 65 17014751976163904 34352 5 846927005235709248 34353 2 10542350588751 34353 3 -284643465896277 34385 5 -230003643938392 34398 20 2006699915922723 34398 34 1291196286524403 34410 12 -73764839363633 34416 4 -12945237607008 34450 16 -118036678625 34450 21 496587412047375 34454 4 3224292163779007 34470 2 -3058028822663397 34470 28 112864890439719 34482 5 -751652828893 34494 3 6210670179419 34515 3 3401648400168 34527 2 12823997889896 34530 3 26181443151847 34545 20 83267655284888711 34550 2 51074602693875 34550 4 -1018181154096125 34560 25 -15293211844608 34560 2 -51614589975552 34560 30 412916719804416 34560 37 -412916719804416 34578 7 570692778289371 34590 10 -2996784835921 34594 7 -59533775625681 34602 1 94376581085323 34602 6 -119035960384141 34608 21 -283825278539200 34608 29 21477189396032 34626 1 -17573567343316253 34626 7 473807437158331 34632 5 -19802843542380384 34645 10 87222163589171 34650 100 125944992410175 34650 102 -45178507265625 34650 113 -1051964528315625 34650 114 3534384718254375 34650 14 28275077746035 34650 19 172146730804875 34650 29 -98952412060125 34650 50 15743124051271875 34650 57 415686774301875 34650 74 252538473225375 34658 2 83611860515695 34662 3 -236965585944203981 34662 4 -4571940557573 34662 7 -35589096586693 34671 3 -13967659580120 34678 2 6601593714003 34680 12 -142774115286464 34680 44 749239137973952 34680 48 57529906203862592 34692 9 264146376823840 34706 3 -1818820022048821 34706 5 -78970013043940621 34710 23 -138307623641 34710 27 -14258957091209 34713 11 -59657543333109 34746 4 -35163749580661 34752 29 -30694714932736 34770 13 344083072316939 34770 26 1603575811293047 34782 25 -5306914759537 34782 31 9896512209911 34782 4 33505647401490139 34790 24 966534389728081839 34800 63 -1431301400000 34810 17 -56088777113945721 34814 11 196160703514451 34814 17 229049205483007 34814 20 3565425594720223 34814 22 -4035278983177 34830 11 24935094875151 34830 13 11422172664783 34830 3 -308398661949141 34860 8 -414310149354592 34873 2 1834963599595112 34882 2 1751371589475 34902 3 71005255004813067 34914 10 40396586493331 34914 12 -62324840036917 34914 1 -491505267864358277 34914 22 23043762981202519 34914 24 308673321054463 34914 3 14382787829582899 34914 31 453673147980959 34914 4 107759719893043 34914 5 -37460407991597 34914 7 219463162529491 34918 4 -1016699361840729 34920 6 -352411003822464 34944 11 -76188069910016 34944 19 76188069910016 34944 22 -9523508738752 34944 29 9523508738752 34946 5 18226709387825291279 34950 25 -2776576846625 34950 33 -4158288906625 34950 37 -724983267813625 34952 4 239904514749888 34965 10 112088372897367 34965 14 -4151421218421 34974 10 -42518193126741 34974 25 -27354080897505 34974 8 73073116807821027 34980 12 23787628020512 34980 14 -75857008982752 34983 12 54894401543943 34983 9 -3061588560834141 34995 4 -4434137715277 35014 5 -1303200979022825 35030 1 -6542573886917058077 35030 6 14556148580339 35035 5 -92008211820273 35035 8 217047538082088 35046 2 -89939640387429 35079 1 3144497122675 35088 18 34849490511680 35090 15 -77724396492826193 35090 3 1126020269358812267 35100 8 -289508898492000 35112 2 -17894042133344 35120 12 6369051696938185024 35131 1 -755923448089765 35150 6 -422987120190125 35175 12 820438893170875 35175 22 -987315928075000 35175 29 87805715609375 35178 12 117654026628802715 35178 20 -4937506743889 35178 23 -6594274273393 35190 11 -1495332279948213 35190 14 190616095270827 35190 18 -583753948690293 35190 19 23893871808051 35190 25 141218992359099 35190 36 -49026629108402433 35190 45 8149897088991 35210 7 26589046208103 35211 14 -381788046853048 35217 2 31884859420695 35219 1 93590554086163 35226 1 -87085921499325 35226 5 100152572074479 35230 6 -5813398675161 35245 9 -5739431534829 35265 6 67121187858728 35280 24 -74510602100928 35280 3 1245618916339392 35295 3 301507105879 35310 15 -8940952253681 35310 21 27009442879703 35322 15 1015811221009859 35322 4 93413205018368803 35322 8 -296236802396429 35334 1 58895954669475 35335 7 553155965992 35340 4 15490838065190176 35346 12 -682940987513 35346 1 -63119086299609173 35346 4 52036773162211 35346 8 -5043476604133 35350 9 -1782326948841125 35370 12 2423176513040894679 35370 2 -89747278260773877 35376 2 2212728094328950144 35385 11 2883019347368 35394 1 1009043901593947 35409 7 -1433059723179395128 35442 15 131998984747623 35448 11 -449759274178528 35462 2 4869417578350299731 35466 1 -25408214916033437 35472 13 5815665346112 35472 9 -95874869000007872 35475 5 -476104970711125 35490 16 3373444343194939 35490 21 -632544903483389 35490 28 407460751750403 35490 31 2560575247702667 35490 33 -1874422896510830653 35490 3 -52856131239197 35490 37 104305967095499 35490 42 2483679116607498251 35490 55 3116369738287 35490 58 -1315546808304833 35490 63 754000816042279 35490 65 25806923048533159 35490 7 11746437436747 35490 74 -226143418311161 35490 76 20810617322599 35490 80 -11805075432932977 35490 84 1130486625674783 35490 86 57141595628498303 35490 92 -853173826359049 35490 99 -1195910593948827289 35502 1 -7555205032253 35511 3 -2381892063250141 35520 19 -14677304777216 35520 41 271905671366144 35520 60 -271905671366144 35520 63 359476299841024 35520 82 14677304777216 35520 84 -359476299841024 35525 9 -1027750810807000 35526 1 3130325838309547 35547 1 -164094061910309 35550 12 3794069697073875 35550 16 -272077615747054125 35550 34 -2309783932265625 35550 48 -127202617022625 35553 2 310833817771247 35557 2 43441254074600 35568 29 196332109512768 35568 30 -5300966956844736 35574 26 321819159561515 35574 36 -4738378768365781 35574 37 -7761061 35574 40 -116105186313809 35574 52 -1995355104001721 35574 73 -428341301376376465 35582 5 -5036655687425 35604 2 -56775678351840 35607 1 142345886523976 35610 5 152718409110851 35630 4 -8056107415637 35630 8 96748901115607287 35632 2 -35525182468384 35640 23 -62395968097152 35646 3 -5434487160101 35664 11 103449534459200 35670 11 -321702493604761 35682 11 2392289895902352967 35682 9 1435626253423 35690 8 -1234938374674881353 35693 3 -31464885775177 35700 14 -19968021548000 35700 23 -151348921100000 35700 26 296806845572000 35700 39 -30588613516000 35700 40 -160444191088000 35730 11 -1142957454201 35730 7 420553071235719 35754 3 246955953511 35760 30 56594963780416 35760 36 -317724713483968 35770 1 -3530716025930037 35770 18 353042365676651 35770 4 -121093531427091293 35796 2 -54575990811008 35805 3 1408432413583 35805 8 165705542924104 35810 10 18841902684463 35814 2 20784134867909003 35838 6 -1169614000170477 35847 8 382125636703002312 35850 17 -87035794958125 35850 27 86655773126375 35850 3 10897123929344875 35862 11 -35671246288350065 35862 13 1495406697031 35862 19 1669745648642255 35862 3 19212078488635 35880 10 226232778695968 35880 4 -75651105104992 35898 1 -73212024826853 35898 4 -29582457519905 35904 1 15695570238976 35904 32 43246467616256 35904 71 -15695570238976 35904 79 -7070666908672 35910 2 38954999072907 35910 26 -336689004513429 35910 27 421706281940623539 35910 36 -11386069612396835553 35910 47 -66951828321993 35910 53 -1051784974968489 35925 5 -3829577975000 35938 1 -137993768882691525 35946 11 -5224507598097 35955 11 299878878328757991 35958 8 188715184286903 35970 12 -42614490983293 35970 9 849864090656611 35994 10 54294816747023 35994 8 -579241226450705545 36012 3 -7578244283000192 36018 15 -264381903690806385 36018 23 -29495637461889 36018 8 9791922358918755 36036 8 212275660254624 36050 21 -301645921396625 36062 4 -509463435786345 36075 17 74538703554875 36076 2 -76893114749543258688 36102 5 107070874705639 36102 7 -3179697691985 36108 5 -9916953110769024 36112 11 -6840617518016 36113 4 189323687894607 36114 4 885119552927 36120 25 -2474597389909184 36123 1 -4050630499177 36134 4 -114772593949217 36135 1 187600118572008 36135 7 -74823299432856 36138 10 428889517205887 36138 5 -17423195761161717661 36146 3 68002056070168931 36146 5 -378705691305 36150 14 2881623910254875 36150 16 70818266418875 36162 18 -7632435378141 36162 40 58684841296767 36162 56 -3302802101906937 36162 61 432009968265351 36162 68 941792023944135 36162 7 -1584490715012709 36162 76 -42066420009705 36166 10 22786160511477987 36166 7 192708551895587 36168 3 -192654512620640 36176 16 -29566339701184 36176 22 -3198029972278464 36176 3 -12744833955633856 36176 8 531840465242547264 36186 4 -125319863699533 36186 7 869095979711 36190 5 -8830342104855392213 36192 16 -37561583631945664 36192 3 -3686800666112 36192 7 37561583631945664 36210 5 -10938727473881309 36218 8 -882850358210185 36225 13 69916890933000 36225 33 42933018897000 36231 3 -59919572119248269 36234 1 -778136388083181 36234 21 28819866225303 36240 28 -24506248946176 36246 8 71362588047031 36246 9 -5514747011043353 36270 1 -12032507282292333 36270 12 7669420276373780283 36270 16 -49719895833717 36270 18 3125831428244907 36270 28 158741677309657779 36270 33 445648417862679 36270 41 42380335376703 36271 3 58974672722536 36276 2 -3411794597696 36279 10 67776088100616 36279 4 -12210782256792 36279 7 -496846884785337 36285 7 -4340500549912 36300 43 -7948956550348000 36309 18 -172941193000009 36315 2 -266562551133 36322 5 2407290763614911 36330 16 2013328898099 36330 20 -77410828522189 36330 25 -13142609569601 36330 29 27297266825807 36354 17 -1743419225971657 36354 7 31424802489539 36360 9 38300802371136 36366 13 -16457662682657 36366 7 2700403016589395 36366 8 -35417745612613 36378 11 8267507809839 36393 4 -74573393677721 36400 45 1269136389032000 36406 3 1462732177167 36414 12 -123477021084090717 36414 20 820243426042251 36414 44 678583262623743 36414 49 -319309971061689 36414 54 3333879569270449359 36414 66 377523141055551 36414 7 8621369218665603 36421 1 60605716380616 36423 6 440559270216 36432 38 -3272756014754496 36432 47 -43838867328192 36432 67 8851592305728 36454 1 -236819115660005 36456 1 -67959675131264 36462 16 4331087474471 36462 3 -38863762912061 36462 7 1495256437603 36465 12 -353807484723269 36465 8 971224237086020776 36498 1 13338952022467 36498 15 35272932001075 36498 18 175090066509779 36498 3 3068614777841803 36498 4 -526825310400773 36498 7 -2557870827245 36505 5 706046705902216 36510 11 -1318083279636601 36518 5 20361180441455 36519 4 -24287516079749 36530 8 49946103323767 36540 8 56518438285728 36543 2 -21847565065013 36550 17 26047803141363375 36550 30 -42404941715625 36570 6 -1253445562651013 36570 9 8002286216555799707 36575 5 -80506159091000 36596 4 -4797923086720 36603 13 -15211527617666205 36613 1 692317598261480 36624 18 158692482656 36624 29 14485888473501248 36630 37 1498216139743239 36630 42 -5942522868668721 36654 7 37369598274559 36663 6 -2048616325259416 36690 1 2243245173283 36708 5 -97011250959680 36708 8 -66567066704704 36720 18 -3521289444196032 36720 24 95074814993292864 36720 25 -34246219516416 36757 3 22933545385649255083 36762 3 -7074913515029 36762 8 177877045271179783 36765 2 2994680810996136 36784 26 95020595055936 36792 8 43512866159904 36808 3 -524495196310400 36810 12 1992794489099811 36810 13 -6801893328208221 36816 16 -4936892838410944 36822 27 -4094796136280027113 36822 8 1315831370685787 36846 20 -3145299802857 36846 25 23195019200103 36848 19 -346383756377792 36850 12 75113865071875 36850 3 24034671548875 36855 22 -132117556675896 36855 5 -52411353090552 36873 6 -61234431343416 36876 10 -1195952413001536 36876 9 -13602175018048 36890 12 50760083168041967 36890 2 5522541235723 36890 7 -3231615137586669 36894 1 -447948731562500308301 36912 4 -10930116950720 36946 2 -53173047974669 36950 1 -31306240503125 36960 1 -103257625939712 36960 21 103257625939712 36975 16 -233180175190625 36975 22 -5474804874625 36975 26 -215846147107000 36993 14 6254275560776 36993 15 -348210283141 36993 9 -55582110773720 37009 2 3438464771295 37026 25 1101663491558751 37026 32 -20765026737971505 37026 37 3035445911573031 37026 4 -12334148666320437 37030 13 -4431952014564789 37050 14 945472917671875 37050 46 6183317492221375 37050 61 -340009146024625 37050 69 7563783341375 37053 5 33471152098407 37053 8 -10484845750584 37056 25 -9868439623168 37056 38 9868439623168 37080 19 3819117423185856 37107 3 289423734684435 37128 30 30377156655392 37130 8 -666795271697 37140 1 -10011783185792 37158 13 123587910652607 37158 16 538750895326199 37170 1 -1417681714022536437 37170 22 38277406278608483799 37170 33 -2347528871217249 37170 34 -4865233561929 37170 6 -93208103145261 37185 6 -212781619606861 37190 2 -13011346385033697 37200 24 -87260016952000 37200 67 -7633906374680000 37200 79 92474323669736000 37206 30 -45402883304553 37213 4 3073437789704 37222 3 16654161920510007 37230 13 -2224818919275157 37230 19 28558044186247 37230 21 -6864235882793 37230 2 45573081386563 37230 25 -1640558316457 37230 7 -342103858049469149 37240 4 111214315027872 37264 6 12217472042048 37275 9 -28819588731625 37284 1 -6885912672224 37290 1 10849237558651 37296 37 -1000136171320992 37296 61 -2315435094913536 37310 11 -112343599312564684329 37310 4 13554853008003 37310 9 -40418844843094353 37323 5 -315998772410745 37338 10 -18624664192645 37338 15 33954835992329791 37355 2 3320485442559 37385 1 -14118094958977 37410 25 -62519936632073 37410 39 -458220496937435569 37415 1 244880923790376 37422 1 -707780826814221 37422 21 26214104696823 37422 25 -34749524692161 37422 33 14970542127183 37440 96 -145597136090112 37440 99 145597136090112 37450 1 -28873030536125 37485 27 -31987514643806232 37485 4 428898985103043 37506 16 -6207262025581 37510 10 28712825148060647 37518 10 2139808332635675 37518 13 -56877165276425 37539 4 4817158801623 37555 2 606920567688 37555 9 3045918007012616 37570 16 -8535072444835321 37584 32 -212612994120384 37590 19 1116275103770903 37590 6 -2560052335357 37602 7 -3064377646773 37620 5 -328645962089568 37620 7 4328834011655328 37629 1 18186763444803 37650 21 -234964252344118625 37650 2 -8549061570125 37653 5 -63484730722421 37660 3 1792820756724768 37674 11 -4406203967229 37674 14 14314945171311 37674 15 173304581155623 37674 9 -5064572974439133 37680 15 161196860660032 37720 9 1514838137263264 37741 7 6131905806007 37758 13 9761926383775 37758 20 6407286842879 37765 7 -2592245990881 37788 3 -4524490565255744 37795 4 -26766168596369 37830 16 7886244068764543 37830 22 -6924106954513 37830 6 329663077975531 37835 3 11421458339831 37840 23 280714047004224 37840 26 423050994626624 37842 10 -37186132025701 37842 12 -366655861702611685 37842 14 24331616489503 37842 7 9421846866235 37842 9 8395506346555 37848 2 7547228518524544 37862 4 726778698471 37884 1 1507678777731232 37890 14 -65909568728673 37890 9 -40677518017150461 37895 2 46226020461809768 37905 18 -77787085878424 37905 23 30550495219019 37910 9 -1431842735161 37920 14 15591201446656 37926 16 -28545671068173 37926 18 -3938053687090173 37926 36 672770956823343 37935 5 -22484610329688 37944 6 195173337983904 37950 26 18812907204875 37950 31 -236744503382125 37950 34 -20800072415125 37950 45 -28019655255925 37950 5 22533461812988875 37950 62 676655202244375 37950 65 -3502456906990625 37950 77 69426717491375 37950 79 -91068063927625 37950 89 -13427895390625 37960 6 -9777730577984 37962 31 -76540496478926265 37962 5 2066593404931009155 37986 3 2972688532833172015 37989 5 12248470858964040 37989 6 -453647068850520 37994 2 -6862764379399533 38010 10 -2091776939533 38010 13 8595627110531 38010 1 -3986771989733 38010 3 2791678502971 38019 5 -11188399825016 38025 61 -164947861333125 38052 3 -818440741162080 38082 11 -5162709435049 38082 9 -20975229108017 38088 20 9543027188836800 38106 5 120792924891243 38110 3 105867430459219 38115 16 -11831013254808 38127 3 10808864118827 38130 10 9916431173731 38130 14 26172959743691 38130 16 15473658700619 38130 22 2302510489447879 38130 24 12022495846487 38130 6 226038846986659 38157 10 3202502190056 38157 11 -207343120249 38157 5 3947621096168 38157 6 -9515545465597912 38160 36 -495200934237888 38160 38 14666687835584832 38160 5 227676821065860672 38164 1 -1010674180160 38165 2 28706023871227 38184 4 190039877049536 38190 20 -84232748470141 38190 25 -11239035616601 38190 28 -16150299393689 38190 31 6022947414167 38192 11 13988883137064256 38214 12 5329089930807 38226 3 -5891817852377 38236 3 23298372441282958272 38238 3 35121911202287 38247 4 12967013715983 38258 6 -6174198550097 38266 3 -242372421642061 38269 8 -11437782127597 38280 1 -33745715100512 38280 14 1437838550907328 38280 2 -3409984921912928 38304 20 -507258167506560 38304 28 -34999188196608 38304 38 507258167506560 38310 16 -13281016946689 38310 7 -88218923306993 38315 1 212869212701968359 38316 1 853180555786912 38346 16 172213553658455 38350 23 -167497825395185 38350 25 -103703620243625 38350 29 416119207449375 38350 9 50670122846075 38352 10 -840381488456192 38370 5 -12850975948779341 38370 9 28995615614843 38376 12 -148678152324480 38402 6 126880009476144379363 38418 3 -6616220498317 38430 12 3862291673547 38430 17 -16528908207069 38430 40 5797890379165599 38430 41 -223641702624969 38430 8 -5889692326973517 38430 9 65843577201123 38433 2 -3539810223512 38440 8 -14543841405739328 38442 10 8613373860127 38442 14 1208187110591 38454 1 -26239182965 38512 4 667558591829568 38514 14 -21069548890957 38514 1 7226855269598251 38514 21 1045605699681515 38514 25 -74674808743409 38514 6 58315535988787 38526 3 3625919652959 38532 15 1039225021240912064 38532 18 473020036978112 38550 8 423926960802875 38556 6 105590256986304 38571 7 1721961361398613256 38577 8 656226684723492903455 38592 16 8637334319324160 38592 28 -8637334319324160 38593 2 14931454281967 38598 2 -3582460542473 38610 27 -11283651190004913 38610 39 -3228894493137 38610 8 417913007037219 38619 7 123330151467144 38626 2 11642237427087 38640 35 -114894442930112 38640 4 -302760038480192 38640 48 2199252222784 38640 60 162500630817664 38640 65 -156024633642688 38645 2 139554206883 38646 31 -1844009199945 38646 33 357297330333814839 38650 20 147014622295906375 38675 20 65148519645000 38675 22 -541000119815000 38686 3 2430831545536555 38690 11 273184971247 38690 6 14036728596219 38703 4 53919606010591 38709 11 424713065159016 38709 6 -18431167827069 38710 13 -87082672844853 38710 2 -34126902957357 38720 50 -3448480701952 38745 10 -23584015742904 38766 10 11485886804316595 38766 19 929175850977011 38766 22 -9387015881650217 38766 4 -3785534049914189 38766 5 300054654291547 38766 9 1052834380723 38781 5 -2460546552096045 38790 10 -32167746053109 38794 9 744208977293991 38805 2 -2596557276157112 38805 7 -23897438334073 38808 25 209563201735776 38850 10 -8664596946125 38850 26 -827207255125 38850 27 -3547632693205 38850 30 -44427908567125 38850 55 46587949861375 38850 61 -443454086650625 38850 6 -18520396839125 38850 64 35548939793375 38850 72 -310975282878625 38870 23 -788440553212102713 38870 41 511340044619079 38870 5 350576706693707 38874 3 118904583385691 38880 26 228086389569024 38880 39 -228086389569024 38896 10 -749975794789824 38902 1 -41135526042317 38922 9 13594335840071 38934 13 -245688459197194593 38934 2 9099572562859059 38940 12 -53496414263872 38940 9 50995478858176 38950 7 -40882056192125 38958 3 655855434419599 38962 16 122022816037947 38962 25 -2601810257134913 38970 14 517525772817447 38970 21 -1492599556437561 38970 4 -13973195866071069 38976 19 21324996726272 38976 39 -21324996726272 38976 4 1961030012276224 38976 49 -1961030012276224 38997 3 -10831091622150456 38998 2 -266322053274813 39015 2 2628932445064872 39018 6 -8313297878033 39030 8 -30688943243561 39039 14 10205541888852232 39039 20 -4337926004152 39039 23 3828308931056051 39050 10 -47864339498125 39072 14 29589440865920 39072 3 -29589440865920 39083 5 8910642793096 39120 37 -6527071087552 39123 7 -6165361149912 39130 5 -219428546984037 39130 8 -774878272533 39138 1 -20409611397605 39150 5 -17909627401125 39151 6 -1058182968013857 39160 4 -30410836813152 39162 4 17380154566115 39184 9 228937046289945892416 39195 14 107185127649768 39210 2 504018157267 39221 3 3352232199016 39246 3 91788878704859 39246 8 108531317119592447 39270 10 -320470454989133 39270 14 5742522058771 39270 19 -930551997941 39270 27 -139098763405477 39270 29 -3990793900149253 39270 33 -9253270457677 39270 36 51548472245411 39270 42 -932514154472629 39270 45 -17100944153 39270 51 -793090402696817 39270 62 671402245412545487 39270 64 -126851172605137 39270 66 -1015482886078753 39270 69 17163193431959 39270 72 -164478426108413689 39270 9 211042403651323 39294 11 3809994569321571 39294 16 9486592997535 39294 7 -10252599973893 39303 2 -244675953053505 39306 17 -2672124310729 39312 45 240922922266944 39312 65 374427972650304 39325 17 3184783525000 39330 11 13437385007643 39330 14 61227749744163 39330 17 -6961320775773 39330 20 -52412256816193701 39330 26 44991641207979 39330 27 893554025347071891 39330 33 -76608740535633 39330 39 103941413792622207 39330 46 -82031482789209 39330 51 13241413962639 39330 54 -65756890715063049 39330 8 -9348769417376133 39333 4 -530196055408081 39339 11 -253433174544893592 39339 2 9386413872033096 39342 3 -73158312135869 39354 13 -738975208481 39360 48 -24052698003968 39360 5 6807650194432 39370 6 -1953242186750001 39382 3 23053335948467 39390 17 -26293538031769 39396 12 -1664239633769440 39402 10 -6858032445333 39402 7 72077228901099 39403 2 -48125460463352 39405 7 263296032488 39405 9 -14353335529201 39410 4 -330549246469 39420 4 84097142254368 39420 9 -2270622840867936 39440 8 3410150396551488 39450 12 -738077716847125 39488 3 2896355663360 39490 4 -3077801845381 39490 9 -252818651974409 39510 9 2686943684645796807 39534 4 33334370129503 39550 2 -1121226888852125 39550 21 441474257147750860375 39576 6 -2773369053310528 39600 42 -757860339960000 39600 89 -548364145752000 39606 3 1038350603827446715 39606 8 -80893923280885 39615 4 -94281560047241 39618 11 14627870845479 39618 4 74247433545915 39624 4 363209925860051392 39627 7 1354133740392 39627 8 -23395355800976664 39634 5 -469931813497 39642 5 2641833936755 39642 6 9606653823799 39644 1 -50204704832131456 39655 1 -156892096652248 39672 4 784076790296160 39675 22 953471038549375 39710 21 19591957492198983 39710 6 -1789656818595533 39714 3 -1523852680933 39726 3 148256430789267 39732 3 -8454387830624 39744 36 1083159278747136 39744 54 -40117010323968 39744 73 40117010323968 39744 96 -1083159278747136 39746 2 -230342822744805 39746 5 -200386626609401 39760 16 180344609162091072 39760 21 719645532544 39780 20 28751099222182176 39790 3 -4116310101445337 39798 11 -59601280368393 39798 1 1609234569946611 39810 2 -18981983018557 39830 2 9825755337747 39837 13 -8837020108889 39856 7 -2761110036928 39858 1 1270722550341763 39858 15 -31451012508817 39858 18 6121741119559910207 39858 7 304117822985075 39862 1 -20911668260309 39865 4 -9210381139448 39865 7 -127967850876312 39865 8 653244769288 39870 7 -497987268463701 39870 9 58560723523971 39872 38 -5950200685299200 39872 9 5950200685299200 39882 15 -145993601263229 39882 16 -655221898638413 39882 22 -211899638363149 39882 3 -26306378187763589 39882 33 -129243236036482512757 39882 38 714934130601079 39885 5 3001997515816 39886 9 166245560970139 39900 6 529726716100000 39903 4 -828302755382389 39906 3 -13633408835973 39960 13 -318012510839616 39960 8 8586337792669632 39963 3 -5109136112053 39970 3 4624212735099 39975 15 1218676740965000 39975 3 113956864865875 39975 7 -151296948971000 39978 7 2826343373211 39984 15 -68387030367040 39984 32 1002112820091712 39984 37 1367707758872896 39984 44 -22134313041344 39984 48 -135739524681152 39984 65 -440258860345472 39984 75 7592069373180992 39990 18 -3298473672713 39990 5 -459782763238421 39990 6 -1856349017685613 39990 7 -16622866173709 40005 10 -9123991829689203153 40014 15 -29356040872809 40018 2 -4959491819805 40040 10 -408761490123088192 40050 17 1097801301328875 40062 6 2089595279531863 40075 14 -2840055875000 40077 3 -1487468522140893 40089 4 -373565857825 40090 2 -652820172057 40107 4 -130105856055498877 40110 13 -8345753390953 40110 3 8625285258377289067 40110 4 1073751500611 40110 8 -10164223388341 40150 16 -677711312768125 40150 36 2569143871354375 40150 7 20553150970835 40152 6 39523936074848 40154 2 -43485044799961 40170 1 -1174391198589077 40170 17 1354020479237087 40170 4 10403550539299 40172 2 3627476648576 40180 5 365937366404736 40182 6 8020437493067 40182 9 31252377329855 40185 4 37330130835003528 40194 22 1036757257713099 40194 34 -900207447201 40194 43 -96565247243793 40194 48 -14772440582649 40221 3 20525210741691 40230 12 206642610262899 40242 3 74655733637359 40248 20 -9559909966091328 40248 4 354070739484864 40260 1 -9005291991874487168 40272 14 63058762516544 40273 3 50978421221903 40274 8 99898170688367 40275 20 17434413574533000 40278 14 60281861452687 40280 4 32241046078144 40290 14 -1412805000493 40290 28 -11966339572273 40290 4 162976090733083 40290 9 -13524926845229 40296 10 -16280759624896 40310 10 5651248994731 40310 17 189477846523423 40310 23 959045594471 40310 30 722273487400359 40320 54 -38892212597252736 40320 80 4861658358093888 40320 87 -4861658358093888 40320 94 38892212597252736 40326 10 -16843056666229 40326 18 -31960242451025 40350 15 1015729247009375 40350 4 8125833976075 40362 19 81143448683096771 40368 12 1088479397426573888 40368 36 1654930663889984 40390 8 -167783199193 40401 11 -70026938924769 40404 4 1596841672096 40410 13 -13304798914401 40425 29 -22985847344600 40425 4 -577150106553125 40425 50 -2873230918075000 40425 6 352912514437000 40425 66 -187203508975000 40426 2 -4744055322150714117 40430 3 -1999320386296121 40434 12 6169558600495 40439 4 -15630225786477 40446 5 3338963912619 40455 8 -418688174468952 40458 2 21865395681523 40470 12 3007437648787 40470 13 -11550204697589 40470 15 -76517176961141 40470 21 -107314045813 40470 36 -1558135712593 40470 37 -9638701072633 40488 2 799132988851840 40530 1 2662988394403 40530 12 -80544180012589 40530 4 52692922897147 40535 1 114928931319973507 40542 2 39942998170831 40550 15 3545849009375 40550 22 71764886452619375 40550 3 574119091620955 40560 79 -151601771548864 40572 24 -1019396800501632 40584 15 -68257488392000 40590 10 -7702169516037 40590 15 5050474364187 40590 16 -203580580269281517 40590 19 141678891429723 40590 28 -5512325365089 40590 31 -1502739368577 40590 41 55055263870476279 40592 5 -250045422985664 40592 9 -12360503978496 40598 1 32516130664243 40599 6 -40346810496225 40614 6 517474552866895 40626 11 26335726710471 40626 2 -711064621182717 40638 11 20619874759525703 40638 6 8353786052071 40641 2 264250210494886696 40650 10 139914334950875 40656 27 199051914362048 40656 32 -372311156431808 40656 79 -79923741364688320 40656 87 -884128983018688 40670 5 -17774906552814061 40678 15 -736452815711401 40678 18 13139155848625275591 40678 9 -1709583819528421 40680 16 -121928803272576 40698 14 -12473299561437 40698 17 -26990983816651989 40698 37 -1349168894554977 40698 41 -353914024113945 40710 18 -81342006198353 40710 32 -161158521566233 40710 4 16477286315178179683 40710 8 -492988224277 40717 3 -2697422514895224 40720 6 -12292715362752 40725 13 3505931458155 40725 20 438241432269375 40734 12 10071889530579 40734 14 2994039321723 40734 22 -3736927732977 40749 3 64512410199769864 40755 14 27843487692202187 40755 16 139520931848 40755 4 -29059379607032 40764 1 120000363709888 40765 1 -142482532601457 40768 97 -18303199147520 40794 2 35114192670331 40794 4 -59941738188029933 40810 10 10748376732636971 40810 15 -11948903834617 40810 22 -16947172359881 40810 2 -348268436783973 40810 4 62258992074747 40866 13 -1047146671219285 40866 22 -1624166865881 40866 5 5573500701537475 40890 12 53153821332379 40890 20 -2458973579715541 40890 23 -1299648038805086777 40890 29 -263292254721073 40896 31 16047865953792 40898 40 939200573562823 40898 45 -297166735587559409 40915 1 -49314122846072 40924 1 -3121973534918880 40950 115 -35954928752625 40950 121 -3933519099224625 40950 125 971706440262375 40950 136 28518168234375 40950 35 2020924204837875 40950 40 347398287118875 40950 44 1837140762210874875 40950 50 -9828767737558125 40950 51 398188165696875 40950 70 3288587375221875 40950 94 -1505448122625 40950 99 -160233335888625 40992 4 -15373540192256 40992 7 15373540192256 41008 16 -103760981063360 41008 22 55938996616256 41010 2 -6069558004397 41013 13 -3891900907591137 41022 9 -171064193409 41025 3 1511323021000 41030 4 -22750053939012941 41038 6 -605576325057921 41055 10 8961242701067 41055 3 -167805533759093 41055 9 -26350939000513 41070 12 541278779743619 41070 13 -594573058647829 41070 21 -660786124744313 41070 27 26900074163494711 41070 36 -48607132066849 41070 37 -1452049841563129 41070 7 -1937564235839717 41070 9 14724248025938419 41076 2 -346630752 41097 1 40762843044211 41110 1 -11862431543421 41118 11 2427040909707679 41118 2 -15593397966917 41118 24 9720061263359 41140 3 -71273402924768 41145 18 -8582286410569 41170 2 -347937829467013 41195 4 125409255952483 41202 9 33997694416911 41205 7 -4058079104681 41210 14 15571077420007 41214 1 94411316914615 41230 15 1042312723913663 41230 21 -90551565720449 41246 1 -4238102383125093 41262 16 2199724170827383 41262 8 6411917078315 41265 9 -123281705285901 41272 13 72950612081696 41273 2 -777527108803693 41275 6 1669819713636365875 41280 30 10316761667072 41280 40 -17257720389151744 41280 51 -10316761667072 41280 6 1482515190514980352 41280 66 17257720389151744 41280 81 -1482515190514980352 41292 8 -26134013469663072 41310 11 49812860202507 41310 36 -1844920748241 41322 3 -223074646488685 41322 6 -8664392458693 41325 4 1160444784853000 41327 4 15137549831240 41328 24 -295648413296832 41328 55 5647543538073408 41334 9 -68677173610705 41349 2 -1253773640888 41350 1 201013370863875 41354 7 9351626334245639 41382 15 -18016679334357 41382 35 -396848265229449 41382 43 45943890999829911 41382 69 -547885054431297 41400 25 -758422664942400 41400 45 -94802833117800000 41405 14 30643407953384499 41405 2 -89339381788293 41406 4 -1743431547149 41412 6 -926337634953447520 41415 5 5102230408091 41430 3 49642259785003 41454 26 -102062822213205 41454 49 -146130647221881 41470 16 -540511600623697 41470 20 -65567394594593 41470 22 -1122471113946337 41475 8 9643983301000 41490 6 -31408237150821 41496 24 -135293438544256 41496 4 -16921843402400 41514 16 12242806439239 41514 7 -64908344526749 41520 10 5564238295244608 41530 5 1559199476871 41535 1 274231322957727 41535 5 -10156715665101 41538 2 5197719539755 41550 34 -13909441200625 41574 18 223422640816895 41574 3 -119813223394827989 41580 12 -108694411753937472 41580 17 245660021163936 41580 1 -9098519302368 41580 20 2934749117356311744 41587 2 92366562952 41590 4 14403465914823 41590 7 -1270580679721 41594 2 -7383801487676697 41610 1 24398082354927907 41610 16 -8370663086413 41610 18 -4902604221349 41610 21 -264582206180474869 41610 2 1637361807787 41610 27 -49626126592361 41610 31 -1727955504370961 41610 3 13012520946080203 41610 35 -95882534250337 41610 36 124527926600999 41610 9 -1466446990933 41616 22 -14311340722368 41624 4 -69660973771840 41630 4 8738424528587 41630 8 -6645475910069 41650 3 422434155822875 41650 63 -1697345887540625 41652 6 -246582284054400 41658 5 -811941292958777 41680 13 -24812475829696 41723 2 319173276147976 41730 8 -398079938069 41745 16 69903549767656 41745 23 1730633299703 41748 8 -4804151886223424 41754 4 -561701170000081 41778 10 32139394826067 41778 31 -11480664963177 41778 6 3031963825898331 41786 4 41435428064297903 41786 5 514629106422407 41790 15 89955785880963631 41790 19 9947031436943 41790 4 47708235016651 41800 22 42739851124000 41800 5 -1136871486504000 41808 1 36282509607232 41811 2 -840158807586328 41814 7 274355683620039 41830 6 -3385227273948621 41866 3 11716560817688683 41870 3 -4294921326777 41874 9 -506887054633 41880 9 -1093613591008 41886 13 18202132223991 41895 18 18068284273032 41895 49 2494408548985479 41910 14 -5965605806401 41910 5 -652775825789 41919 1 -1143965391641 41922 10 -74964659515029 41922 11 -1552129938729 41952 14 38465412987392 41952 6 -38465412987392 41970 2 -226650995272909 41990 14 -36830876073129 41998 5 -37122352459057 41998 8 -9603379847498689 42021 5 -273326237170776 42028 4 729498846589568 42042 11 619608791948376979 42042 31 202076052878987 42042 32 -75830677790581 42042 63 -8887276419497 42042 66 1584447265157743 42042 82 -59453724230425 42042 84 -4898142128593 42050 4 25726895748592875 42058 3 -8309749325993 42075 12 -424094247811125 42075 28 4228425539250525000 42075 30 -14765388075000 42075 45 33827404314004200 42075 5 11450544690900375 42090 15 -7574892949961 42090 23 2738324073953519 42090 9 -778015333739341 42105 6 -3242663791669 42105 8 688702499351 42126 15 -703119318425 42126 2 14526287158195 42126 27 1020945573647 42135 2 -18761082482658968 42159 6 -14370263187229 42160 23 -3826064832704 42166 1 -10927287826353 42186 2 -21512935362005 42195 7 -172946163798424 42210 18 509936613192345807 42218 1 5532634330010595 42225 2 90760484259179875 42237 6 -9240078553379064 42240 30 -1239643648 42262 2 -1278042852637 42280 6 1942937725667392 42294 1 -198431201429 42294 24 -7171659668305 42306 12 22810013841007 42330 23 -8115105762593 42330 24 274970465808391 42330 32 27145367 42330 37 -2494918807740361 42330 8 -15289364088613 42350 39 20491818392436875 42350 55 804677491245375 42354 6 -2262945730866813 42366 4 101289190668299 42378 7 1871154753175 42406 13 -101788832667313 42406 8 2741203296567 42420 4 58763732185376 42435 4 -284076779432184 42435 6 7009760273683779 42438 1 -236291213684505077 42441 1 -4984388846072 42441 7 -2857679661304 42450 10 -181854088303645 42450 1 -12639578292845 42450 22 -22731761037955625 42450 31 -1579947286605625 42462 7 6708554343819 42474 3 -825000696109 42483 8 1142204315774536 42504 21 -150972459042880 42504 22 -30589066966240 42504 8 -8111944592704 42510 5 51667420920306751 42514 3 16303264416287 42528 2 26088540073984 42528 6 -26088540073984 42550 24 46561457684375 42565 2 23970330109728523 42570 26 -22276916937873 42570 7 118426238579907 42585 8 -421540251045112 42588 26 377128811094048 42588 27 -7173346719857760 42596 1 16690557082488992 42602 1 -480778539615261 42622 3 -3485366770927257 42630 16 -1198893557870471141 42630 22 -170362062493469 42630 24 81559208780371 42630 30 3495316495249187 42630 37 58434187435259867 42630 49 -49020691868029 42630 55 -616945675202297 42630 6 -135420370708949333 42630 66 3307759717591 42630 67 -13767457894001 42630 86 -70750667261449 42630 91 1338908560909199 42630 94 211612366594387871 42645 3 -409618445752 42670 6 613472763059 42670 9 -4047891633089 42672 19 6335596220143168 42693 2 4834192519720747 42702 1 107732819318147 42705 6 249766863554766312 42706 2 -7698738807029197 42706 7 20459213603 42728 5 168447366229184 42735 1 -1531405614564004472 42735 15 -104233418627736889 42735 17 237618080531 42735 2 -7040998947032 42735 9 214937966888 42742 9 60105854726119 42770 18 13413405336948343 42770 6 -120031431152855949 42777 18 -7090175141119224 42780 8 -149388006103264 42780 9 3482979804741824 42783 1 172360647251560 42801 2 -855150013745 42812 3 1871698035064044160 42818 1 -948949113099077 42818 5 -41482938248729 42822 2 1239204368563299 42822 7 -45896458094937 42826 15 -186947086995865 42834 10 69095291287627 42834 15 -1358648164308853 42834 7 337431180067237531 42840 15 493677545620608 42840 17 46960740420914592 42840 25 -8253637187789664 42840 64 70871402484321984 42861 1 7860805859971 42874 4 -1494098807032441 42900 13 444203874100000 42900 31 16211978263376000 42918 8 1289538680535343 42924 3 -323127611393975360 42930 28 34770163460629239 42930 3 -938794413436989453 42939 7 15189445554687 42952 1 458917171929728 42959 4 18144516722536 42959 6 64266666451912 42960 15 330608138894848 42960 3 -160945768014683264 42960 6 -64366302477952 42966 11 29415421573371 42966 25 4126792128354783 42966 27 1700905388463 42966 31 5901560073448983 42966 33 4339390412550087 42966 5 -152844152902029 42978 18 -3279986188048081 42978 2 164922479323003 42978 7 20968199164567 42990 4 -50808814715557 43036 3 -36290975309280 43050 18 -723935378125 43050 19 12256904297562875 43050 36 490042030252375 43054 2 -10814134925285 43054 6 -1907110360917 43056 10 -48763010995776 43056 36 89186011785792 43074 2 274638969070803 43080 7 -48511518134336 43086 2 -29265378227569 43094 1 10496103346171 43095 8 -124815391402481 43099 2 2158110800199208 43110 11 -1330068983157 43110 25 -50503436751426561 43120 1 1972872580672 43120 25 146770464409408 43120 32 -86192772476608 43120 63 328432555047744 43120 66 -50342269292426944 43120 70 -25393419858464 43134 6 5391423332765315 43150 3 298792105586875 43152 22 -45061552797632 43152 4 -8487636846272 43155 6 -241477284063609 43160 9 2529471415570624 43194 3 5548595467915 43197 10 45991909276291 43200 187 172800 43200 188 -3015360000 43210 3 -197275133547410733 43215 6 2218877885987 43230 10 4376331099091 43230 4 -1353645864917 43238 1 -25414306519733 43248 21 1652953001536 43248 24 33700023798848 43282 1 50800579882599843 43290 14 -870634342068240573 43290 15 1298040555267 43290 43 -131481103495537089 43290 45 -16946625982426773849 43296 20 -32756049876159424 43296 7 32756049876159424 43302 11 8664122200194719 43302 9 -90270404553853385 43316 6 96155752325248 43316 7 -1880250877018080 43320 14 -10062017318664064 43320 29 552095921223296 43320 36 -590032760499136 43326 4 281626280928099 43329 7 -77794974536824 43332 1 403217448188977792 43344 50 -734797189427904 43350 13 413414439921235 43350 19 -207496342289808125 43350 37 2473597848597875 43350 40 1893794565471875 43350 5 -254043831636125 43350 58 30770070864268375 43350 76 -1659970738318465 43350 97 51676804990154375 43398 3 12461697575955 43400 15 1467320117264000 43407 4 -4499150921208 43428 15 -751174317008704 43428 8 5895450501509024 43434 5 -691927012282091284413 43434 7 -2912107045011360237 43440 13 -9787559112038368 43440 20 -167341215467456 43446 3 -3963584181493 43450 19 -126955331847599625 43450 7 -47484693004887125 43470 19 13138741140183 43470 3 -27967532555997 43470 33 755123379011919 43494 10 7155089109935 43510 2 116148881549730383 43530 5 -9962562566413 43533 11 35359067152872 43542 22 83768375260548639 43550 1 2898345807573199875 43550 19 1330339035375 43550 22 208778245051375 43550 5 86834363967204875 43554 11 -940768913197 43554 22 -15923371895408321 43554 24 -1954407115513 43554 5 -3018098410685 43575 12 1208711990375 43575 13 -12812458326625 43575 6 -205317023238125 43581 2 1920290953331816 43602 3 -7025087137232645 43610 27 158837354086074111 43610 30 -1537480727055441 43617 7 -11196499017061 43632 12 -282032131345344 43632 14 -2087469772454592 43632 19 7614867546324288 43632 21 56361683856273984 43641 8 -44814999700953 43650 31 -11309974214625 43662 3 -98546987256085 43662 9 1334642301775 43680 33 -2242060047872 43680 51 -1053253941626368 43697 1 5976537978339 43706 13 15072615027448055299 43706 19 -12201944619139137 43710 9 -1177445343958855957 43719 3 -1757145405592 43722 2 -718831854825741 43730 8 17616796050367 43758 10 -316396038426957 43758 14 -31631932569537 43758 2 -26497692513837 43758 8 -835249864992165 43770 7 9109434569111 43775 1 -149594348836125 43780 3 467867913454016 43785 4 -7016870188728 43786 1 1115638611306499 43806 19 -712690644169189 43806 21 1375534961044811 43806 24 -17654101069717 43806 30 43911883141903 43806 32 -15166227532569785 43806 46 -6429241401751571977 43806 6 -16733984990093 43810 9 466571163867687 43818 4 980180391110651 43818 9 9400567504679 43824 11 739597821783616 43824 35 -17292362145170903488 43840 8 -282006372944384 43862 8 2494187203087 43870 4 -269248139316189 43890 21 -2321256759373 43890 26 -98494957186597 43890 27 -99572306987413 43890 28 97941178910987 43890 31 -7614562805893 43890 38 -227456410169897 43890 40 10140261576010903 43890 44 35947639608607 43890 46 -329133138195329 43890 49 -31410937529 43890 5 -1434260549538031013 43890 61 63220574243303 43890 62 1346960673647 43890 71 -629389459635480433 43890 73 -7974034069609 43890 75 -185451414192001 43890 78 -20451036414241 43890 82 -1402323600889 43901 3 287570322574651 43920 44 5549638231872 43946 4 -305469453721604957 43950 2 42328334096875 43950 39 -1028321052490225 43950 7 -128540131561278125 43953 28 -1547663891032 43989 3 9789921330319 44016 18 195098439590720 44016 8 -13933492010432 44022 6 8606566301563 44030 17 -136717389945081 44030 2 15797582005267 44044 19 -10505640882528 44044 8 -9662166920083040 44050 8 798019388612875 44061 1 48177048063304 44070 15 797860809209287 44070 22 -67510197491257 44070 8 3240952896334843 44080 23 13505959439936 44082 3 96582816403570923363 44096 9 40703019466240 44100 49 -66248711676000 44100 96 -384876602460000 44109 11 130738631344776 44109 26 230789300604291 44114 10 10555917549983 44114 1 16797406505139 44114 12 763091354647 44114 7 4251823679403 44115 2 5854280124151 44121 3 -45135762830369 44170 3 -417687791759937 44190 15 -11071706473323333 44190 29 24143437503 44190 31 6768168801903 44190 37 8211156100551 44198 17 -126194765792725 44202 3 -93400254031157 44205 3 1446397931539 44206 8 16915710320443 44215 1 24640175628323 44220 3 -8755648344928 44240 18 -16248661988544 44254 2 -324140003034821 44265 5 -49465027462904 44275 16 699385966368200 44275 4 87423245796025000 44275 6 1087977925000 44280 5 -1787916747897216 44286 10 4113594372547 44289 15 -7719133073688 44304 16 -281861467145920 44304 8 116942124292301888 44310 18 125379622382671 44310 3 -13436066232481157 44319 6 6127343529704 44330 7 -145826181842977 44352 123 -60420142591488 44352 18 60420142591488 44352 67 -32302940272128 44352 90 32302940272128 44370 21 14794261951059 44370 22 -8820624476421 44370 33 31941693923937903 44370 37 334130067435519 44370 41 1438657198545159 44370 9 2074300027620003 44394 15 123627814747255 44394 16 -81454267765244969 44394 29 29362743019400399 44394 31 237475999315583 44394 32 85434429400271 44400 41 -4248526115096000 44400 59 -85488129784000 44406 5 88429423920759 44415 14 3542399285391 44418 8 -61338322977625 44436 9 1339272310949504 44450 4 7314020909875 44450 48 37667963324375 44457 7 91486532264392 44462 2 -1990619998237 44478 10 -260705014351965 44499 1 14784141020104 44499 14 -25887357234712 44499 6 12068474660936 44505 10 1656324854872047 44506 13 126467823016642491 44506 4 111462418860227 44517 11 -1323321842714392 44517 8 -1031269556728 44520 10 269033683226048 44520 15 -4829998083414848 44520 21 487294627904288 44520 4 -22101158812256 44528 13 -4436865745735104 44530 6 -6882753045689 44538 6 -6891982340437 44540 3 -8405755493970304 44550 28 -275106168838125 44574 2 -484662191797 44622 6 5717068748159786487 44634 4 -6636366018397 44650 12 19581392927375 44650 4 16988829731875 44650 7 -10389875697125 44655 2 69711888015496 44658 15 -240622297539273 44658 4 8911936945899 44670 5 7293454044083 44676 5 -93404329144704 44688 38 2563642491925312 44688 63 -2115523554167744 44688 85 -879329374730382016 44690 5 3089733117789727 44700 7 -47823707888000 44704 2 568116536338432 44704 6 -568116536338432 44710 1 12425909833467 44726 7 -29958421850466497 44730 13 -121273890280677 44730 17 76082881990257171 44730 21 -54910448393949 44730 23 12726686493891 44730 27 7905770873631 44730 45 38587549237047 44730 51 -603527922977617161 44730 53 -168032524282209 44730 58 5316229390699359 44748 4 -18755356934199168 44759 4 24760469333547 44767 1 -304449106857697 44770 6 5843922674931 44784 9 -403496435912832 44790 20 101543630520959 44811 2 504459671175 44814 13 -11328915931756865 44814 20 -2424297238705 44814 24 -955456264364617 44814 7 496416482726291 44835 16 1131545122157303 44835 5 163605392619899923 44835 7 -1827813971945528 44850 10 13185429821875 44850 18 31560925704875 44850 28 234849058746875 44850 36 -3340110830494625 44863 3 -42701509194616 44880 33 13592765526315328 44880 53 -22059965683648 44884 11 116416625026464 44898 11 60899404534739 44898 12 -31585024676933657 44910 17 -530226288459441 44910 7 -403729873101 44940 7 -6569729818963424 44946 11 16739711127675 44946 13 1521700100919 44946 26 11863362817215 44946 9 -97771392719397 44954 22 14480293288383 44954 23 109679178054095 44958 2 -27210102738245 44965 7 -27286123096369 44968 4 -16909648822144 44976 13 -18982609146112960 44982 28 -479782494312093 44982 61 12954127346426511 45008 1 65532477094834752 45012 10 9617212021934528 45012 1 -392837833789280 45018 5 -163674522042381 45024 5 -41941199587456 45024 8 41941199587456 45030 5 8361088314908563 45030 8 761723210784923 45034 1 -820112054365 45045 21 4222068649775523 45045 35 14126120871624 45045 36 185496868584 45045 38 84579701552919 45045 41 -5425925633612856 45066 10 4884984514675 45066 12 66743531921611 45066 13 3953653806115 45066 21 -75143533358809 45066 22 8452728886857191 45066 23 -5664635621065 45066 9 -1128117127830029 45078 5 -4189800801359917 45120 31 46153659332096 45120 56 -46153659332096 45126 5 -32146745798709 45126 7 363106309783275 45135 2 -6547383101887128 45135 5 176779343750952456 45150 32 262128639903999875 45150 34 -3836100692639125 45150 35 -53153731874125 45150 43 8922124914081875 45150 49 71376999312655 45150 52 22103429701375 45150 75 3640534984658375 45180 6 44797130218944 45186 8 1804735910575 45210 25 46612970416079 45210 27 -17193396889081 45210 4 411551270242579 45264 16 4458487219712 45270 22 -11829806950833 45270 24 -6598053429777 45270 26 -69742058199985809 45298 3 -8879006851002725653 45310 1 21778333954803 45318 11 -2844850070609 45318 1 -4560704647728893 45318 9 -4206469480361 45339 2 -307699832036024 45342 3 784638996940827 45346 3 3898022939595 45346 8 -1901881546965 45355 2 -10143221689368 45360 20 513519309069696 45378 13 -1437537690225 45387 4 -9268837771020120 45387 5 343290287815560 45390 17 10603091132711 45396 15 105791397687936 45402 7 632671995833387 45429 1 -1568435252041 45430 1 -228256890887493 45438 2 414370852101523 45450 21 -169162545137455125 45450 30 9354775356385875 45450 47 -72980166128625 45474 9 16212035036939924287 45475 6 -124324248095000 45486 24 119091514153527 45486 26 -31133188511966169 45486 32 -886990429601793 45486 38 843906808216359 45494 5 -79760670793673021 45510 20 -1074528194561 45525 7 -13217326274125 45526 5 -377446506481 45540 6 806557066897536 45567 2 4435941109473927 45567 5 -1011438045266913 45570 20 3964836627339931 45570 27 -235932740876413 45570 58 2985769812326959 45570 67 711174506966063 45570 73 -40532563078777 45570 83 -64030026001786201 45584 13 31019579889472 45584 3 21745767352896 45590 2 568101684949651 45606 5 754153426117612294811 45612 12 -26788865356189152 45624 3 24002435093984 45624 7 -44688140902304 45630 10 8231478612210243 45630 32 -101160638384013 45630 84 -7188252158529 45630 87 -222249922529676561 45650 12 -51930445544325 45650 25 -6491305693040625 45650 7 64927306528875 45654 11 -4124914287913 45654 3 11136803006267 45666 4 -54466810746813 45666 7 -105487912822077 45675 23 193255685757000 45675 5 -80901667323000 45675 8 12272573820375 45678 4 5463006370828163 45684 4 -65434229585280 45690 3 37015788009259 45705 1 -866834180333432 45738 43 -6274852772028093 45738 51 -214455418029369 45738 6 -127288523549781 45738 67 169421024844758511 45747 6 1188810436104 45756 6 -1279341507482496 45760 11 449428142269952 45760 26 2369638236672 45760 32 -449428142269952 45762 4 -169098614599681 45780 6 -2939001413984 45786 6 1063120178394487 45798 8 1837866726503 45798 9 1142445364063775 45810 10 -5185989293661 45810 25 30297859936721559 45810 5 -37039871566701 45815 11 -13942010174618673 45815 2 150475830209992 45815 26 -2258065987849 45815 28 1520234894688776 45815 4 774516633832207 45815 6 -34059213965357 45816 7 383422002339968 45837 1 14368145944959 45838 2 6998034274432235 45840 17 603992115330112 45850 10 36368977710066875 45850 15 290951821680535 45864 33 4064595615751104 45864 55 -3595881038699085696 45866 2 -183114403146469 45870 1 -9117845402309 45870 9 -112740884415159857 45878 2 -39404838755393 45888 11 -3835625957632 45888 24 3835625957632 45890 14 78500229924229983 45930 9 -1500333455413 45934 9 -603383972337 45936 39 256908495092544 45936 42 160323762818880 45942 1 -420226678997 45942 19 -372881428805989 45942 29 867053844378487 45955 3 -1186826764761 45966 6 -2261092113881 45968 13 920923955581760 45978 6 -26804716149745 45980 7 -16201028723748704 45990 15 3868547152429107 45990 26 2483242200531 45990 34 8531692213067703 45990 46 238018768462855143 45990 7 -315988600483989 45994 1 44375710432275 46002 14 29475534159127 46002 17 87718400132527 46002 19 -3402646240465 46002 20 -31972653844273 46020 9 1915923576996512 46025 10 1149191132013000 46025 4 -22800843199000 46026 7 5090331299094855 46029 2 3643251309352 46046 3 -33673296016333 46046 4 1705222353771 46050 4 101221532658017875 46070 10 92820086608303 46070 5 4187461376339 46090 15 -167435461592814761 46090 16 -315947665881 46090 18 -996113811975929 46090 7 -194899490886817 46094 1 1213636657195 46095 5 195177576392 46110 19 38698088150431 46110 5 1078444933779076814179 46116 1 255730230905472 46116 4 -9471490033536 46134 7 23599264197483 46134 9 17663382053235 46140 2 -995617966976 46158 24 461178217430623 46170 19 331003917111771 46170 35 -12259404337473 46176 11 61573714532864 46176 7 -61573714532864 46190 2 -670374794717 46200 35 -43428550600000 46200 52 -31684491656000 46200 61 123562985680000 46200 64 -324964862776000 46200 73 18693831176000 46200 75 9289586774672000 46200 77 572679153908000 46200 9 -115631031536000 46230 15 47582480120586463 46230 22 251127032289539171183 46266 12 -1867474575854059409 46294 2 -126418614317 46299 6 -1441475989336 46300 6 -77625859248000 46306 9 287820830648871 46314 9 -1777196396061 46320 4 244328154999488 46340 1 -47047530995072 46342 7 -19768430753826201 46350 48 -6034591772213625 46354 15 -26008634358930349 46354 27 -46813110000209 46354 9 143636941447363 46356 2 32266930435264 46371 1 -9245821907249 46389 8 -157783860535832 46410 1 13788249042963403 46410 12 13097260693243 46410 21 1032785045924671187 46410 33 -541889051738581 46410 37 343308117680767 46410 39 4342883529223 46410 44 -67523133530033 46410 56 189314614359863 46410 6 -17673416376533 46410 65 -145541660961630961 46410 67 43349844098231 46410 68 54148719969791 46410 70 16791174068759 46410 9 -260940583270712717 46425 6 -52451463716407000 46428 1 -9112860436832 46431 1 14903030825523 46443 5 -6497039447053624 46450 12 554022191884375 46458 15 10928345372559 46458 20 -37140981054489 46458 6 -52776180371349 46462 1 -10801078194421 46480 14 -319386720430951552 46488 6 -790371484575776 46494 13 -15858367658937 46494 14 -2726222055129 46503 3 -23235387109272 46512 12 74903000463936 46512 24 -331499724237504 46512 42 1031609232175519296 46515 1 -1426324711770449 46529 6 1435803413967 46530 12 -168062430229029 46530 19 -22244143802841 46530 21 3119203052206983 46530 2 600591882676707 46536 13 -1490446826560 46550 88 29669732585084375 46550 9 2706187037946875 46569 11 199645579619351 46569 15 -186509905886584 46575 10 92463801993000 46575 3 -2496522653811000 46580 1 -157079405431648 46599 2 -67863585560561 46620 17 -26008190391168 46640 15 226131867431488 46650 2 31626925568875 46662 3 -539789291621 46662 7 3241540721467 46683 11 127914081690672243 46683 3 -4737558581136009 46686 2 64061568942427 46686 6 -21098985352273 46690 12 -8665421090509 46690 22 -2926212253497 46690 24 4478535772199 46690 8 -195976072779381 46704 11 1039953483668800 46704 23 -195385967807680 46710 13 -493291445617449 46718 7 3746943682623 46722 5 -13200213989845 46725 14 -48926319678125 46731 4 120360174694568 46736 1 6268772692800 46746 18 -42734525726868885 46746 6 33205806842355 46748 1 6791143992768 46761 4 -383828535017513 46770 7 -1841257592059933 46774 1 -3228954066805920669 46800 127 15817213300852800 46806 5 -1572493219417 46810 3 55008242777483 46827 10 -9225393307416 46830 21 -613630623257 46830 23 -1975002749441 46830 24 53453538325711 46833 1 -10991476460193769 46852 3 -1266022379766240 46860 15 -2621529868384 46863 6 -60664866162840 46870 2 17241526544491 46890 7 -10467763240653 46893 11 -1322714492849197 46896 10 19036234103104 46896 17 -12995466939831232 46930 15 7620615887044051 46930 29 3416851089286044047 46930 36 -5197809715344089 46935 7 55578020581224 46940 2 -3153091893588352 46944 10 -1161632999978496 46944 6 1161632999978496 46945 2 217287209594159 46950 13 2139752067097375 46956 10 532441649222885312 46956 6 4967911893664 46970 13 -498174075111257 46970 5 -35587836126333 46970 7 -26278243328303821 46984 3 51153012621220320 47005 5 -2421855338841 47005 7 27836333214962824 47022 9 -132812992133101 47025 21 38255160009375 47025 31 -1092884474044125 47025 34 -242541127575000 47040 100 22077215437312 47040 141 228049585087744 47040 191 -228049585087744 47056 11 -773461259633088 47058 12 3901238597137967 47058 4 4274578198835 47082 6 17547766340651 47100 17 2661630616196000 47100 27 626059173715280000 47100 6 5008473389722240 47120 10 902529539519552 47124 13 -39154813503840 47138 4 -18011956805829 47145 1 211664015172539 47170 5 106465046574203 47178 5 376128499467555 47184 9 -44167134600640 47190 19 353853670004283691 47190 22 -58904977718917 47190 27 -6799583000751013 47190 37 -421730345760229 47190 45 375088527337447 47190 60 -80513461918241 47190 61 -15042985887457 47190 63 3130995505391567 47190 6 -448667003629493 47201 2 6425185354568 47214 6 -46295624817621 47226 1 -610820169319302517 47229 8 -195918939346915576 47232 46 -270589019057280 47232 47 270589019057280 47235 1 13427291493352 47235 6 -69426087032152 47265 3 -6010472588119192 47268 4 -77618961670752 47278 3 -244444736593 47280 24 -55340032259008 47280 33 850791850535744 47286 20 210571685758935 47294 2 -447828650751069613 47300 3 -1533704610608000 47306 1 -52892527046589 47310 11 -3675693853414961 47310 9 -60074162641172897 47313 2 1205699600223 47318 9 6437649488715 47320 12 -939516163213888 47320 29 -2064117010580911936 47320 7 85050483262849728 47320 8 -2143272410556992 47355 11 -6332572992761 47355 1 174474436818076381288 47355 17 -355077313417 47355 19 -462533370116880952 47355 27 404637335386451 47355 8 6381816398047 47376 49 -19043791899840 47382 10 6091206709463 47400 1 -22353892568000 47400 24 -4682596171400000 47424 1 21075668573728384 47424 23 1082862286336 47424 31 -21075668573728384 47424 76 -9658967352832 47425 2 -1324924304563000 47425 7 -42250216275000 47430 11 1887873664323627 47450 18 -2174687239432625 47450 23 -694780785393625 47450 2 -38356746525765 47450 30 -4794593315720625 47450 9 -280245466937125 47472 6 -2287770321519296 47475 7 2047103013375 47481 5 -15700888421729 47481 7 -91605531281453 47502 10 389833284471723 47502 19 63097077313395 47502 38 -709296241099545 47502 40 272283186447 47509 1 -983794221884312 47523 1 1122190923979 47530 10 44112022131331 47530 19 -937984216599801 47541 2 3173268997855 47541 3 -48663101991581 47550 10 93349288329875 47550 11 -29037862253125 47550 14 -22681835626625 47550 20 186638289565375 47550 28 2012469642072161786375 47553 3 163681385828455 47554 2 374696605089782243 47560 5 -16800589512928 47565 15 -321437778765048 47565 16 -3627294564888 47586 10 -80577451579913 47592 4 -5135648187456 47601 1 -6763039197284952 47601 4 250482933232776 47610 12 58416996961323 47610 28 -165293149284033669 47610 37 -240069598362823041 47610 40 2182568231473191 47610 61 25784007536345679 47634 5 -136917480283885 47634 9 -190854061153777 47650 11 30855612226375 47656 5 34806037787200 47658 13 69115300475507 47658 23 -28890616729481 47658 24 1688700798347095 47658 32 27747530292942863 47670 14 101758045223843 47670 2 -1596362275493 47670 32 -185897388506257 47670 9 1515273449059 47676 1 27111518790688 47685 13 -30792817810038232 47685 9 946381056682024 47693 1 -10805931813515544 47710 4 819298929544386407 47718 12 -883403203432077 47718 16 -482584575163221 47718 8 -54129179647989 47726 14 -15977310340655881 47730 10 -4367532503917 47730 23 -2875944085474537 47730 3 -140062233977333 47730 6 3680920602095851 47754 23 -9030836017377 47754 8 124175343974571 47762 4 -1179986058893357 47775 2 -3522977376438905 47775 32 1283883883541875 47775 4 -432585267191000 47775 79 -440372172054863125 47799 7 -9220501257633 47824 22 625294123838272 47824 3 -1823014938304 47826 1 -408705071375709 47850 11 -12120492939552125 47850 20 157855200596875 47850 46 -189662350918625 47850 5 35052922663496875 47850 56 -206515376746321625 47856 13 -75118320095740352 47874 4 4763506477391 47880 10 22693572809661888 47880 3 4375918900533888 47880 40 37971078882624 47886 8 -5647588606225 47895 7 -25592027817016 47915 1 94736572132168 47918 2 -10831533277085 47922 10 -1150769805811073 47922 8 -368265053292157 47925 14 -6566288015976903000 47925 19 243195852443589000 47950 12 368528265512875 47950 13 -12984693454125 47950 4 -5525066386125 47958 8 -10249495562609 47960 4 434767382230976 47998 1 -33183506087029 48015 11 -128049965394057 48015 17 67567617333171 48015 9 1046733483267063 48018 8 -59856595421849 48026 4 -11878112090586241 48030 1 -3628634228261 48034 8 -927966558254885325 48048 36 115612136106985792 48048 3 89094592653760 48048 6 -105152551582112 48048 67 -11093406270400 48048 76 37705152723776 48070 14 -1297716217475962177 48070 5 -235684784069 48090 1 655930866403 48090 18 7204846556123 48090 31 5595838301477087 48093 10 -85891078230616 48110 2 -242411131701 48132 4 5740971532960896 48138 1 15190261060355 48139 5 36946956856328 48144 12 13219907082444352 48144 20 -367294559658112 48146 3 -11215025453717 48150 14 24872213430961875 48150 27 198977707447695 48160 10 -10074664566946539008 48160 1 10074664566946539008 48165 23 9222012795021416 48174 10 -206077997275109 48174 1 11991750633856099 48174 12 30027526922483 48174 15 -281611113795521 48174 18 -4822117842473 48174 8 -193228784176877 48191 1 -30040680529592 48192 30 53197081077248 48192 4 -53197081077248 48195 20 -692645293171224 48195 8 25653529376712 48204 10 -5214255408421344 48216 13 -105987330838592 48222 4 79145020119339 48230 13 62698656913047 48231 4 -3069582853545 48240 41 -151448708947392 48240 56 12195997153344 48246 10 -13509645986125 48246 11 5900850600515 48246 16 2199072977623 48246 21 -1996859760481 48246 6 -534281309245 48270 8 -924212808361 48279 17 -15009327101593 48279 26 -241776711713944 48290 5 -322577674104781 48300 11 -111903395120000 48300 20 -1812335604400000 48300 8 -20312578852208000 48300 9 -14498684835200 48312 8 -130378361212512 48314 3 -360621685182437 48321 15 253583747332867944 48335 2 4835158247592 48336 11 -199978990415936 48336 26 -1294839740096 48336 32 -4184860829120 48336 38 404334986048 48360 10 981410015606912 48370 6 149779982065699 48390 6 -252190461833 48396 4 1285614277568 48400 47 -53882510968000 48400 61 1415073147400000 48405 6 -26292819865976 48410 2 4219451302067 48410 4 -688741485411077 48411 9 -29310653227833 48450 21 20402133150275 48450 2 -25370952309125 48450 25 -5223060046166168938625 48450 29 2550266643784375 48450 32 15167851843375 48450 37 285857509375 48450 44 74624510429363375 48450 6 -22813876076265125 48477 8 1103106771935 48490 5 -2764484398961 48510 100 -36362575888569 48510 103 8446398988712391 48510 106 -2858373610907409 48510 10 -9322132981581 48510 116 -52594766655247089 48510 14 2104241862954483 48510 16 -151046272037493 48510 25 -23511112749117 48510 38 -3715987816989 48510 45 -692965570530429 48510 56 -71436795343137 48510 72 -24625069937937 48510 73 138557484160767 48510 78 -21238144857742617 48510 81 271525418692983 48510 89 -472370629328577 48510 92 153337512114423 48535 2 -12232663504209 48552 26 -979549504936640 48555 4 -10998452161640952 48555 6 -464038490216088 48576 104 19091037377024 48576 26 -4534640962048 48576 39 -969705485853184 48576 47 -12989294023168 48576 54 12989294023168 48576 59 969705485853184 48576 7 -19091037377024 48576 80 393879371264 48590 1 -18622763483237 48594 11 4255851138895 48594 3 -8713708909541 48614 1 1363515822595 48626 3 68593818714615 48633 10 -610513787616472 48633 3 480123780040 48638 1 -18698603485696597781 48642 16 -101129323218209 48642 28 -5066259589513441 48642 4 -105347508948341 48650 31 -1269795683570625 48658 1 -1554415760485 48670 4 324302700323054698219 48675 20 -33950303222680 48705 6 12567100746766024 48714 14 13239123024743 48714 8 -173949061583845 48720 19 -1629533681290432 48720 46 -25267940890299584 48720 54 249825504076352 48720 58 -13201290684352 48720 60 -9146718016192 48735 13 -2893762111608 48770 6 577232492343839 48780 11 -48109343250816 48780 12 -48502263335870304 48786 3 -64629653745183065 48790 10 -25902045808353 48790 1 4251600565227 48790 2 -13311256525001973 48790 3 2820881850024043 48790 4 16680605522923 48818 8 -40954813920397 48822 4 -37776724511221 48822 8 1214030986361351 48825 32 -12263222691000 48832 25 3928801544704 48840 22 -146314007300957248 48840 2 79974777022912 48865 1 2300488839224351 48887 1 879702338147309128 48906 15 24407929107099 48906 28 10805400960687 48906 35 -1122010533441 48906 47 -194312703836909529 48906 9 233048626788411 48909 4 79960584679235 48922 1 16329605374971 48930 9 -136727015271589 48950 11 -3202897034359125 48950 13 7017611087212875 48950 9 -247774649004125 48954 1 -17868698900621 48954 8 164601029855519 48960 106 -21000503930112 48972 2 10331975610496 48990 21 1680293555551 48990 4 4599269619283 48994 2 -910107852749 49010 7 -683369795681261 49011 3 338521302030907 49014 5 3377193920451 49042 2 10318559661523 49042 5 839703149835227 49050 19 70768124971875 49050 44 63276936591375 49062 19 -469553685073818613793 49062 26 -24123611899873 49062 29 -109780813050553 49062 5 95526058869883 49062 9 326569223480651 49082 7 -14276767465881 49098 15 3349370569969403 49098 19 -23974818079429 49098 8 85066256951982019 49104 45 -17762513844672 49105 8 138776546805191 49134 9 295859274999779375 49150 1 -5135184166357125 49173 2 17474997752488 49176 2 134838662920065216 49197 10 -162324093610936 49197 17 -5266489689685621 49197 8 14802256576999 49200 18 174718757260000 49200 75 -813555360280000 49200 79 49812871400000 49206 2 -392442109181965 49210 10 5492754806967 49210 11 -48813695834273 49210 2 4215746236339 49230 6 -25760422019421 49245 10 -12824264437208 49245 15 -2251284322860881 49260 10 -790036656187456 49266 19 541814212066863555 49266 41 -11774841194745 49266 4 -4020359490909 49266 44 -27721924507521 49266 50 -12016166840721 49270 2 -12992574006333 49290 13 -105294765401 49290 4 857080695347 49294 10 5942812056839 49294 9 15371561952775 49302 12 -83898164600577 49302 9 2265250444215579 49322 1 3300091460384571 49330 4 -3060865367108541 49335 11 974942870388799879 49335 15 -5475648394291256 49335 20 339945575857367219 49350 21 -630835718303125 49350 30 -29691522236125 49350 31 -15337679089682125 49350 54 -7297727924742625 49350 55 36449081084375 49350 60 -153533071590625 49350 63 359404242914375 49357 1 -5689041163170245 49360 6 237891694154048 49362 6 -3205128886145 49365 4 -83006478984312 49368 12 -1176382206930304 49368 20 231844907001664 49368 4 -458462752117568 49413 7 1485357363680975 49434 25 26705138527943 49434 4 -1566321269309 49434 8 12595094339071411 49450 11 309157446252375 49470 5 74962329640327 49470 8 -1061965271737 49478 11 -2034394797919769 49478 1 152958154404619 49490 12 4890705147620047 49490 17 3072575118879 49504 2 3278393574912 49530 4 -640273640461541 49530 9 378886641611219 49542 2 28306199808081379 49560 24 -11376636653024 49569 1 -29764148257592 49569 8 5662337744168 49575 3 383327488025000 49590 42 -485685767291553 49590 43 1020192706015983 49590 4 39803857551747 49590 9 -644241231909 49610 11 291386265445979 49630 5 -430675727329 49650 5 2627453828177875 49662 10 -895472292681657 49662 1 33165640469691 49662 8 -6607279178901 49665 16 -2042915156533 49665 8 255447898831 49674 11 -175150496537137 49674 3 -67165315257493 49675 3 -881655148027000 49686 21 2709084134641339 49686 35 1805081770937627 49686 38 -8028027145198333 49686 55 -43226558991161 49686 64 124774317744895 49686 70 -320470689288113 49686 85 -818924362835761 49686 90 -42797590986498985 49686 9 -54018922524749 49698 19 5835819854395143 49700 4 -89955691568000 49704 10 -28505013468992 49704 7 756148757696 49725 8 191739620383875 49728 108 296336643354368 49728 21 -296336643354368 49728 23 -24329005062272 49728 35 -10719606920896 49742 11 15092983059463 49749 4 1735124567975 49764 1 136263514099744 49770 18 140154318357003 49770 22 593214506739 49770 24 -419106328732629 49770 4 10822096844523 49770 44 -6854904276417 49770 47 -232684086264425361 49770 48 -709221255768801 49770 53 10926139113174879 49773 3 -9227335936518136 49782 2 -186751285855813 49794 5 -9647393308165 49800 21 46456924600000 49800 35 11265036920000 49806 2 3245797898055 49818 19 97836165916539515 49820 4 124106862119104 49830 4 4513984613947 49833 15 118960006277448 49833 20 69798509060616 49840 15 29637290558334528 49848 6 82852143873472 49855 3 -85808571417829 49856 8 -6264750712320 49878 21 1916936857719 49890 1 263712322386307 49894 5 301697683597207 49896 30 -585822504996576 49910 13 -435473630876033 49910 17 1504003553991 49910 7 27739445857203331 49922 3 -15907179709097 49926 9 -666421188065 49938 18 -22222578754153 49938 9 34184154983147 49940 1 1478790355611168 49946 6 -28533473774001 49950 54 -13161139491407625 49970 14 -1496157480253889 49973 7 -2115458241840504 49980 19 -814437984249568 50010 3 25673778349291 50025 2 1434135300841000 50025 3 -14612725606931000 50028 6 37763314301322656 50046 2 -183069588408389 50050 14 43403291772875 50050 24 -560139317658928125 50050 28 24244885456875 50050 31 140770565211275 50050 32 -19136022223625 50050 35 -26728643708483625 50050 39 -155855666326625 50050 40 17596320651409375 50050 55 -4481114541271425 50050 59 -96916522865625 50050 6 -350906723172740125 50064 16 -2829850035231680 50064 21 -3122376208064 50064 30 -1199625217819535296 50070 3 -2616824871908677 50082 11 272369472355887767 50082 7 -11726502319961 50085 1 -536990562072 50094 14 -3405221216567181 50094 22 -1871802736481997 50094 28 -318283969244373 50094 30 110644750718667 50094 32 -648216295867701 50094 36 1008540374702751 50094 43 98943696436959 50094 45 -323805098058849 50094 5 -37353347211213 50094 53 -911711443965993 50094 61 -68063097744347409 50094 62 -1339989473082249 50100 12 -24507556300000 50106 6 -5130977420269 50106 8 -13215687256549 50127 14 -15713854606072 50127 18 3525776764307 50127 7 5389852129882696 50127 8 -63090905777144 50130 7 470986910542467 50150 16 -5581726373125 50150 2 20567149659214875 50150 22 18501365943074375 50150 29 -15795456009347777625 50150 9 2699926047582875 50160 40 160327185616864 50160 57 -36880691840704 50160 6 13237035677632 50175 14 -7622578575000 50190 12 -4766550600421 50200 1 71086674168000 50226 1 -2235756392765 50232 13 67587872590832768 50232 16 -9838127710592 50232 19 248492980525600 50270 6 224625127085207 50274 10 221927565197331 50274 17 -392757329322981 50274 24 19821973080483 50274 35 -686631134139489 50274 46 10604447891720487 50280 3 53465045747662554848 50290 5 -37586376639269 50290 8 5297991273417231 50295 20 7690994280584 50298 3 3035807776655 50310 18 -251193959853741 50310 26 -32969544381909 50310 27 -207452267067141 50310 30 -328484752246269 50310 41 193919323548441236823 50310 46 1938449173383 50310 51 -305821011442676553 50310 52 5612959997556543 50310 54 -33720352517457 50310 8 -7182197168460786549 50320 12 -7960527937728 50325 11 -41534360028125 50330 7 1407147179932385919 50337 14 -83297201563773 50337 18 -66040623609633 50337 4 -196520817760056 50374 2 7921903579367635 50388 11 593748705816512 50388 5 27830950790659264 50390 4 -495983517216713 50394 3 2684092448359 50400 101 -18081687645216000 50400 105 -988056003600000 50400 48 988056003600000 50400 84 18081687645216000 50430 11 720736190285867 50430 15 -30148351370749 50430 17 -266317052821577 50430 7 -306573697269557 50430 9 -2077854524823391829 50435 6 -7968775936841 50442 3 72103722066055 50470 6 827716408312339 50490 33 151656354192134943 50490 7 -5616902007116109 50490 9 1327675114179 50505 5 -64232975955637 50505 9 -185738828248 50526 1 -11433370767741 50526 9 308701010729007 50540 18 425697912774784 50550 19 113774808316375 50554 9 6711369845095 50562 16 -358455690819837 50562 33 -279148308479217 50568 13 -77893883378423668211264 50568 22 227095869907940723648 50575 16 -46074515301823625 50575 38 -96516502195625 50575 5 -204571281923000 50582 1 7915198109398371 50589 9 18936558305127 50610 22 -12137329194929 50610 29 402325681463 50610 3 27612251663347 50610 33 5430434803991 50616 7 -176520504712595328 50622 18 125369266808764295 50630 5 -14605133635017 50634 2 27646513774383411 50670 8 470110843359 50694 10 -6644930808349 50694 18 608352706349695 50694 22 -107432303601097 50694 2 -337994697899501 50708 2 -1718976511957312 50715 10 32494470677477928 50715 11 34522070336712 50715 12 -117808203853368 50715 3 -191851948720152 50715 34 -19208964013848 50715 50 -94736066115096 50715 8 5180002615444104 50716 1 22827683542816 50736 24 15941118022208 50745 2 7445462199688 50752 1 -4569539539456 50754 1 -3506899809437 50768 11 -2059091474756032 50778 16 -10884706295373 50778 24 -11385310805108001 50778 30 -206896346258265 50778 41 1333278913959 50778 43 48461613348231 50796 3 1532368042454202048 50797 1 10711299639743 50813 5 -15057673791713 50817 1 -4376972099960 50820 24 1219042505757824 50820 8 -12215217782281184 50830 12 -2539463226086593529 50830 1 -23997186269893 50830 6 -5666970437016101 50830 9 -609291854745565473 50832 25 -14773184208576 50835 2 3818743842816712 50850 29 -824960381423625 50850 35 -5615459240625 50850 5 -128084641102125 50850 7 -12975349076272125 50856 9 40211346557888 50862 14 -34761422059328069 50862 16 101345253817283 50862 5 133763782679443 50864 1 -144117318481344 50864 48 -109849465802757312 50869 2 -4060843433361 50880 102 16237574019584 50880 14 -16237574019584 50880 26 -146726202737152 50880 27 4345685284617728 50880 54 3265560289792 50880 56 146726202737152 50880 59 -4345685284617728 50880 6 67459798834329088 50880 95 -67459798834329088 50886 3 -43097566613517 50895 24 793925730372744 50895 27 5233632316008264 50895 4 -29404656680472 50895 7 -141308072532223128 50898 2 -17501041184293 50940 4 -26975126743776 50955 4 -9246034425457 50960 18 424403334332992 50960 22 -3482510251503808 50960 26 -892661861181888 50966 1 -69725978735437 50982 3 -35283411878221 50994 5 34462247546872539 50995 10 3997760045383 50995 11 -3998137859001 51012 7 317024628057216 51021 4 6018203201544 51024 6 26057022243904 51051 2 7466929892479 51051 4 125069939572843 51056 3 -51194536998067648 51060 3 -4370196896377568 51062 7 25624250785287 51085 2 1131041140227 51090 11 -1327669406470549 51090 13 43396861691431 51090 3 15887165089771 51090 6 -626095290367477 51100 5 22633709300000 51102 1 1687463218696069971 51110 2 6890804889651 51120 24 15383778166578722112 51129 10 9376682799054024 51150 14 11033133596875 51150 20 251040885211835 51150 22 -1736870272139125 51150 26 178645693380875 51150 29 28527942021875 51150 31 -3715590515794525 51150 35 22841751262375 51150 47 31380110651479375 51150 50 7050032824375 51150 52 -464448814474315625 51150 56 -23735789499102625 51150 58 2541989171375 51150 66 -1493961024561625 51170 3 -2436345513486837 51170 8 45128585667059 51186 1 14691068415811 51194 1 -1029333088331621 51198 12 4871992745411 51198 15 244661435164691 51198 1 -7386867587861 51198 27 3107017245019031 51198 34 278765094465143 51198 4 4271545651755619 51198 8 7032632811071419 51201 3 -22218536984294808 51205 17 220908900545704 51205 2 1450282241886408 51205 4 -111069444325077 51216 27 -18357952666112 51216 4 -8072227770560 51221 1 57743083361096 51230 6 -782975471849 51240 10 -3197052612185536 51240 19 -2148893009569664 51245 1 705484923912 51245 3 979678136907 51270 2 -749604972853 51282 13 -24440498657541 51282 17 45444896959923 51282 1 -75017728220364621 51282 22 104704672462839 51282 23 2025478661949844767 51282 30 13086385265871 51282 3 -3877950831957 51282 43 32045347381690719 51282 9 320029372401579 51285 3 388444163650984 51285 5 -367170383694808 51285 7 -1756941595768 51304 3 -301756404191616 51310 5 3533834882143 51312 8 -1571691500992 51330 1 -1772752857596333 51330 25 -21933538925401 51342 2 -19724690324429 51350 27 849569751534375 51350 9 -51943959217125 51357 2 -1777343922820477 51359 4 1206275527927 51360 13 -149184026220032 51360 8 149184026220032 51366 7 -2703237920081 51376 19 313578481473504 51376 27 -970525707399872 51389 2 18128897008039 51390 8 -89143592803783533 51402 5 582227064379 51405 2 1866465355528 51405 4 8387222663339 51408 72 -89522098064064 51408 77 2417096647729728 51414 3 8359090147027 51425 24 -6464898510147000 51425 31 -16275277500625 51425 32 262539348204375 51447 1 5824264127464 51465 2 -2889788577272 51471 8 5789950691967 51471 9 -2692687235940792 51480 21 -810062220096 51480 22 208820986739136 51480 33 319845297420576 51480 5 -8635823030355552 51510 14 -1024912209290502617 51510 16 -2708138529737 51510 18 42103161192730159 51510 20 177516253439 51510 7 -3153073978061 51520 11 -11365307848448 51520 42 -4556468889100288 51520 45 4556468889100288 51520 7 7932197307392 51525 8 53543188593000 51531 1 -8242119488024 51546 2 -814961414842685 51590 12 -135470608434181 51600 13 269651881080496000 51600 56 272483281000000 51600 90 -23164299851796568000 51606 12 3545010245705895 51606 15 31494288522231 51610 4 -4939547058301149 51614 3 -90249043404833 51618 7 -8316674120033 51630 8 -8873405988589 51642 13 -2888121139281 51642 5 -17931859110357453 51642 6 -211819583995605 51646 11 402032570990995 51646 16 70629599745993491 51646 3 -10896958622781 51646 36 -536615223291665 51654 2 1761753789019 51660 7 -793660805096832 51663 1 -8137547184952 51675 15 40658822714665000 51675 16 325270581717320 51678 17 -28577238100569 51680 9 -2772414202176 51681 3 -2833339608441208 51696 11 1156237948224 51714 25 388514793761055 51714 27 1369378632439935 51726 1 -10518954938630034245 51728 7 1466988617563147072 51730 1 -179119333637 51730 4 2274438170971 51744 1 272192153540608 51744 28 -272192153540608 51765 10 -665435125717048 51765 11 16269771930056 51765 6 78859762191811 51766 3 -47480160277549 51786 3 -2710181153709 51794 2 -156769487294869 51796 3 71793771620256 51810 6 -2240260077133 51834 3 53620130722843 51850 18 -348752429563625 51850 6 -70380157178125 51858 10 -123834106781489971233 51870 11 1778868417604699 51870 20 -793540087544413 51870 22 14097390436403 51870 23 -62856821609317 51870 29 -135652778947477 51870 31 -35167592192797 51870 36 761337771870131 51870 4 44986079108882108107 51870 52 -11720517680783393 51870 57 1210882258279 51870 59 5090416462996831 51870 64 -3791289769721 51870 66 -1365097802489 51870 68 -257012542145969 51870 73 122683030711487 51870 76 -881106005233 51870 82 6183604305143 51870 87 1194385621463 51870 94 93660878941631 51870 96 -2874571921369 51888 27 -24829997753863360 51898 1 15340928388003 51920 16 9492016484672 51920 5 287025860804832 51930 16 -9457466185449 51950 9 -3456337315625 51954 4 -40662592967681 51958 2 601106812028011 51960 3 -376297946120304512 51984 59 -114527938060224 51997 2 -5284031625432 52002 4 -8653921243389 52020 16 12896934476080032 52022 5 -22202344577853 52026 12 16446071278135 52026 13 40652408213436007 52026 2 3835117882747 52026 3 -7501998185189 52026 6 -1871360791669 52030 13 5837974946290971 52030 15 8798138653875571 52038 15 425453315364819 52038 19 20120726479707 52038 2 -6901409182539501 52038 5 -18508755667941 52041 2 16448567875831 52050 2 -216514599741125 52050 3 -3446666901125 52066 1 101024748686568195 52070 5 185557746933171 52070 9 -278182767232513 52074 4 354086070221187 52080 21 47694069980864 52080 43 -11947293481382848 52095 7 -867820627303669 52098 6 -4010900933773 52110 6 8882733228147 52119 4 -2622879720045 52122 16 -9734339039993 52131 5 24250564296296 52142 13 -305362820967719489 52142 17 -151084335988801 52150 2 -1211456547125 52154 2 -14551162875809 52155 9 -672323025651489 52170 1 11829212715434563 52170 5 48241334557933451 52176 16 65391408024128 52182 10 -92501019349497 52182 11 34276277058327 52182 2 1583284826547 52185 14 79080951479579 52200 57 254432928600000 52206 12 -1107054609641 52206 15 -14136571756873 52215 6 -89865578307298168 52233 3 -21860052509816 52234 16 22212133879859 52234 18 -4625885466124181 52234 1 -94366180087109 52234 9 -17087552658197 52260 6 204990557166784 52262 4 -58449801685717 52266 1 -27049762595321261 52266 4 -22626540594921637 52266 5 -771507528157 52288 10 95759663353344 52288 17 -95759663353344 52290 11 -8144005916260341 52290 19 -21378237689997 52290 32 18357893216811 52290 38 -264892053774069 52290 46 219888159739029207 52290 52 269705792133642754863 52290 66 7521621831639 52298 3 -45904278956301 52332 7 40946309177984 52338 1 -6483965208552125 52374 10 -21978428914813265 52374 9 -1168588139797 52377 2 -18659095777304 52390 1 972277042643387 52394 5 -1217921250934210977 52395 6 16211713481382131 52416 11 -8945440823808 52416 12 241526902242816 52416 147 -83868945509016576 52416 172 147271388170752 52416 24 -241526902242816 52416 57 -147271388170752 52416 91 83868945509016576 52437 1 -408545751307625 52464 11 29475665823195507520 52470 19 -227837556189 52470 23 1112289018084927 52470 37 2072700956079 52470 6 18076463769483 52470 8 20742077057859 52490 5 -226223613776953 52510 6 -1274233957317297 52514 19 -422482036778857 52514 22 290925053991133199 52514 28 25302724382375 52514 4 -33677926152941125 52514 6 55225815819427 52520 5 1605411062568864 52530 10 6221251653447131 52530 11 -73088138640421 52530 19 -19961079596497 52530 6 -12126015127837 52530 8 10808372734782947 52536 6 84154052779741376 52550 6 5583652460531067375 52554 8 -103263262633 52560 18 -744681546432 52560 42 87043008331584 52569 15 -9489052459800 52569 2 256204416414600 52575 6 -11314674190243000 52578 10 -1044367387237235889 52578 5 -897766682091904089 52591 1 -99513642383031736 52595 1 -2537591493704516856 52598 11 -211460583637493 52598 27 4770590129851447 52598 35 -3415198702284433 52605 10 -106356454858872 52610 1 18619424625987 52614 11 2434214225852487 52624 7 -145669229883072 52626 23 -4575644207225 52626 6 51250469907259 52630 6 390605592987639 52632 7 380952364718016 52635 12 82613843163368 52635 13 -28954378633360312 52635 8 255313789194376 52638 1 492779144689615 52644 5 3198189032992 52647 2 52777603403848 52650 1 64779811846875 52650 24 -19770623752725 52650 45 -2471327969090625 52650 61 -53893403105625 52662 8 17533669890239 52668 23 -14736206401344 52670 2 10129267581859 52682 6 -23348289028877 52682 8 82561554354127771 52686 1 116906644899 52687 1 7022572444656584 52689 4 1518175700010143 52710 23 -7539688976329 52722 13 -6966027706821417 52725 12 127824371425000 52730 1 17408658482171 52734 23 -2282634948025 52734 6 6496538790707 52745 5 246063798738568 52745 6 11348759450888 52752 13 -2505253927616 52752 9 86050746109504 52767 6 37715607427887 52770 3 1814400652139 52770 4 -9901689519781 52780 12 2039029326667936 52780 3 -560567911994208 52780 5 145086543243603872 52780 9 105989157605024 52800 130 3775491424000 52800 142 133811508520000 52800 169 162478265408000 52800 184 -14865515200000 52800 204 -133811508520000 52800 51 -224551211840000 52806 13 -17668057195225 52815 1 -1128809346533 52819 2 3493349352748936 52824 3 922485090200768 52830 10 27186586935399 52830 4 -10180413187078509 52845 2 172116657064 52850 13 28059937963875 52850 25 339661540773575 52850 6 42457692596696875 52855 8 -1335610353649148216 52870 2 -6158097072469 52878 7 21104983642679 52890 14 -43029016779421 52890 19 -6724644828857 52890 21 11093015489887 52910 26 703105525743759 52910 27 576520796494079 52910 6 323849369121803 52920 39 302946271193664 52928 3 823350767058432 52928 7 -823350767058432 52934 5 -2097923746689 52935 2 -833595544971917 52938 1 -326303968907709 52950 13 -390367939459625 52953 7 -14230119465208 52962 10 26523401140783 52962 17 7531112663927 52962 5 17934637824683 52962 8 -1931289907429 52965 13 159705976169583 52965 3 -6321492226872 52965 5 170680290125544 52969 2 -42989129930789 52976 26 -4852923029071552 52983 12 226467318590436447 52997 3 -26161237759329 52998 15 7432377137119 53010 11 3489925934187 53010 15 -211197174629517 53010 18 -118017148926789 53010 20 14789255082291 53010 22 380754649484811 53010 26 -4696288528940109 53010 37 -7025451843753 53010 40 3617808272602263 53016 11 12734364708468928 53016 9 -106009781489216 53020 2 -210900908690272 53040 11 -5110771749722144 53040 30 292547117600300096 53040 42 62196153099328 53040 45 11345821258816 53040 54 18492080790493504 53040 61 1064855526747488 53040 74 -6375321055936 53046 10 -26947708021485 53064 4 59743658546881653888 53067 15 -534802402715896 53067 22 -613321380274456 53070 18 225442805514479 53070 6 -5998789499581 53072 5 315810689990976 53074 4 -4128352459057 53100 8 -255615290352000 53110 4 -2657828556684297 53112 4 -898226503488800 53118 9 -31363882320794769 53124 5 3483345421952 53126 1 10150813506411 53130 10 5258351405004067 53130 15 -1869930943469 53130 17 -14173912527461 53130 1 -870880919453 53130 20 2249011457603 53130 2 -50658245884637 53130 32 11114734906423 53130 36 4513366843327 53130 41 -1753581452209230121001 53130 42 -19334521258289 53130 4 371480957443 53130 45 -2641600262321 53130 50 1406488309091839 53130 52 406698628967 53130 54 18645206056952903 53130 59 -59502401133337 53130 60 2512589041401767 53130 71 -38021946643801 53130 8 -3097211299615133 53134 1 -22266044954909 53178 6 112770825603335 53200 18 40529998188000 53200 36 -755135317880000 53200 58 504944520200000 53200 93 5536043397800000 53220 1 88294438744192 53235 16 46921315237992 53235 3 -938729578070817 53235 42 -360211683557349 53238 8 -680583303737817517 53256 10 819641201081536 53270 9 -313269014641841 53280 32 -246417727661568 53280 34 246417727661568 53280 51 1213232511963456 53290 1 -736469855196064677 53290 24 43260209131315391 53290 9 -8859787647512157 53295 5 32419351327816 53295 8 2919194370647 53298 4 -4868593704477 53298 7 -167443054284645 53312 31 12575865447936 53314 3 939187366841294623 53328 13 106840689050944 53328 15 -98505969058304 53340 3 -18734935964032 53360 5 24403377928256 53361 54 -75712539355992 53370 19 -2393284720308777 53382 10 -50427865692485 53382 16 -8110557096315157 53382 17 -815784605749 53382 32 120922234091063 53382 4 59149616082859 53392 3 -117609353748928 53418 6 -3375515407933 53424 14 -605467870965726336 53424 48 -7973789056908480 53430 15 -1733528987932349321 53430 5 -731040558477373 53440 11 -91440719154432 53440 20 56933661856256 53440 5 -56933661856256 53442 17 2989050036975 53442 9 39191436710163 53454 14 864674482231 53454 17 228504242908567 53454 8 201022135980211 53454 9 -8999446924133 53457 1 88012814248 53466 16 5433600660325595659495 53466 18 -9706940004136969 53482 5 -15597152857269621 53502 10 -9053438966225 53502 12 9602743008815 53502 3 18676438410763 53509 2 5210534976435 53520 15 93607710504256 53520 21 -831795466333888 53523 4 715539803319 53523 8 354325621636872 53550 113 753103905564375 53550 13 120317752771875 53550 18 -25988634598725 53550 53 4767021479284875 53550 7 185622218314875 53550 79 -3248579324840625 53562 1 -10521924276221 53570 2 -6071269244581 53570 6 16498344227660199 53586 16 -337325839713 53586 21 68404215393567 53590 1 -139199159118293 53592 2 764693045190208 53595 10 -2341804405176 53595 6 63228718939752 53606 5 -9300847536225 53646 3 -12678849151308073 53655 11 67783466053576 53655 13 -23249728856376568 53670 1 -498221379253 53676 24 40612596903360 53676 7 -1096540116390720 53680 16 -43197516780992 53680 3 73929340007488 53690 13 -158638759129817 53690 2 -61883500491239237 53694 1 3781370898947187 53694 5 106392373387011 53694 9 -140050774035081 53710 2 -19940534404093 53710 9 -68465491775497 53742 11 160444592197955 53746 6 -14208370780113 53754 10 174519473467735 53754 5 -38664269372557 53757 4 207521542386531 53774 4 -56279928488545 53778 2 -353272664205809 53781 5 15116894814419 53785 9 24814627778263976 53790 8 -4004115168473 53799 3 1521994593320 53802 44 240739632793863 53802 65 263795958494271 53808 10 -7783326441152 53814 5 38927579033159 53816 2 -59114962918080 53820 4 -1883175358176 53823 3 -38423241780344 53830 3 543672798892651 53850 23 -196069791678007625 53865 12 -59240278579310424 53865 4 2194084391826312 53865 6 -14157069606072 53874 5 -76731691370805 53874 7 -84085270885161 53878 6 -140404566667977 53880 2 -8737021251136 53890 2 3292632223443 53895 6 -18681214390682104 53900 13 3174177482308000 53910 15 12490355262447 53922 12 1922216142419 53922 17 -377679976931897 53922 2 727843701556315 53937 5 -11264588790279525 53950 25 7834358009375 53950 2 -83953482031125 53955 3 -1440682680357 53958 11 524767535103691 53958 16 -104669807359024837 53958 30 15879236978503 53958 33 4954336067864231 53958 7 -2648266043281469 53963 2 2827162528919 53966 7 -89521551661553 53970 4 912915025155323 53970 6 -29713534381 53994 1 -2426457219799589 54006 7 53996781965183 54015 1 -52272143376497 54015 3 -264198638802968 54026 4 22205728042105427 54026 9 -38221897191381 54030 5 13406796572023 54045 3 1953031013200827 54046 3 700937534375 54054 13 435613827039865083 54054 19 290787696810603 54054 24 93488262816339 54054 27 -11761573330076357241 54054 38 -2754067166577 54054 43 -2524385677853313 54054 44 -10769914696689 54058 4 3286604265949639 54075 28 -2498941495000 54093 1 -754979720561 54094 1 85690448646283 54094 3 -122940450980297 54096 41 -15990138793664 54096 83 -37755437055616 54102 10 4568749903439 54110 5 -2641506353261 54111 3 -973835365816 54114 3 -10567551058989821 54114 6 47449300665763 54114 8 -634345034365 54120 14 -221532978259936 54131 3 100807957304290226159 54132 6 -17365446728023616 54145 7 9578544310223 54150 1 -105100253802125 54150 30 -381468040859125 54150 54 -112755113860625 54162 18 -92676603198321 54174 3 -78354833097350897 54180 15 106649774868097152 54180 9 4230943879968 54186 3 4310174718102419 54192 29 -22851958870720 54201 1 -3019537847963384 54205 3 -217414117958552 54210 10 2216653997579 54210 19 -20238500279249 54210 20 23490579967759 54210 28 -4012150942212841 54210 5 13027209213043 54213 3 -287014766777 54222 9 -3303491765993 54225 4 174879473745375 54230 18 608356114831 54234 10 -572008202644221 54240 12 7411250803779584 54240 4 -7411250803779584 54270 18 -110931233702697 54270 3 4423256847819 54280 6 15689698944992 54282 1 -1521993863285 54285 13 40420583006327 54285 16 -581231745555481 54288 3 -1371383044416 54288 31 709379364326976 54300 26 13236839959940000 54300 6 105894719679520 54310 1 -3037147966853 54320 16 8230814625088 54320 24 -175017463155648 54322 1 2767809176011 54327 3 6917157538788232 54339 3 -3975197326918264 54352 13 -109412460020224 54352 5 567450864813376 54354 5 -10649463176105 54384 11 13459324967488 54384 14 -1770069717440 54384 24 -465762382585746112 54390 17 853316176218947 54390 3 122267379373543747 54390 35 -356464662896629 54390 5 -62751515029973 54390 70 2269856708063 54390 7 -127837334419613 54390 78 121910181108191 54390 83 277640093591 54426 2 -1229151966677 54426 3 -26672893704593 54438 3 78548461320187 54438 8 -1115898783281 54450 15 61532261269875 54450 187 -97861292455100625 54450 192 -99560864747025 54450 36 -1819065790711125 54450 62 -71432946317539125 54450 63 -782890339640805 54450 65 -11404260593686125 54450 66 -12445108093378125 54450 79 -3071608274728125 54474 1 -2636332488341 54474 7 1919079737695 54495 10 20962253297758599 54495 1 272740708863603 54495 3 292968484246143 54498 12 7661106836351 54498 8 -1168571327273 54502 4 109314298251143 54510 14 -36919565081 54522 14 -874976262519393 54530 7 -20315320644753 54534 6 1882380894679 54544 4 -2981189101463488 54550 5 5354457159375 54558 4 -9267711798213 54570 2 124934523402043 54570 3 50884605762243067 54587 3 29122685178184 54594 8 33864947033607 54600 61 -48535269391792000 54600 70 -181059787000000 54610 2 -275542056106451749 54610 3 1219233679529766967 54621 15 3233338144414839 54621 17 -328732813622529 54621 19 -152528161257144 54621 2 -121789549915704 54621 25 2130064126056 54638 4 -5532655618837917 54645 2 -3099483231230234744 54662 2 2791211674807 54663 1 270649841873608 54665 4 -38963719505053 54670 1 -900219578733 54670 21 4776743792482551 54670 5 -3255397188578837 54670 6 584223340483 54670 9 38105361097803 54672 27 -596791492387264 54672 32 230540158905793856 54672 36 -80044770280384 54672 39 4955517979712 54678 5 -1731518527805 54680 4 29702820782016 54682 2 506817230261327 54693 6 -44216987841688653 54702 2 1911460744071 54714 4 -3234918031597 54720 108 -19305663579648 54720 38 -6150650761728 54738 11 280646622368528391 54747 18 14151721241223 54747 24 -145301478100920 54747 7 20753716138695 54765 3 -1007039076123213 54774 14 2836981700490447 54774 7 10590737347179 54782 12 -15238685232477 54782 13 133676612299979 54795 1 364258792125847 54800 9 4406349577256000 54802 3 -19922194013005 54802 6 16781990592799 54810 13 13374371940651 54810 19 -495347108913 54825 4 4951637891875 54826 1 -1259201353229 54834 17 -1310912183177 54834 2 3404037714086755 54834 27 -27066570484825 54846 8 -10856823401484261 54870 14 447520545953927 54870 6 -452000631277 54870 9 -4210674969780377 54894 11 -144141778264049 54901 8 315776561579387 54910 11 -337653176560275941 54910 15 3423228239672299 54912 15 -265639951923776 54912 22 848653920526976 54912 47 265639951923776 54912 8 -848653920526976 54918 11 124732578728727 54918 5 -3367779625675629 54936 23 13259705213376 54945 18 33661620961992 54945 28 -1246726702296 54950 25 -35812031930748470825 54950 8 -4476503991343558853125 54954 12 -1686243329471025 54954 13 330156654206895 54960 14 1015337502208 54978 21 54128199810291803 54978 22 -707282663017861 54978 29 -440593524241885 54978 3 -157808162712221 54978 4 6057145480267 54978 53 -28971754672609 54978 7 604125011746963 54987 1 10222394916979 54990 14 -27894112782954309 54990 40 -44547654280439601 54990 42 -630779544082449 54990 43 -7224169903209 55014 5 -6910578027665 55020 4 23989688163008 55029 3 6153063639139 55035 7 -28849826212893 55055 13 71838249261416 55055 20 -95616709766944696 55055 22 842245694423496 55056 10 -967926424802336 55062 11 -2093009205486933 55062 1 -27610803829680021 55062 13 -45022865622741 55062 15 549351712279799955 55062 20 1095656245876859211 55062 23 745491703401360567 55062 30 -25239241048041 55062 33 -26752516835841 55062 44 49289291153703 55074 14 3216066219343 55074 8 -10824058850509 55080 15 -15120802666368 55090 2 19026803688327 55104 30 1673346233503232 55104 34 -2786093521408 55104 60 -152625155139584 55104 65 -1673346233503232 55104 77 152625155139584 55110 10 64920672477091 55110 11 -13776667118261 55110 19 287717078807 55110 24 398986715519 55116 3 -245038328744832 55120 19 -254252754968256 55146 6 852188495484113155187 55151 1 -245283499359800 55152 15 1261537996818816 55160 4 362152874248416 55174 5 171208149440419 55188 4 3703460552972928 55195 6 -5411246446936 55200 17 134564975200000 55216 7 -1479078726439616 55220 5 -232516501524064 55221 2 -578827165033 55225 2 -913247132861125 55225 4 -28685068737392125 55230 11 9586315880819 55230 1 71815643266123 55230 7 -7752425328341 55266 6 -814859553852521 55272 37 -7499165981188672 55275 17 33485702309000 55278 6 -556455273510825 55290 10 851053642759043 55300 1 -6426660528000 55302 1 9383694685306163 55305 1 -465922293912 55310 2 -157493649017053 55315 2 67066352708381603 55330 6 -879651799669 55335 1 221517301373803 55335 5 -1401364892743649 55335 9 6337815382403 55341 10 -105441045744501 55341 7 2537908529859 55344 3 -3840705705785536 55350 42 -204476106020625 55366 4 -1688912103213 55366 9 1898026802710975 55370 13 -1211405361613428360869 55370 32 3076646583010231 55384 3 -20942526020032 55386 6 7971651302715 55422 4 17969644452159 55430 6 540843347079 55440 102 -88139126172096 55440 17 2006550743329152 55440 21 123698697244128 55440 28 -70192410359616 55440 37 -24976302811776 55440 40 -6843850197696 55440 71 -129299698291392 55440 75 247791795733728 55440 97 -24728886292608 55450 1 207141660871875 55454 4 -19112897434373 55470 13 179323397914931 55470 21 -230215498539598716497 55470 24 130254846781382839 55470 27 -328322237757569 55470 33 -1602060097390417 55473 18 3509142429875624 55482 3 -727303635253 55490 1 -6900939879813 55503 3 23467237569000 55506 14 3626007689127347 55506 20 2262810330665315 55506 22 740752968689141579 55506 27 30372420709711 55506 2 -821856343115573 55506 35 -3136911235830865 55506 36 428015225791794383 55506 8 -23740116631325 55506 9 -2037040170067349 55510 15 11978907139124379 55510 22 -20384797888729 55530 10 100360558471239 55530 5 -154225274397813 55536 26 -9132677187200 55539 11 2733215466762792 55539 18 -101230202472696 55545 23 -87558920679347704 55545 25 -45354716530264 55545 2 6488691492484648 55545 3 154775123235496 55550 23 -4928050615625 55573 1 400349666312 55575 1 1957998475993113000 55575 19 168393325437000 55575 2 -52865958851814051000 55575 35 301798793041875 55578 5 -199318458931565057 55587 1 -46777800315011905 55590 13 6645671649467 55608 7 1925278372016992 55614 25 -367517973601 55614 5 -6802176268620231517 55615 10 267654833576424 55616 17 -520009039247768064 55616 21 520009039247768064 55616 28 140035296416426496 55616 7 -140035296416426496 55626 6 129103441642259 55626 7 -97999881031477 55632 14 25502974149482560 55632 3 74288016298924352 55650 11 45020490164875 55650 18 21957850677475 55650 22 -46412609978125 55650 26 -42610627850105125 55650 30 -40906642817125 55650 31 -576807657473125 55650 32 -142964537378725 55650 35 -5741752898125 55650 39 1721525103411875 55650 41 -129597342357925 55650 4 1488473534582875 55650 43 -16199667794740625 55650 45 -44166436177625 55650 53 13772200827295 55650 66 -17870567172340625 55650 85 63665111838683375 55650 89 2744731334684375 55650 90 -4852510755625 55692 1 98329967261856 55692 21 -148008086529120 55692 34 -834828172549344 55692 4 -2654909116070112 55695 10 4513565963528 55704 9 3576825993281984 55706 3 -233502709609 55719 1 222568629768 55722 5 -19798292179297 55738 8 -86488751058453 55762 5 91505249864875 55770 10 -75630538771541 55770 11 740587082625091 55770 15 -1967858207145701 55770 33 471291792799139 55770 38 11223654284485331 55770 48 -166160293681075577 55770 50 132898629477367 55770 53 -4323384481099105097 55770 56 -619135608234689 55770 57 3948503155831 55770 70 -152900983820377 55770 75 13514592432251807 55770 7 -584084532681751517 55778 2 46687985630623259 55778 3 -4338262427288193 55796 1 -324620975966324608 55797 3 -873455268943160 55800 46 -2356020457704000 55801 2 8758971657819 55811 4 800439698600136 55815 1 222034232377288 55825 11 -259360151175000 55825 24 -26292263815000 55830 2 214724248676191 55840 16 148984642750976 55840 7 -148984642750976 55860 30 -2683447076011744 55870 4 22309553532331 55872 46 46325654383104 55874 1 -1979024606469 55874 6 -344855827892393 55880 2 -8157028912337728 55885 3 -552722715576 55890 15 190149583040307 55890 16 -299598339573 55890 42 -23248033343001 55890 44 -5134038742088289 55896 9 191443936928192 55920 11 263281527537472 55920 17 -145782467412416 55920 28 371191433120576 55926 14 -14248632642942465 55947 1 -1931591983096 55952 11 -138826492719552 55958 2 8192317987 55965 4 -217720126159434053 55977 4 -11269963568285 55978 1 -319687286451124301 55986 10 741703402943 55986 2 -3013817118513013 55998 21 -1209515889249 56030 1 -2600315266193 56034 25 20557236680775 56034 26 399318943185368220591 56040 1 502727491663552 56050 14 -1008007537625 56056 2 346701011094144 56056 5 -25270506999930752 56070 14 12503231954297379 56070 9 -113888334778317 56074 1 53361168641270299 56100 25 -221610307816000 56100 31 11250278900000 56106 2 -7370123673393 56112 20 15872421122235712 56112 24 624955441626944 56112 28 -4473435443392 56112 5 3673742772160 56129 3 41155291759715 56130 10 -174302445424841 56130 3 -2151195073620354989 56154 18 4423822699181095 56154 23 -12897442271665 56154 27 -1885876694788177 56154 4 65456812271683 56154 7 -8493804097093 56166 15 78365857164175 56166 8 -128609978858837 56175 18 17443591184375 56175 2 -36016478505125 56175 7 -121299471490625 56178 2 -172115265556269 56199 1 -83354792528600 56202 13 -462363865499920841 56202 1 5652360606907 56202 7 4024290131711887499 56210 9 5595011829639 56230 3 34196129313750279 56231 2 12551409323753679 56238 3 6704042588027 56240 11 -2140026563008 56265 18 -15245292803933368 56265 19 20291484722035312808 56265 2 -32835622981733 56270 2 208395836171 56277 11 31974331733955 56280 17 43202672769376 56280 23 -2882470780288 56280 7 -1002973909888 56286 14 106314797228175 56304 6 -67094902549440 56310 12 748924531382863 56316 18 -313771206457216 56334 13 -39344372967457 56334 6 -275525422371662149 56336 5 1108862891072 56350 15 -111568882445965 56350 17 13207489955702875 56350 20 -38505801620125 56350 28 -74839685314625 56350 50 -13946110305745625 56355 22 -279116075539549 56355 25 417054742855271 56358 8 58287469713471 56370 1 -122191291552373 56382 1 -7698461263397 56386 2 1163356320253699 56386 5 100859335242787 56394 4 -53555988642057 56400 31 -721150927064000 56406 25 -7620570341497 56406 9 60943159690883 56414 3 4290915091031 56424 8 -13018185308096 56430 10 -247973365288989 56430 15 28134050460576939 56430 18 -3451376810493 56430 35 135917179737111 56430 39 -1042001868910257 56430 43 9184198714407 56430 5 -3669763852901997 56434 1 -306162333599093 56441 1 7949539634471 56446 14 493876786924963 56446 22 1085047300874143711 56446 5 -243174915632701 56454 13 195024251639735 56454 3 -2846849279979869 56454 7 227624628192299 56454 8 3058461658187983 56485 3 21046381762024 56490 10 71273753499059 56490 13 -25137469736821 56490 21 -11995121647153 56496 13 -325119375424 56496 27 -2992175930816 56496 31 4546715816512 56496 38 -215956803112640 56496 48 -34046035440832 56496 54 9642620847680 56502 4 -522073676391741 56510 3 116653746829507443 56511 19 -1043079602468184 56511 6 28163149266640968 56514 1 23307749225076907 56520 9 -2182254919776 56525 4 -2592293332884625 56539 3 -11831241514744 56550 1 30943757321875 56550 13 1771178936275 56550 26 293787107376875 56550 33 -354083240299625 56550 54 10174804834889375 56550 5 81398438679115 56550 58 221397367034375 56550 60 84903564314375 56560 13 -943718953248 56560 18 912551397806656 56560 3 -40169374031296 56610 25 -3358347723729 56610 27 -2606163436089 56610 31 114847621270119 56610 33 -1067541007249161 56610 5 -7348809853309293 56613 2 482078618811208 56620 3 36989477645472 56628 21 4359196293268608 56644 22 -84794529538990656 56650 17 -6433183723625 56650 19 95646008538200375 56650 23 -117494262716625 56650 29 -494067953560625 56650 8 -3952543628485 56682 12 -7392334332393 56682 15 -4996925109801 56682 6 -690985965392397 56706 3 2005461758539 56718 12 190455475683951 56718 7 -363004086116457 56730 10 54030653515423 56730 6 68678340414731 56742 24 7525326254327 56742 7 -9619133629954933 56749 3 734664223287819 56749 6 -2268513205057 56763 7 -40456426361553 56770 8 -10410338433097 56775 12 -131410244143000 56784 23 2969456422826816 56784 26 853055894830136192 56784 46 -265679508142880 56784 57 505485086347072 56784 69 -1497940925051584 56800 15 330660174016000 56800 4 -84991061096000 56800 8 -330660174016000 56810 10 -43974440133223356801 56810 3 -3894469007957 56810 6 -8576223773921513 56816 7 547895808599165504 56826 6 -1727698654691190117 56848 5 43158913639488 56854 5 -5292851689 56870 14 -87811624641288390777 56870 2 65974173284213667 56880 12 -4828440794688 56880 26 139303739262491712 56880 48 -1942563684901824 56880 50 65127739915584 56896 1 -1596663083520 56910 12 -194553023579657 56910 15 -1134387034398449 56910 6 52676036221339 56925 19 306934032861000 56925 23 177253554069000 56940 8 -17941029780448 56958 1 -4174286555357 56958 4 7549411850459047 56966 4 7099124321323 56970 20 674487237544191 56970 21 -28001020106817 56970 4 -18225512728797933 56970 5 289571113539 56980 10 -438260271547104 56980 15 -33849025269984 56980 9 4561736082237216 56985 2 316170168459490383848 56994 10 4377165567641803 56994 14 -34582392074611241029 56994 17 -3629635159625 56994 22 -158877504883889 56994 2 -2961759500909 57003 2 2188762540384744 57017 4 -5669337935384 57018 16 12440247424327 57018 4 48294048300211 57024 11 -55988383099392 57024 79 55988383099392 57030 11 1905334898759 57030 7 -5534964557081 57035 4 -475027560468792 57035 5 9538877104421832 57038 7 6888832565719283 57057 6 -51222293047028069 57057 9 66456948167 57062 1 -145113575461369757 57090 16 1945322600543 57114 12 1041193306760967 57114 13 1009919046557871 57114 2 -868679215912701 57114 5 1880589511611 57120 44 -9085265098496 57120 62 -215064071570944 57120 67 9085265098496 57123 5 -39777565243320 57126 1 -340444960255333 57134 18 13479340677103 57134 20 -87786658172152737 57134 21 658435137630767 57134 7 -11195621279325 57135 5 4535824562056 57135 9 -1724868661060657 57150 33 108433338361896375 57150 38 36188689953375 57150 7 -2927700135771202125 57152 14 -69586246581760 57154 8 -562779459834445 57155 4 -9744123452723416 57180 1 269118422268832 57186 11 1132819156647 57186 1 -2075615487117 57186 13 132171691717503 57186 4 -4895247841389 57190 4 2120885532459 57190 5 6499646626059 57195 13 1536597946107 57195 17 494781045198183 57195 18 12839876743176 57200 12 27552763016000 57200 36 37025597448000 57200 48 -7022314722968000 57222 19 -4066470874551573 57222 20 -11204467140164013 57222 29 447386987377064979 57222 37 -45939280409865 57222 44 -225699684653666745 57222 50 -46342743385538241 57230 1 11205046722347 57240 16 197120950385184 57246 11 -5377274071037 57246 13 -5034563199469 57246 16 138898231425899 57246 30 -3091816518769 57246 4 1378536800296195 57246 7 -84208480689509 57246 8 16870561093315 57246 9 -2090758770773 57276 3 -595176138251136 57285 4 -720390056409229329 57288 3 6852037203085024 57291 2 -4181864834890808 57310 10 -37322499269461429 57310 5 -1475431496109 57310 7 -220056906974627141 57330 101 -62562314661777 57330 107 -953260899854193 57330 114 -5041114251506640657 57330 129 -1469184012353169 57330 133 -145044200436849 57330 139 -5545416018075129 57330 14 -100502096185197 57330 16 -3118308289173 57330 21 -157026104034597 57330 23 -10363205258973 57330 35 439680273678387 57330 39 -2412377970487317 57330 44 -2666362472079957 57330 49 7033171925619 57330 54 179045156671731 57330 63 -10016697609261 57330 64 446219323455339 57330 70 53859953683866771 57330 74 10793576408272371 57330 97 49750160749839207 57334 1 -181800766086381 57350 2 1306377948652875 57350 8 58283034981875 57354 10 -837193619596213 57354 9 -26180744273101 57358 7 -6321293346465 57360 20 -5579327451824576 57360 28 -44367755840704 57362 3 -17624464521065 57376 3 -298262669220352 57376 7 298262669220352 57390 6 -30117714076139473 57399 2 -449263224991512413 57399 4 349969464329608 57399 5 65499814111607 57400 8 -20158637400000 57408 5 26425484973568 57408 64 45652521594880 57408 80 -45652521594880 57408 8 -14448299554304 57408 84 -26425484973568 57414 2 -7522937384689 57435 10 -130445540602021 57435 8 1761231325639509431 57438 2 -21597695296059789 57450 13 -465732177426153125 57450 17 -44623753175125 57450 29 101906381540375 57450 37 -3725857419409225 57456 30 -128117762638272 57466 2 -12535235322429437 57470 15 -396207755441 57470 17 -40028314316201 57475 9 -53875156850101125 57477 4 5752974782680615 57494 1 396450670771 57525 4 -15748372223000 57531 2 1273812860205928 57540 10 -572042608020064 57546 14 125343528088347 57546 21 -17468640790353 57546 23 -18898010001082233 57546 7 13701191894307 57552 10 124934176114496 57552 11 1406042615168 57554 4 33710442138127 57558 2 63428665309336891 57558 8 86330892164887 57570 1 16486764631939 57570 16 182752297451839 57570 25 39187389428999 57582 10 2910833497337823 57582 12 9069229259793207 57603 7 28611498833000 57615 4 -13489607323940489 57615 8 -35162138630089 57620 3 113541506621056 57630 13 -2932448915463381233 57630 18 -123322867753393 57630 3 14985108470323 57642 14 173911723033879 57645 6 -3115326694509 57664 10 13820442776576 57664 12 25472031446528 57666 10 -131251776239305 57666 3 530631454571 57673 7 44835563498824 57680 15 154442711755072 57680 19 6593965342784 57680 5 13979010942677376 57684 5 -11606105068881632 57690 8 4013544759443343 57708 1 10382296466368800 57708 2 -384529498754400 57717 26 -20869113555576 57720 14 -7720494537715172416 57720 25 -7570484651296 57722 16 141856808094855 57770 4 -25984339185509 57774 4 19187956359863 57785 4 -1978591631581592 57792 39 -217717685756416 57792 62 217717685756416 57794 4 -81660927780765 57795 4 1915405898292584 57798 17 58080183724251 57798 22 -1119063055473909 57798 29 181972256315435703 57798 40 -219411768462705 57798 43 -655437172279617 57798 4 -6739713196867989 57798 49 -409440532809321 57810 1 10542823763096467 57820 14 3673545813715904 57838 4 -200061434656457 57840 48 -1475391442050496 57840 51 -36258952406464 57846 9 -404513025805 57849 6 1684343107465352 57850 2 -1103010220125 57850 9 12996653974875 57855 12 -63561928123576 57858 6 -1210075766801569 57870 2 -18401575372173 57874 3 -2119532680665 57876 10 -9596425513312 57882 1 -50576628886381 57890 10 -3392819485651709 57918 15 1184615565583233763 57918 4 2208172456823347 57918 8 -88226987889005 57936 23 -4089413282633920 57936 28 314016329708864 57942 6 -14308610152293 57942 7 15823970388099 57942 8 108537346374471 57942 9 -427247200478673 57950 11 -65867585591324125 57950 15 34242695874807875 57950 28 -31325813228125 57954 2 -8867048663933 57954 5 -260541698165 57960 29 -8174521038965184 57960 30 31225349427264 57960 44 -50648560479936 57970 2 180182733528203 57970 5 -30466046121389 57970 9 35354481548607 57981 8 -307875267064 57990 1 -105353597717 57990 5 -4007810433581 57994 2 -2879051816357 58005 1 77772992868072 58006 7 -272238022737 58016 6 -693091389358592 58023 6 -6616757926584 58026 6 -13434174468953 58029 6 2702451344895000296 58032 16 -20603794834368 58032 17 556302460527936 58044 3 -36314332480 58050 12 -108823318003125 58050 39 80588897409375 58050 52 -48387209243625 58058 15 395536519735839 58065 14 12810877183223 58065 5 43578806877928 58080 19 -675873994419712 58080 23 -181453456809856 58080 4 95062731151168 58080 53 -95062731151168 58080 5 675873994419712 58089 4 -570085746955352 58098 3 -76144065511933 58098 8 6863723818255 58100 6 39923340053868944000 58100 9 27867346704000 58110 11 -83290315457393 58114 3 283405472701379 58114 4 -826255022453 58114 8 -73617802952561 58115 3 980425555291368 58122 7 -14865639748461 58135 2 -2119357037321 58140 14 -40043388597984 58145 4 899740257153759 58149 9 962383000950216 58150 1 -15552415890533125 58150 4 -124419327124265 58170 10 -16181153222669 58170 14 -849971115253 58179 4 8010785289979 58190 6 -2920641261507773 58194 15 618885823034452671 58194 19 -55722949417890801 58194 4 35971163754723 58194 7 1679608016254467 58194 8 -837232662207357 58200 12 1631532425104000 58200 23 -277635127600000 58212 11 45332310565202976 58212 14 3568432610088864 58212 17 -132164170744032 58212 5 -1223972385260480352 58214 2 -29795226886333 58225 2 339122366715375 58242 4 1174647344707 58245 3 -1989099760877 58254 12 -8661590515045 58254 1 32066165524607299 58254 21 -281507188572161 58275 11 61315580437875 58275 22 4522334169753000 58275 25 -16693041853125 58289 2 -109674127053784 58290 12 -309249241396721 58290 23 158451094194479 58290 2 4052529171342811 58290 3 -1235689374303989 58302 16 432783369817839 58344 3 66746406979520 58350 18 50794564972375 58362 4 -13187949948829 58370 1 21872163147427 58380 5 14196271340672 58380 8 -96614243858656 58380 9 42598625395117184 58384 1 816351780652480 58410 11 3077192426727411 58410 25 -2616976122379497 58410 28 20945087687583 58410 38 4004444454471 58410 44 479027588885991 58422 3 -5631590778605 58435 1 1344066711112 58450 14 -84280691589337125 58473 6 16308119879102952 58480 8 -13336475208378048 58497 6 -396701946102520 58506 11 -223496828969365 58506 34 -48367029805129 58530 6 -2300035311577 58535 4 -111038734856529 58558 2 113117354413515 58558 5 5601550821990103 58562 1 -3017279835037 58578 2 2929245487219 58580 2 38320701885856 58590 15 -413207188029 58590 20 -8255227626522981 58590 24 -85308383070261 58590 26 6751346136219 58590 37 80392405012191 58590 45 222891145916120487 58590 51 -175836960121257 58608 18 -4068109487736864 58609 2 15053825123144 58618 3 7145094132556227 58621 5 -116907978542401 58630 4 57533459421023 58640 8 524697113687392 58650 1 -110619776889125 58650 12 2702564577269875 58650 14 110588146496875 58650 2 -256843543357565 58650 26 -18840954728125 58650 27 236312543346875 58650 32 -198537957353125 58650 33 7801521621875 58650 34 226975134761122375 58650 63 -32105442919695625 58650 6 -653791631292125 58650 7 6922834629389875 58656 15 855461951488 58665 1 2013096838451563 58674 14 -131583847022585 58674 18 -3489189451370209 58685 5 -6312389034795921 58685 6 19853397914031 58695 7 36743164793243 58704 7 -42577112675008 58710 1 3003514002163 58710 17 -19091020550689 58710 7 -19638406933669 58710 8 -3116516573809909 58729 1 2207443424328 58740 4 7775982905248 58765 1 1367410085063 58781 1 -1367944615625777144 58786 15 -1840141649501 58786 18 777783302479 58786 19 -7978087967121 58786 23 -1606210981163057226105 58786 25 715084103679962743 58786 6 270885326139 58786 7 -678201505444151552557 58800 115 -2181647946520000 58800 155 -348513313400000 58800 176 -71399497400000 58800 184 456138179560000 58800 235 -171630529336000 58800 265 -14254688980000 58800 4 344956491208000 58800 45 291217241980000 58800 79 -320460010192000 58800 90 -140282180164000 58800 97 88688240900000 58812 4 1511332473083680 58820 5 3394313286505632 58825 3 66992880341375 58825 6 -113370320935000 58830 3 58832869708043 58830 8 -1070260961928697 58838 12 -15766508701241 58842 2 20702219690475 58850 4 -4424994708173839125 58854 14 7013740864319 58854 6 33749080479595 58854 9 -103311191175351301 58864 2 20348668760820544 58870 16 -173783734943337 58870 5 -12800805101253 58890 1 43610727186867043 58890 3 14405517081883 58905 16 -2149332235821 58905 19 -1097476019576397 58905 21 7597724469147 58905 24 -387367080057 58905 27 5340421628697987 58905 3 58031970367167 58905 36 -154791078439941 58926 11 6600042681175 58926 2 -31833304140923333 58928 13 7206592258368 58930 1 -25355143182133 58930 4 84863437371857663 58938 10 -584898156407197 58938 14 -87397624661094037 58938 4 416902968881299 58938 6 136658351507788171 58950 11 322919621071875 58950 15 19309454746875 58950 19 -3921599728125 58950 65 19868318904375 58968 11 -6070927977445248 58968 31 224849184349824 58986 5 55113848189091 58986 9 6105515719383 58990 7 26956009700523 59001 1 7616301755275 59010 12 133253611095151 59010 17 84497515907111 59010 7 127881994922963 59024 10 13178700827240768 59024 13 -100126455657920 59024 6 32886977448515392 59040 10 81177855763392 59050 9 -7589529815625 59058 22 -29664559506969 59073 2 -753104709295352 59094 27 911487638642427 59115 4 -721520792220689 59130 10 -409386400463097 59150 13 -43567072604739125 59150 33 -2866095892927606625 59150 5 -290330194357125 59163 2 69910618378024 59166 14 -2383925008280481 59166 5 181376792958771 59169 7 396238672773064 59175 9 -86252623551000 59193 2 7653513016107 59200 19 -34011163008000 59200 55 -142602851656000 59200 59 142602851656000 59200 70 34011163008000 59202 10 78067171739835 59202 1 -172594517154021 59202 20 4660051963158567 59202 27 14908804255935 59202 30 -61454206356921 59202 4 -41371630452693 59202 8 -269078490400221 59214 2 -29423354864237 59220 18 131532293722752 59220 22 -17287120607616 59220 30 -159890985390816 59241 11 -9108233510264 59241 4 19368373224403 59254 1 -547112827532947986253 59254 2 -62932491539965 59262 8 -6101202679969753 59280 21 8177362082144 59280 33 -3165858556017344 59280 41 174084682764608 59280 54 2933356675904 59280 8 217685526036256 59290 107 6830370793258551 59290 116 -1046961881690941601 59290 118 -110875739584841 59290 13 -187838494561333 59290 18 -1208046602726117 59290 25 -183184436459717 59290 35 -2208035035977309 59290 46 -78651027249949 59290 65 3052367002014407 59290 76 -1792540315099457 59306 3 154552063227355 59318 1 -6873729300829 59318 2 28930168377811 59318 4 -46425773191139749 59325 22 -126814673035000 59330 4 -1829823891746841 59334 10 135136939010363 59334 23 -3672804561625 59334 2 -49203344351213 59345 3 -82015909827704 59354 5 -5961539970557 59355 2 -127352178870633 59367 2 -155128544138168 59367 7 3293838047914462952 59382 12 -17543671011513 59394 3 -18654544629830629 59408 4 2969022579264 59410 5 -1034550131337 59415 6 -152886392464815793 59430 14 -303815899939861 59430 19 7561829391731 59430 23 -7649349274673 59430 28 4885458301639 59450 20 -7725501976460625 59451 1 -26162555893904588696 59458 3 194102295177771 59466 10 -77211173126917 59466 3 98032028878230371 59466 6 81253021774086467 59466 8 739342504034603 59470 6 -21221739215073 59470 7 -2202686090310817 59472 13 -58226296118976 59472 27 79384875170112 59472 30 -20792863481760 59475 8 108140259050875 59478 12 -207754144262225 59479 1 -16919698272121 59514 7 -31834122371297 59520 26 2077104375296 59520 42 78434241565312 59520 75 9793357734464 59526 6 133557170093559 59549 1 -1882888363198457 59550 12 -1947004959424625 59550 19 5291469695375 59565 10 -2111282628162821 59565 2 -108803214504917 59568 17 9952583475520 59568 30 -76291520588992 59570 6 12173417837027 59590 7 -323625759769 59592 3 -28208634277472 59598 11 -477230552612056125 59598 12 6907098304035 59598 16 -291175176913713 59598 19 -2047326902889561 59598 35 24541119740871 59598 4 -103431660603741 59605 2 321717792695391 59614 2 10987302241477907 59619 8 430753465928251304 59622 4 -239992789955345 59622 7 -91043330889329585 59624 5 -5201451056960 59630 6 -248458167455132033 59640 6 7949602926784 59658 14 -4222029474006697 59658 15 -3925414130041 59658 16 33762964399775 59658 3 -16316296004213 59658 4 -498135563333 59664 13 -694642849414784 59670 8 81345426044427 59675 10 -2519267962175000 59675 14 1674878670384200 59685 5 -15336996455512 59690 9 89504836574023 59691 4 -797142898621 59696 8 -863138979101888 59706 1 2155627234683 59706 2 1709830112643 59706 3 -39221525246157 59706 8 133232634839943 59710 3 -5578649407953 59712 40 119554499529728 59712 6 -119554499529728 59727 2 252658988936 59730 2 144861142457696347 59730 5 134775130684941667 59736 2 57466862554240 59738 1 -7309661846381 59745 7 1797890220391931 59754 5 2713362081930323 59766 5 -21891782334925 59770 1 30514437487827 59774 19 -329659673396273 59774 7 43050508184035 59787 4 -1101482138385 59800 9 -29439708336000 59802 4 -20023244581357 59823 8 -209959536266433 59826 16 169474274468575687 59829 5 -20598868019577176 59829 9 716280158932163 59840 29 649634720117248 59840 3 -649634720117248 59850 104 12099901341375 59850 11 -321049216369125 59850 113 -6410978465625 59850 131 949725470311066020375 59850 135 -61513659547565625 59850 147 -22437869315625 59850 166 -3683413409810625 59850 21 173096418571875 59850 49 -5674505612725125 59850 56 -13354058989125 59850 58 217549976329078875 59850 59 2605032586465875 59850 69 -492109276380525 59850 80 32438750291746875 59850 81 2335518308446875 59851 1 49934440 59862 7 -29223379766300008105 59865 3 3759899289128 59869 3 -177996157161912 59878 10 -25310801257589645 59878 23 82026077590079 59878 3 -230013813690773 59880 3 10071015860672 59891 1 6678746751743 59898 4 -2598459762853 59898 9 -11197127638889 59906 7 -2734662296493 59914 2 -329946914570373 59917 1 509402513127929032 59925 7 1641370094641000 59942 7 -9231819809373 59943 3 539940970586107 59950 1 -1166287349125 59950 13 -15457232466128125 59950 18 -2817649703125 59950 2 51202286962875 59950 28 -123657859729025 59950 34 -24571327990625 59970 6 -2546904752909 59976 19 -1846449819910080 60012 2 -3485448511200 60015 1 1215266016875239 60018 16 494987273927 60018 1 -7489883850245 60020 1 -302171146757568352 60030 11 28309185828243 60030 17 -22027741612461 60030 32 10303620187712479983 60030 35 -25290310259453337 60030 43 137434004976879 60040 2 -4210299366962624 60049 2 23324977761416 60050 2 -12003509485125 60060 15 -107585881813376 60060 21 586435079976992 60060 24 -2363173509079648 60060 29 9174965244231968 60060 9 -10652539715936 60066 4 8456450164533397179 60074 12 -1757417378996813121 60078 10 2498718076831 60078 9 -10213098315517 60086 3 -119367896088797 60093 6 -22202905684536 60102 14 -47174543106993 60112 21 2059398904767040 60120 25 -308612427146208 60150 11 -81268420331125 60150 22 -417922206625 60150 8 -849891026125 60155 1 -2043071371448 60163 1 -4751560632952 60165 4 -22190391704853 60171 1 675406709704 60180 2 -672893148032 60198 4 -138484990889 60208 16 253727877902400 60208 5 695199207080512 60214 10 -1539075608181 60214 20 -283329246467668897 60214 2 -241429737122965 60214 6 -11002240043325 60214 9 -29841180165 60225 16 2509865657000 60225 5 346404164041000 60228 2 126586048840992 60230 8 5204239585047 60240 11 -38615860922048 60240 13 120301697200188736 60255 7 -525935489531544 60258 12 15381323449906139 60258 22 404015690961542935 60258 31 4617187534223 60258 5 -359627093987851133477 60258 8 -303542968415885 60270 2 -1344675331012517 60270 25 -186148980096569 60270 47 -33632945392512529 60294 4 -426046059973 60294 8 -2869295415481 60298 6 17674274135951 60306 12 -40052278679638573 60306 17 1959597516019159 60333 6 -1341374459780888 60345 13 -17062264029816 60348 5 8032969814048 60360 4 -36741016828736 60382 4 546885547263 60384 16 -4772486278111744 60384 4 4772486278111744 60390 14 -14941437256701 60390 25 -44617862733849 60390 28 -96798560605160697 60390 33 -1867148053814169 60390 9 292092864869043 60401 5 -5777633411657 60401 7 78794289365320 60445 1 -30469716424197 60450 15 -35506575353582316125 60450 21 39431961359621875 60450 22 7224037633675 60450 34 230184702933875 60450 36 -14471441797430125 60450 37 -9283636118125 60450 47 -196205256373625 60450 51 -76488040876625 60450 71 94425984659375 60450 75 510046690754375 60450 76 315455690876975 60450 7 -734915172729897125 60450 78 903004704209375 60480 36 -17563194579456 60480 68 -17322183258624 60486 11 1919205446687 60490 4 -91138624357291741 60516 11 384583268945088 60516 17 -14381722816787520 60519 1 -4793940494360 60522 12 -980283663521 60528 36 3918199914368 60528 37 -4325441489344 60528 6 123434964679616 60534 26 772332525460935 60534 7 -28604908350405 60543 13 2288154751256520 60543 20 -68166418194682987320 60550 19 -16457923490625 60552 16 99801534642624 60552 24 1205008148366784 60552 4 29388943730517494976 60573 1 -222413520283777 60582 2 -17810491814981801 60582 4 829891869774607 60585 7 773616015827243 60600 3 -177318529496000 60600 4 -489526323128000 60600 8 62771267800000 60606 14 -1353754913813541 60606 15 25486339840358571 60606 17 -11084551600725 60606 23 5242033655450775 60606 3 -10490010822045 60606 4 -141534908697170925 60606 6 -5422918591845 60610 13 -2797957854485527933 60610 14 58676740630947 60610 22 -33331802632109 60610 5 -26250909405877 60610 9 1769378182147 60620 3 -664295280642944 60630 10 2128169761269854023 60630 6 67888563257987 60630 8 2257051387931 60648 17 -79204778788960 60648 23 -25154674819327808 60690 14 -190954405487789 60690 20 -588518558084773 60690 29 33154483051462571 60690 33 -6939370823030101 60690 50 153549568567583 60702 4 -26823852972037 60705 9 12213724233951 60720 17 -2297931738588352 60720 19 36211506221888 60720 49 -11537132448250304 60720 68 -13453875073216 60720 70 -35546479355584 60720 71 46626848730944 60730 1 103067187185699 60736 12 -4484701527552 60738 3 -1004260339565 60738 7 8631159415615 60741 2 -90243665385453 60753 5 2407244527217384 60760 25 -72832709410496 60760 9 -4026326401772416 60762 23 176838352257527 60762 3 -347377021978661 60762 6 -984642208778701 60775 1 -119595542926625 60775 17 178605868722725465000 60775 5 1428846949781803720 60784 11 51708770174528 60790 2 -3692404606509 60802 3 244944049715 60816 12 194536196747360 60816 20 -992180198377376 60818 1 -6654834005985 60820 1 -74391595815744 60822 9 5210279034903 60830 6 642350241953531 60858 19 793661373542331 60858 26 -251173198435509 60858 46 800088877426671 60858 59 -725632094941929 60878 2 -8388529604975601 60880 4 -46857486550464 60882 5 589710638409103 60882 6 -672741747593 60885 14 -251419494764089656 60885 18 9311833139410728 60885 28 109395407911176 60885 3 27187150392648 60886 1 -78678800414325 60896 1 2978678855697472 60896 3 -2978678855697472 60900 19 -261659436508000 60900 28 -7978996486000000 60902 2 139041896701807 60918 6 18261414977291 60918 9 -174345931098737 60930 18 32052613658103 60930 21 1274292831401199 60940 1 -116786685785807168 60950 5 -548216165049625 60960 7 -258342189756416 60960 9 258342189756416 60970 18 8098639075268559 60970 22 7316489561471 60970 6 6411943560617811 60984 25 5374401687775296 60984 52 -574546948142112 60990 17 13712615904223 60990 31 45421589981159 60990 3 3717075060894403 60990 35 -170050789439929 60990 39 -27000998281729 60990 4 185492577455083 60990 8 242934451281049267 60996 5 7186324440736 60996 6 -128429902236403936 60996 9 -33599448380224 61005 23 35157385648259 61008 12 -47383018795648 61008 14 2737226403732032 61022 2 -24528948693345 61026 3 4648908959659 61050 16 446217465536875 61050 35 27511679947540375 61050 48 -5817753400625 61050 63 -6936185832144625 61050 70 3569739724295 61050 71 -33765392526625 61070 1 1252150189770771 61074 17 -22624042183965 61074 21 14726935444540743 61074 29 610849138967055 61074 34 -1616976549369 61074 5 -397627257002600061 61074 8 -7000407962757 61098 10 -4411225329406578937 61098 3 -737312516965 61103 4 -412127148800024 61104 22 6039157769792 61104 2 -271770715452032 61104 9 -12232878083782336 61110 13 -141428837285037 61110 18 -73835492268789 61110 32 13341995782191 61110 40 -1271407032174033 61110 4 -494147991933 61110 5 -938093897637 61110 7 5828747099211 61138 2 4417890328531 61138 4 10786181857739 61146 6 -52225510035825 61146 8 -1155290116510953 61161 4 -50271934909400 61170 4 -2779497002557 61194 16 1208277010655 61194 17 -3722696223812425 61194 18 -1294961637241 61200 144 -583844786447040 61200 168 -72980598305880000 61200 178 18175762064520000 61206 13 -5884900489867537 61206 6 -12950892670648733 61215 17 -148663217227384 61215 5 -108895136174936 61215 6 -24481826280701 61218 13 -1800444587007969 61230 14 -134480425259427229 61230 19 -8351204505857 61230 20 1116711730741303 61232 3 4943391390080 61235 1 -28863646265528 61248 29 76121035582976 61248 31 47503337131520 61248 41 -76121035582976 61248 44 -47503337131520 61248 7 -17253288272384 61248 9 5982599835136 61254 3 -8644754151765 61268 3 8487479420164736 61272 5 -1172489426208 61275 5 -13864263013871000 61278 4 1602638245811987 61308 2 -4453912690560 61318 3 -2818333127125 61326 12 100690269883623 61326 6 -130142727209061 61338 6 7163991766943 61347 8 -240625324209337496 61350 11 31490246889852875 61350 14 -9225900412499125 61362 10 -151429555558090053 61362 17 -1257689152179909 61370 1 -6965563406847733 61376 37 -1509491775540736 61376 5 1509491775540736 61380 18 35135912152224 61380 1 907412811712128 61380 3 -33607881915264 61390 3 4364163112679 61410 14 -10249198886521 61446 12 -570381472634813 61446 23 3463920495539 61446 38 -6003731274656633 61446 39 35370128779111 61446 44 40689988230871 61446 53 -150931258438136057 61446 54 104060516119903 61446 6 -14903831998349 61446 62 10394116474992103 61446 68 394201862396279 61446 77 440032823434799 61446 79 -78997325736889 61446 9 447654743828803 61455 1 -18996397770453848 61456 1 143635900730912 61458 2 -8842255673437709 61490 1 -1387333970677314109 61509 3 206870090552299 61525 2 863486325000 61530 14 623452912720919 61542 10 -17463816277101 61542 17 -237217222862433 61542 8 -10347902829152325 61555 1 10342832955047 61570 1 -62734192620093 61570 5 7895438094723651 61586 3 -12091627763209 61590 11 -8363475875521 61590 2 -934904550077 61594 3 11788651683459 61596 2 -13304920166784 61596 4 47309222561362270848 61614 13 -66981988216900737 61614 2 2480814378403731 61617 3 543517623435880 61620 3 -1298416559034752 61620 7 -17409924680032 61626 5 -935895663937 61632 23 161625535651959552 61632 82 -161625535651959552 61642 17 -2132214512111425 61650 12 -2381320428310125 61650 17 -140591525428125 61650 59 57349985070375 61659 1 1360814638086747 61670 4 -304113791269 61670 9 25388270199279 61680 16 -217050603931072 61686 2 15095168524251 61686 7 -407569550154777 61698 6 -17810081307901 61710 25 -24537563376733 61710 42 -8346741253433 61710 49 13113008891344351 61710 5 10667181103899067 61710 60 -142258906273033 61710 64 282687045555089087 61710 68 -33468458383657 61710 70 -357968136776041 61710 8 -458778348827117 61711 4 -97593494973560 61746 13 -399331848601 61746 6 -31938920150293 61752 1 -80535958179776 61758 11 -15191187004347598305 61758 13 181548251537319 61770 15 -857161590373 61770 16 -933236051367637 61770 22 523712017783 61770 31 -60632230518586729 61770 32 -9632766823129 61770 35 -57516737989681 61770 6 -11612656466695277 61770 7 32081490959563 61776 1 -104023131961536 61776 31 15824137243968 61776 32 53985029097024 61776 48 -427251705587136 61782 9 164979005019823 61788 3 -136935790008704 61789 4 1122718514211 61800 8 -17681099181416000 61815 2 -6357144582296 61820 3 -388576657897344 61831 5 -90308006633944 61840 14 -75271486615504064 61864 1 -12819733662592 61880 1 -435260801107472192 61886 5 -5151766017437 61886 7 403967050489855 61893 11 16955096959339551 61893 7 -304005545555373 61910 12 -917839602729426969 61938 1 20797265823795 61950 11 -554581503125 61950 17 198525808221875 61950 2 -328956579125 61950 44 22524229453375 61950 62 10868189218598375 61950 65 -8411165357190625 61950 9 -67289322857525 61985 11 -7987028436856 62001 13 -2257443880341912 62006 13 -2309557554361 62006 14 -10124447661381827089 62007 3 -1394296124002172497 62010 22 193971339096939 62010 23 21489168286899 62010 32 -2575837975200489 62010 36 -107262881002233 62010 37 980256119261463 62010 38 -29104475066217 62010 4 235675739611467 62010 51 -149610675509001 62010 54 13349569579621839 62010 55 34092770895553599 62010 9 -54937012905117 62016 13 -98222140514816 62016 35 305661994718672384 62016 37 22193481618944 62016 49 -305661994718672384 62016 51 -22193481618944 62016 72 98222140514816 62016 8 -13265377528832 62031 6 -923783362525 62034 9 7513853277511 62040 11 -14366619367264 62040 18 -38253267877917438656 62040 23 -267383521422656704 62046 16 15081866264367 62046 4 -407210389137909 62046 9 -1180684449549 62050 16 196068519758346875 62050 24 -131906513517625 62050 29 -1950885030452625 62050 32 1568548158066775 62062 8 1124273406735487 62073 13 122105551493079 62075 1 -3718299740147000 62076 2 -154531688473952 62094 3 -2586422351917 62100 24 -7531980918696000 62106 6 6898296070819259 62118 11 234242178024051 62118 22 64231365662379 62118 23 9166663959795 62118 28 -20719517587425 62118 35 201393685771839 62118 37 -278489306007513 62118 39 -142616997182169 62150 19 437488363362375 62160 19 8310655865678048 62160 48 -23853030329024 62160 49 4436273636416 62160 53 -18201057174208 62160 55 22747089186368 62160 6 366984048400192 62160 74 159219344833856 62162 1 -179323331758025453 62175 3 5643655485875 62186 6 10893794842351 62190 20 -2045540751741 62190 34 16206954392079 62190 6 219927129284763 62190 9 -11032114181877 62202 13 -53875438735285 62202 2 -1084422099868757 62202 26 -12009609213769 62205 13 -16277249042029 62215 1 -78935711004728 62230 24 -20069673376697 62234 3 -2505716150665933 62244 24 -107023128972768 62244 30 -739759365189216 62244 33 30393155289888 62271 6 -49957905260529 62271 7 -138706210049193 62286 2 22556436143291 62304 1 -65328327208448 62310 11 -8388115991826101 62310 28 -1375520767133041 62320 13 20931612770368 62320 21 5840372748608 62320 8 -896902681657536 62322 11 -795602816485001 62322 2 2258154837940843603 62328 36 7691684434860893824 62337 1 133519397820980203 62342 2 -64371996429245 62350 11 -3467612333687625 62361 8 -578325484778422680 62370 11 -59261631032421 62370 20 1600064037875367 62377 2 -397774101699800 62400 119 -674060815232000 62400 152 -4686581718771200 62400 173 -39505662922240 62400 183 674060815232000 62400 216 -17863998400000 62400 77 -202666816000 62400 98 4686581718771200 62412 6 4291821809344 62415 5 516067865136819 62415 7 687267300744 62422 1 579814332184467 62424 2 1791639138863808 62436 1 16155008571100960 62447 1 -2597436528056 62466 10 -14185264409748937 62475 16 148090345573177000 62475 3 407905347017035 62475 35 -17488941753355375625 62475 47 -1429211167386625 62475 56 -139911534026843005 62475 64 50988168377129375 62475 66 467985013685000 62502 4 -17996539418405 62510 18 1461848745472767 62510 21 2727358992287 62510 2 6939085801156363 62510 8 2290683780014198972003 62514 2 -49015461510477 62514 6 -1615024600985313 62530 19 2022532109209287 62530 5 23094795152611 62530 9 4443503043932803539 62550 12 9667028554875 62577 4 899137447142751 62580 4 -3805726134204457856 62580 5 143249770895560944544 62586 10 -764279980119153 62586 12 47443845100887 62586 14 5706111211479 62586 3 -154065002709933 62586 6 28306665930339 62595 11 -91244568231864 62595 2 -175512375109557 62595 4 4738834127958039 62595 5 60228117686907 62595 8 474467880866472 62601 8 -426261994129 62610 1 2842907801707 62622 12 7993372388201739 62622 45 -1659707675550729 62634 14 610976904953893451 62634 15 -1327886301286272781 62634 23 -38847028476833 62634 31 -2434226680081 62634 7 -184543166843693 62634 9 9668026207891 62640 19 -4823882486208 62640 29 -20807268779968128 62640 36 770639584443264 62640 41 -104818393185984 62640 9 92051645500224 62643 1 -37446974774132309 62646 6 -757134461379761 62650 12 9971254371021875 62650 18 -1691061579128125 62650 22 635368092691375 62650 32 -13528492633025 62650 34 79770034968175 62650 5 363724698133987875 62658 27 -14575876426251585 62658 28 6628473277843095 62670 12 -877702508470657 62673 1 1865686236460435 62678 1 -417067792460605 62685 9 -2754255133528137 62696 2 -531981556608448 62698 3 15431125735207 62700 12 -3764282300000 62700 13 212978254420000 62700 19 -24540578338400 62700 2 -20040898202108000 62700 22 -5597945596000 62700 38 -574144899760000 62700 43 -3067572292300000 62706 1 160072319660219 62710 4 5724544357567 62712 4 979627759395264 62712 8 2503667800512 62715 1 -12319744653197 62715 3 -2990068766072 62725 2 -1895672148625 62727 1 -3722806457432 62730 18 4370822950774570263 62730 3 -161882331510169269 62745 3 -44061431482657 62760 6 -311281419613125952 62766 3 -460447442644869 62790 16 -922176609661 62790 27 -15545398505254073 62790 35 7004598273919 62790 39 1971053061193007 62790 46 -728472333406609 62814 17 -291859104821150825 62814 19 -1141549828290361 62814 5 2268234472993291 62818 2 96813699152723 62826 5 -19408501581229 62830 2 -107020321997506309 62832 11 378157141728064 62832 20 4460268460096 62832 39 -82209870412480 62832 45 -131971109134528 62846 5 531651213451233035 62850 11 -1178253335264725 62850 14 -147281666908090625 62866 4 -29477021721021 62874 11 4084555780863711 62874 8 -24422165344233 62883 10 -245796672085848 62883 3 6636510146317896 62887 1 -5748044144021 62890 4 21836598046842087 62898 1 162690984267211 62898 6 -2732967561673 62928 17 62110848009024 62930 10 263538840183499 62930 11 60037965235947503699 62930 15 -747818498673793 62930 6 39921345238347 62930 7 -70666954664753413 62934 2 324042569249779 62937 8 23662889226495 62946 6 127858111681923 62946 9 -58567426616061 62958 6 -201212730443269 62958 8 -20766458899745 62974 9 -472406136245369 62985 9 -18080655783841 62992 18 -105202130636736 62992 5 -132500692502720 62997 1 84691269923995 63024 17 502450817035328 63024 9 -2874776358176 63030 5 -657480207277 63036 1 -823570305634368 63042 14 440546669103871 63050 1 -63233900496125 63054 12 -12640267058157 63054 29 14692637284047 63056 3 158522459288768 63056 9 31945543918912 63060 3 -3289549411346752 63066 4 -3710559845999897 63070 2 -8110941350373 63070 6 55381270499983 63074 5 -23991157945277 63090 11 -137091875166621 63118 13 940389748661879 63118 5 -30869026918965 63118 8 -1866021050223593 63120 19 -1635605305856 63120 23 377895791025728 63126 18 511110190863 63126 7 -13799975153301 63130 2 22886601504643 63135 9 -6141915671832 63138 7 2527238049911 63150 37 305136892262375 63150 43 -67377125760625 63150 5 188321842671992875 63154 1 142374941785539 63156 2 -6099513348320 63162 23 -171546085243394829 63162 52 5342893858877751 63162 55 -1210998868446609 63162 58 3334233254873895 63162 64 228327839458958517399 63168 10 -5642605007360 63168 88 5642605007360 63175 11 136985224977000 63180 10 53017562349504 63180 12 149162056880832 63182 6 -6670760185809 63184 4 -25893990015314112 63189 8 2334810998043 63190 2 127613014907283 63190 2 1993955117283 63190 5 619817636431 63190 6 863311263264271 63206 3 25745262830519427 63210 1 -60651811100573 63210 23 -6911424319933 63210 27 5402520933299 63210 28 -9989627997902581 63210 32 2126615407903 63210 36 4261731647887 63210 45 83570128428871 63210 56 -719280987896575657 63210 5 -993169356145777853 63210 62 -28664554051102753 63210 71 10526260300601759 63222 2 -18360080054117 63225 4 93392511303375 63240 10 257458259734336 63246 5 -27407473504583365 63246 6 2660543779067 63270 10 91365217961067 63270 18 -1345302542763261 63270 27 3484832182767 63270 31 -1436488485072489 63280 16 574068167092288 63280 22 -226034819659648440512 63280 7 16574782524992 63294 12 32911096559867 63294 1 -448769894186501 63342 10 259052452446831363 63342 18 -6997146646170767697 63346 1 -40163543443405 63350 13 1434597992017875 63350 18 -18175596638625 63350 26 -134195976526625 63350 33 931691676361375 63366 2 -1530545551411121 63369 2 -655346593080 63376 5 38883229094733632 63378 13 -397087175745 63378 14 110623595877927 63378 1 467801532171 63393 3 4590717710536 63393 6 -93571957921240 63417 1 194012697244627 63420 12 -40307923268992 63420 15 -1096166800445536 63425 4 24141609333000 63426 12 142025617362203 63426 22 156845421648631 63426 28 -23083722146656657 63426 3 414770875098571 63434 4 -6716814215362021 63440 4 8181022157504 63441 8 -30244464170901 63459 4 176507979054984 63462 12 252782495404155611 63468 2 1720460927749248 63492 1 -11314318875488 63492 3 -23039119576160 63492 8 68443439005480096 63495 12 -105598502279109 63501 2 -32623077334429 63510 16 127708243568819 63510 17 51572259107171 63510 24 10991417334407 63510 30 -7091712175609 63516 8 -70843659041152 63518 6 11011909129775 63525 11 -171602397184625 63525 3 -11149476244775000 63525 32 -359035844730200 63525 45 -114532851305125 63525 47 10134212870375 63525 63 -89195809958200 63536 35 2512143870274880 63546 13 225005120496395 63546 2 1421451981307 63547 2 161461967978376 63550 14 43141908901375 63550 16 67382578542375 63550 17 -252865399262625 63550 24 29495945117375 63552 10 4480647081472 63570 19 -1167047296273 63570 2 310516067052307 63570 7 791742667557133547 63570 9 -8846931169909 63580 11 263085070300064 63600 18 -1054059356786392000 63600 46 -67901332572152000 63600 59 8483876200000 63600 63 -233071069760000 63600 66 -930827779640000 63600 72 253712094056000 63602 4 -8446725964117 63624 3 14547060172129472 63624 8 -200962302750944 63624 9 -679168599616 63627 4 -4384906179544 63630 21 8234159088051 63630 29 -53714811711681 63630 3 10026152879499 63630 35 -75053376440433 63630 37 10722700405647 63630 42 88571928232719 63630 45 -15480568340649 63630 7 384982620949683 63632 4 -4163515106178387392 63640 1 -39317031420992 63648 17 -15640150647168 63650 7 -1872026393476625 63651 10 80457030335080 63654 9 -70093320376584313 63665 1 235261528032392 63690 3 10676042262811 63690 7 -3109228218541 63700 19 -28049271345900000 63714 5 220647145994983 63714 6 725847263695 63717 1 4813375972744 63726 6 -795822821513 63732 5 2024345553663392 63756 34 -555671764006898400 63765 3 -9900229111128 63784 6 16903416325760 63792 21 -68148183957696 63802 3 -2221454965266485 63802 4 -5095005267385 63810 11 232454661992466327 63822 2 -15540908353037 63825 20 107893025000 63825 4 -64034224465625 63825 7 -315469253403125 63833 4 283859825544 63833 6 -4719458418821 63840 34 1651608160768 63840 42 1079324036764352 63840 5 -1079324036764352 63843 4 195298724343592 63861 5 -8418529793677240 63870 16 -71453823930721 63870 4 -1282123624997557 63878 1 843306413757435 63878 5 -16223093229067237 63882 13 48865982175387 63882 36 -2994995122854813 63882 45 1135604444660127 63882 50 -8270432190944937 63882 5 306312303368331 63882 54 -12853410248636217 63882 58 80864868317079951 63882 67 459804415890807 63882 77 -1319381518735449 63894 3 14085699476651 63897 1 24811775170984 63897 4 -834153688435337 63897 7 907058405392111 63897 8 -170183965897779256 63900 22 330276733200000 63910 15 -312024564377 63910 19 1231313762799 63910 22 -21873861354241 63916 5 -397892067054976 63918 5 231143544252772947 63920 6 710824007890389312 63934 1 54856920073931 63945 14 -9699881910957 63945 16 -530293601717208 63945 9 221994175134312 63948 1 -1398293709312896 63954 11 24823636426345419 63954 19 49751478699516639 63954 22 6574965435835911 63954 27 -9700891627905 63960 18 -76916689106752 63960 4 1617458835104 63960 9 -427893485590601792 63966 10 100494766949527 63984 14 -92861342393536 63984 18 427978355060800 63985 1 -766441620873 63998 2 -88637636272789 63999 6 -1183728474072 64014 1 132203256745339 64032 19 2119404513766400 64032 8 -2119404513766400 64050 29 27267094106358875 64050 32 -304831375931125 64050 38 -71387607359125 64050 52 -8923450919890625 64050 63 -26842085088729625 64064 20 589399580173312 64064 27 -589399580173312 64064 33 1204866903232 64078 5 31828741135343055 64080 36 -562074266280384 64090 13 137956061509703 64090 18 -5439230825380929 64090 4 417355524067123 64090 8 62132796417167 64092 22 358453949789600 64098 4 -10916329007962989 64098 6 404308481776407 64110 10 312310381426039 64113 6 -15878392498648 64130 12 -52264406637377 64130 2 697011350167187 64144 2 75286256055616 64155 13 -9488813094128844568 64155 15 -5875608697227541 64158 19 -3329085633335821 64158 20 97634629943819 64158 22 -127190492946325 64158 33 -219635511208361 64158 8 -6493502041187669 64170 30 -131136192261657 64175 3 1536043121871875 64176 15 212628575294848 64182 3 36555707664487 64185 4 -1123174618600841 64190 14 127234857254606423 64190 18 4585785126391 64190 19 -370947105698561 64192 26 75781594902832640 64192 38 -11058897090899456 64192 59 -75781594902832640 64192 9 11058897090899456 64197 6 26155969513416 64200 25 -93533296094884000 64206 11 1033060306167 64206 7 -27892628266509 64220 11 -361980243280864 64220 3 89022798339488 64220 5 -83105270586208 64230 4 3320173768753335203 64239 5 -4530790482775865 64242 4 682388880881571 64272 24 -193120570682272 64294 1 -111549252165705 64302 4 -61873381777789 64320 15 18560647484416 64320 26 -44873691539968 64320 38 -18560647484416 64320 51 44873691539968 64328 9 -10480044278656 64330 4 10595803302811 64344 7 -4769200207232 64350 105 -4086002629490625 64350 114 -17241617300927625 64350 118 897262311243018375 64350 128 -52685598374015625 64350 136 -32739531665625 64350 31 951107272549875 64350 45 -2962539023752125 64350 48 14541501445875 64350 55 44893361041875 64350 57 -32688021035925 64350 62 -421484786992125 64350 7 -1018034301358125 64350 8 -318900573514125 64350 99 15590406763578375 64365 3 -3593527757189 64365 5 13132793175272 64386 22 -47625438056805 64386 54 -2358256764640349601 64400 42 -20817517424320 64400 43 177582935132000 64400 57 -2602189678040000 64410 16 -62645645610482849 64410 21 41167816019639 64410 4 -68346295721677 64435 12 62565513738056 64435 5 -3153380466243672 64438 1 -2154546694981 64438 5 122659616762811 64438 8 35136641609302599 64440 12 -1737890166904704 64440 2 -4345535736396448128 64460 2 -219496759670153024 64464 10 50588440759360 64467 18 22566562333407 64482 8 -11636354999033 64491 13 -132117672556142776 64493 3 1200098849929507 64493 7 -69247604419037 64515 13 101877748486623827 64515 16 37141624247903 64515 18 27546439377185576 64515 22 -12353661448984 64538 1 6205511023258347 64554 11 -64700994725893 64554 2 35163947856619 64554 6 1041969938995 64554 7 900080584374689731 64568 2 2809505404224 64575 15 -270164812023000 64600 5 -136902341592000 64614 11 3501301662163855 64617 6 -7364107151078840 64623 2 -2096495974925 64638 24 -7751693889895005 64638 48 287099773699815 64650 19 148924750245875 64650 30 -7560577256190625 64656 16 -2497398527245248 64662 5 -13830557454845 64666 7 2587313107511 64670 2 -94498729645653 64670 6 1482403972339 64670 8 67136162040811 64680 10 86942245104064 64680 14 -3455995504463936 64680 15 -55116000376192 64680 18 -25490626109699968 64680 23 -1571431598323552 64680 29 891703583457344 64680 46 317291550534784 64680 52 19502985992896 64680 58 -25162217388224 64701 12 -1007773311609 64722 1 -251297004919589 64722 15 -5520188987461 64728 15 -229166194849344 64728 16 29645968858848 64735 4 7872913121544999 64746 3 203709728471643 64764 13 -1078206636647040143328 64766 4 -436687573434893 64770 15 -28854862802081 64770 16 2502411850231111 64770 21 -1501975148880041 64770 22 -6745940575273 64770 25 3935475381912263 64770 28 33256050067727 64770 5 3201203262491 64778 12 -12858782361229 64800 10 -352807959744000 64800 5 -13066961472000 64806 6 -15500306202569 64815 5 17302315797091 64821 3 691671150728 64842 2 19919613426083 64845 10 -437263868798712 64845 24 10842724699100136 64848 30 -1794823767688384 64862 10 -263643169738985 64869 3 -695863714141 64870 3 19316913731564661451 64878 3 -489972218221 64883 3 1671631975861128 64890 14 6765745392603 64890 17 -1332118909773 64890 25 -195728745733893 64890 41 -1694050534659141 64890 52 213904555841952207 64890 56 65155519021671 64890 58 -1660371555681 64926 1 20246855375043 64935 1 6560171675208 64944 16 -585872421716160 64944 27 55515581589312 64944 29 -17205964434869184 64944 43 -3088912923072 64945 1 22121551989523 64950 17 6910183131655375 64950 22 -310504115065625 64950 3 56552761592875 64970 2 7382947857947 64974 10 -202676304019805 64974 30 -437699874973193 64974 32 -119185792155559745 64974 42 -5032783626315641 64974 47 -463395200163553 64974 48 16023965920487 64974 59 347480443602215 64974 6 5373920189478547 64975 6 -57004339190625 64980 43 -158471185163295456 64995 5 -24385472236189 65010 17 -10037092934897 65010 20 13159099784287 65010 21 -16178292724697 65010 7 -80346039687613 65018 1 -259963857053 65025 33 99328936149000 65040 27 -71636139494848 65040 28 -1796380123550752 65052 5 1886300172502077600 65052 9 343106652258720 65054 2 348240876500107 65058 4 763335824147 65065 11 -1390243268706552 65065 21 30674151018251 65065 23 144633448458657171 65065 4 14876882030088 65065 9 589335397577667 65067 3 48493564835752 65067 5 847600218784936 65076 7 -16775219917792 65082 7 237394723463 65088 31 -867158577662976 65088 89 867158577662976 65090 7 177709553347463 65090 9 5069153888824591 65094 1 -99013667982965 65094 6 53304189949495 65094 9 253115909571815 65098 3 142884784923947 65100 21 -159999400000 65100 34 135019058840000 65106 2 -7682182026041061 65107 3 -25305766200 65112 1 4806283989952 65121 3 -150298551112409 65130 5 68070234157229123 65130 7 68357253500409262427 65136 16 -1053339340243904 65142 10 199582467985657539 65142 11 -40737734832789 65142 14 137470784956710939 65142 15 -5930035303725 65156 1 169796583402272 65160 21 -264264096025035936 65178 10 270237105573759 65194 2 -488581876343701277 65208 14 -2837877624526400 65208 8 4012295931584 65230 5 156124861426367 65241 5 -35553143475657 65246 5 -8190413576585 65268 7 -343046706763100256 65270 11 20504413927639 65270 4 -27497510621397 65270 5 16631399371851 65274 10 5995259368343 65274 8 -52741624577561 65275 13 13355080733681000 65280 15 55680933803264 65280 23 6936474426112 65280 30 -55680933803264 65286 14 111908582487963 65286 17 -4849374273467517 65286 24 -4144762314369 65286 30 130933105383622959 65290 1 -1281544355345013 65296 27 -16380017851363776 65310 18 -1171015511777 65310 21 -1607211224383409 65310 2 246096996355603 65310 26 -358431106321 65325 5 -496227442823000 65331 13 -2997585183501 65331 8 8008512952025223 65338 5 -444790265714911089 65349 4 -30048032389041 65355 2 -35149247827064 65358 5 12709251751275 65366 19 -28309021141905 65366 20 1099571597271 65366 6 4072087159470323 65370 7 -1091787158773 65379 2 300155032204840 65394 10 6835129498562427 65394 17 3351867882270170535 65394 20 -184548496461185529 65394 2 -90500432821294604445 65406 3 4818868968943171 65412 4 -70067243772712512 65415 3 4347077776363 65422 1 49647236056011 65424 20 175262184367424 65430 10 166719090433131 65430 5 339551224455699 65436 11 106955561012768 65436 7 -56887923651040 65450 21 -733630256754625 65450 2 -248670004507778125 65450 28 3217683264213375 65450 35 -1989360036062225 65450 39 7895520309375 65450 5 17827622737875 65450 9 -2160701035003125 65454 2 -4649091018965 65454 3 -70731202253057 65471 4 -29766928819059809 65490 21 32354416338398031511 65514 2 -463729062219589 65520 109 -497513697414336 65520 112 -940616070251967936 65520 118 -177867923004864 65520 1 21668754802752 65520 68 -1034713192876992 65520 72 -274133460030912 65520 76 2013961778803008 65520 86 82039467974976 65530 1 -173557461781 65534 2 1446922691019 65534 8 8025552973943 65535 6 145965837086766559 65538 12 -2644827418989011241 65541 1 3902403947464 65546 4 -13530653791381 65550 10 32228336924875 65550 11 -4136824191421629125 65550 18 -3415679703125 65550 20 242649337112007875 65550 26 1169802690875 65550 27 -62210115776125 65550 30 -283461804371125 65550 36 16316323971875 65550 4 43281339895259875 65550 45 -61302842419625 65550 54 379775383283375 65550 58 -481210249039917625 65550 60 304430049606773375 65550 8 -208294635222125 65550 9 -7544132406125 65559 6 671939357312390120 65562 4 235753941052315 65565 9 393002957937627 65574 5 1155225765297123 65586 5 -20752549046425 65598 15 -5233587574940641981 65598 19 10012183632274663 65598 27 -214588034562329 65598 39 27412168615415 65598 5 -221794288914349 65598 6 -810879744706741 65604 1 86494062793888 65604 9 -944373830370272 65616 10 -1221780424531904 65618 2 11311428620843 65618 6 -4266699107474637 65637 12 -798003913487654261016 65637 17 29555700499542750408 65646 10 -32822764380405 65650 21 -48694218952625 65650 24 43870172889375 65667 4 25584179773256 65670 1 18802024265467 65670 14 -47208995475913 65670 3 -21177971123021 65695 1 5581716261003 65702 18 -45207251554401 65709 12 -79738799752521 65712 30 83925325159668800 65712 4 -2058873630254144 65728 24 212762456953344 65730 2 1213160990707 65730 32 -3709836388873 65730 38 25678054849690151 65730 40 -139050537006529 65751 1 8554881956104 65754 2 -16854556837420125 65754 8 624242845830375 65758 16 -12925841129145 65758 2 246867640929539 65766 2 -799266067649 65778 17 106508528416511 65778 2 224862550243516979 65780 7 201302071282304 65790 12 130796245406691 65790 15 -792221874276429 65790 18 -7509675835002213 65790 29 -120476824218981 65790 38 38756430749727 65790 55 13902587392887 65790 62 -5626325478534489 65790 66 -1256267303050367260521 65790 74 5825849432319 65805 2 -85266881978552 65808 22 19879125784944192 65835 17 809264799622152 65835 27 -647235138887649549 65835 28 -1762350383961 65835 31 4919287427056899 65835 37 17389330363656 65835 41 23815520549631 65858 12 -1113538726602182889 65859 4 -9609234920344 65876 1 5745433302656 65895 13 -5881749893848 65895 15 -78388814636056 65895 9 -10809251979704 65902 2 403117069535 65905 3 52943428308456 65934 2 -2159346689102997 65934 4 79975803300111 65936 4 1978689707016768 65946 12 -36748940413681 65946 8 4447751778863 65949 2 5350908091699 65955 2 -13233124161397889 65962 6 -470868822217 65970 5 -193858881334461 65975 7 53486074499640875 65987 3 2901510178056 65994 4 195960135527 66006 11 -33618094354737 66006 1 907688547577899 66010 1 -30995701072260491853 66010 14 -3327844275059417 66010 15 -11865316470337 66010 20 22368121026869519 66045 14 -4309910260669 66045 4 -1607553234395474633 66045 9 -2092457327381 66054 3 -5403613062205 66060 5 -40217298756122592 66066 11 -19007076306581 66066 13 -52523072873909 66066 31 -34486778175949 66066 32 162654614015795 66066 35 -8867805840685 66066 40 -22403668521905 66066 47 -139495233749201 66066 52 784149348052279 66066 59 -348184543630825 66066 64 2404371143099970143 66066 67 11803049573951735 66066 9 -230708183529725 66079 4 -8082065215224 66080 11 -47314402522624 66080 16 47314402522624 66081 7 -17395465922488 66082 5 463309554528956827 66090 5 1717979796647 66100 7 -7992625333500000 66101 7 -72634937347448 66114 5 482654380466799 66120 16 -306867603758464 66120 4 -55816493484608 66126 4 356341454404683983 66132 7 -75149028963648 66135 5 -303828045688 66150 122 -64202513661790048125 66150 141 -16016820690047625 66150 160 -513620109294320385 66150 189 2377870876362594375 66150 21 5340357289706355 66150 25 1450563685963875 66150 260 667544661213294375 66150 52 18837670347601875 66150 56 -24723876341233125 66150 78 211868355013875 66150 87 -2839200138046125 66150 94 19022967010900755 66157 1 -692690817664873 66177 2 32752173819816 66178 1 104234574330027 66192 11 412020516725056 66192 22 221036140516988224 66198 6 18959362841123 66210 3 862534497203 66210 9 -2365422330156337 66215 4 17710146209602376 66218 2 279620791704199 66230 7 427322469383 66230 8 76738338071991 66234 18 -42969000453121 66234 19 79547959523087 66240 144 1085017823506944 66240 58 21070112228352 66266 2 12159846919421127 66270 11 3233018061183491 66270 14 21656917259623 66270 16 86946758322868063 66270 18 -24806014824761 66270 23 426031421322799 66270 5 -9359006587570709 66270 7 65644489334539 66294 15 -102269685524985 66294 2 -173046624770709 66294 4 2761281509174595 66297 19 -6444620957936665 66297 2 -464459553513809 66300 25 -133106940843436000 66300 34 106641580148000 66300 36 126831029300000 66300 41 4526301252500000 66306 3 -620945707933 66310 4 207689161159 66315 6 74945477083688 66330 21 804263760140571 66330 28 -24477328757817 66330 33 -31051820435769 66330 43 -2130231478836969 66330 6 660887876461059 66340 4 617585268832928 66352 17 -12181008467066048 66360 5 -236781214054496 66378 12 1591654697855 66378 9 341062178111 66395 2 3635592291720872 66395 3 154427447103272 66402 13 -42240848480685 66402 18 -23638736645145 66402 19 11076173701335 66402 23 -19664701378344945 66402 26 -55951601340753 66402 28 5920992139455 66402 33 -2536684037852481 66402 41 31043165188167 66402 46 5559764411492199 66402 5 3205959338331 66430 11 -126367151689017 66430 14 -4501543156993 66434 1 -934821545041 66444 5 -1377015704344448 66450 3 2305496613257875 66462 2 -79006601677717 66462 8 -28881700962733 66465 8 106833755521863 66468 3 -123415910418016 66470 15 -34685069483910113 66470 22 -53233342596521 66494 5 656922289455 66495 14 -149949005015512 66495 22 -315282588711527224 66495 3 -371885461208 66510 11 -39177715215069 66510 18 2187141343407 66510 5 -282127343998221 66510 9 70707656999619 66530 2 129328870412503 66538 10 -9763417969129 66538 17 10018992143647 66570 10 2241592481339 66570 13 1037897753311 66570 2 19461710365147 66585 6 370432590983 66630 3 -34150140559853 66638 6 -24023164906989 66642 5 120850573496831 66654 20 388509654804251931 66654 27 -63599321703933 66654 38 -243529710090561 66654 41 -239290474898313 66654 44 37985858318640807 66654 53 124348055508207 66657 2 693775103360680 66674 1 7449220661174155 66674 3 -1014984980397289 66675 22 42240702915227792375 66675 3 -6446249302625 66690 11 8218922787603 66690 44 25186601249355879 66690 9 -680038233732608733 66693 1 183372544649431 66700 1 -468468346544000 66700 4 -814835353644000 66708 6 1086372602476878528 66715 2 -179751558104 66720 20 13176974877005180096 66720 5 -13176974877005180096 66726 11 -232875525078395109 66726 21 -429037571961 66726 24 1673243193091311 66729 2 1499030973345546568 66736 2 -132978817727424 66759 11 -169765777816993 66759 8 -79965355076641 66770 3 22405233913606639 66792 26 98814207039328 66800 12 -354139119194747840 66800 17 889588466504000 66800 22 -44267389899343480000 66800 4 -1428761236788000 66810 22 -20418721749289 66822 12 -23329074106477 66822 13 1113210992708963 66822 25 1744892951327 66822 8 -1145462716133 66830 3 -44202432163617 66834 13 23512979870991 66834 14 -5818887827614737 66834 3 215514363985731 66846 1 232501723623811 66846 2 -9719668156229 66850 20 -153255703154625 66850 21 -107576448080625 66861 7 -1190245600835640 66880 13 165794622432768 66880 17 -3821540588288 66880 20 -72759775136256 66880 30 -5780829041679744 66880 37 5780829041679744 66880 39 133591528082944 66880 51 -1462470073772544 66880 55 3821540588288 66880 57 -165794622432768 66880 66 -97376581359872 66880 80 1462470073772544 66880 82 -133591528082944 66880 91 -2735350471936 66880 93 72759775136256 66880 9 97376581359872 66886 3 324490026781315 66898 4 -29491850781587089 66906 10 831517030604583 66906 1 -30796927059429 66924 1 -1364200549216128 66924 8 -570484996919136 66930 1 -2190488479040717 66930 16 6651396284589791 66930 17 5525001360431 66934 2 4855677281819 66950 1 -1568855395125 66950 31 202857623732375 66950 9 11292015358077875 66957 1 1008644336906248 66960 42 -93347972849088 66975 4 -172824679791683000 66978 13 -1218584426719833 66980 6 -152211067931232 66990 1 25461475894387 66990 13 7444249867459 66990 16 6788953617348979 66990 18 -30267639064349 66990 22 -4982710256677 66990 25 -2095532025733 66990 27 9770818219667 66990 28 7597686340763 66990 31 11981072216422763 66990 32 6785428544243 66990 34 -2430022239039709 66990 35 -5929851053629 66990 38 -4634417416789 66990 45 28045057081859 66990 48 -61977972191549273 66990 61 -16348430343097 66992 4 -354399645134897344 66994 11 -1435420510929 66994 1 -1236258975637 67018 2 148019786713791 67023 1 -2785119283161 67032 44 -6631574170342464 67032 58 33963761991805632 67050 1 12166286476885875 67050 11 2984500043107875 67050 18 -16755014187631125 67050 31 13240038346875 67050 34 -450603202847625 67050 3 48535131598875 67050 36 -1310448553169625 67050 50 -612395666321625 67059 2 9407357560584 67067 3 193008188497032 67074 8 6734175731639 67080 18 -8739015321833792 67080 24 569456689822912 67098 1 -1125490793030693 67104 12 -1182353940582912 67104 5 1182353940582912 67110 6 134219300943871 67110 8 28989557028863 67116 5 -377465923775872 67128 1 321862159610560 67130 21 -241468886204497 67150 18 -51510533892625 67155 20 225022042049651 67155 2 7300135349947 67158 10 -10663046960679693 67158 25 -1763986476415437 67158 31 -235110546014553 67158 33 2549115834761439 67158 37 -42593557344057 67158 3 8707798000539 67158 52 -364136756808609 67158 53 1748477010951 67158 6 -68826127538558853 67167 3 104205745714824 67179 3 1879166396924488 67184 6 540244683084608 67185 3 -9613368318069 67190 1 -364798380753 67193 5 26164074331813123 67194 11 -656854194019329 67200 110 -180056539802096000 67200 147 -1370451664000 67200 159 -22507677583768000 67200 49 180056539802096000 67200 97 22507677583768000 67206 4 1305299721426656723 67210 4 205934497278463 67210 7 -92219925795561 67235 7 -10590547342481 67239 3 -19198059046029 67242 9 7579390249999 67266 3 -6088478534780733 67266 5 -11207299083021 67266 9 -2722582607986125 67270 24 198650030158287 67270 26 -250512600716713 67270 37 14442202222488279 67270 4 -689807802659148837 67270 5 -1125210115230517 67275 22 -31812712412625 67275 8 -174191429269125 67280 13 -13172170623279552 67298 11 5738431872167 67298 17 -9647573682545 67298 6 18952737980651 67320 28 5876035408512 67326 12 883672106080267 67326 17 177037049048363 67326 25 -22000323821843269 67326 36 684091211369167 67326 5 7546111070892241267 67335 10 -651743192651896 67335 1 -452684797251137 67344 16 -7401408212975552 67344 3 751617433190080 67346 3 -904254547024269 67350 24 15381691492535 67350 25 -180656722167625 67350 5 375100400836675 67362 1 7332827906827 67371 1 27271276937063 67378 2 -14213032374869 67390 15 -251871760356121 67398 6 -4488720611201 67398 9 -20614777623577 67404 6 -31185643919968 67410 10 -1122395543014437 67410 12 24209309513187 67410 18 -12307865472477 67410 20 6236574595803 67410 25 90787729303251 67410 2 885110394843387 67410 33 20615255437259979 67410 37 -32781866475681 67410 39 1783036191550599 67410 4 -48141977171866173 67410 44 -90312892811217 67410 52 949325700463911 67410 62 -7707840646219281 67410 63 126616471604559 67418 3 -206805150297 67425 4 1938371178097000 67440 12 4293365059648 67452 10 1182242077311392 67452 6 -376989207703424 67470 3 26246919538127627587 67470 9 123677216614238081527 67482 10 80187912466191 67490 4 -11851208428177 67507 11 45918932319944 67510 1 -397693879428357 67510 6 5369596031943 67518 12 -24106269077656029 67518 19 -96539261806053 67518 35 17751105629631 67518 54 -189203246543817 67518 56 273264807953511 67518 8 -23626721593038861 67520 12 11965648945024512 67520 42 -11965648945024512 67522 18 -27267843118985 67522 3 -1436596691720813 67536 3 29240045047346400 67536 48 131004286040160 67536 6 -789481216278352800 67542 2 266565947868107 67550 12 -1180353014844625 67550 8 4690662255511875 67590 10 305511512722723899 67590 15 -15217327451529 67602 2 59924544136867 67602 4 2407558806277235 67606 4 13960115949275 67620 11 1580459857094944 67620 35 33458557844096 67620 40 -11914654674586789216 67620 4 55737716370458752 67620 5 34736602549815712 67620 9 -673703422439264 67626 12 868808912948595 67626 14 -38426010890136810741 67626 21 -112646654423217 67626 22 44739385961031 67626 27 902942817757551 67626 37 4436158063642848063 67626 5 -7821292670493957 67632 4 133234938987328 67650 14 35658192203875 67650 1 942502686431858875 67650 31 116666846646875 67650 49 6957126706375 67650 54 -254885480881834625 67650 5 -655920793656125 67650 66 -1244644418031625 67650 8 -23381825760125 67650 9 20818991096875 67664 1 17725760 67670 10 -303086653624777041 67670 4 -158433064790669 67670 6 9185494663588823 67678 2 -16884096897429 67686 1 8677920540979 67704 21 -345816339845696 67704 33 -218466266118976 67704 3 704224331057800288 67704 9 10545273418688 67710 10 3337821686411 67710 21 19208602761407 67710 23 47040305338315871 67716 2 -22496048376192 67725 16 2673751852330875 67728 20 189721434477376 67728 30 56754371942748224 67728 6 46876732873280 67728 8 -6510913049728 67730 10 -4715834238181 67734 10 -35427814636035581253 67734 7 107041448490075 67734 9 293287165487091 67745 1 317267659191959 67758 3 -811108278325 67760 35 -411994875517632 67760 61 -225408112462016 67767 1 5998539680595784 67767 7 -17488453879288 67776 1 -4377239765504 67782 16 5282617822733128015 67782 9 -765005759903845 67788 4 -80612534199168 67800 22 564485200336000 67806 6 3699259705868463 67815 3 -995476772154897 67824 11 -118218760984512 67830 1 -158741759096997173 67830 16 -12551971739077 67830 19 -3874561069423717 67830 3 -10884710017133 67830 32 -70683207735041 67830 51 93663997476839 67830 5 2355372192907 67830 6 -231580741108827221 67830 8 167479243260364099 67850 23 19937088955299375 67854 4 -1180641772675837 67854 9 9261267611255 67860 7 -10647245006851968 67872 17 35899280649728 67872 2 -35899280649728 67900 2 -1342054382768000 67915 11 -54566849230710667029 67915 1 -156563696988970712 67915 14 -31867229185624 67915 20 373138882640424 67915 5 83829991535407 67947 12 -247456218050936 67947 13 -23886212264713 67947 16 8600187960008 67950 27 288919118631126375 67962 1 -1359467105885 67962 4 40569346098775 67965 7 -1583545533118264 67968 15 -21652261065216 67970 3 -211414263381 67977 3 7849374090111 67986 7 -15911220535101 67990 1 4167675632383947 68010 1 -179606938343653 68016 25 11741652891008 68034 11 4134982012687 68034 15 -142964365215617 68034 6 -7213280461325 68034 8 -1732454432461 68040 10 20458675922112 68040 28 27047076757632 68046 2 20468578795955 68055 5 7541202777504488 68058 16 -1329031074753 68074 4 -140267473991721 68080 9 1281211619616 68082 9 -8777554750441 68085 9 4306498394472 68090 9 -9351205555121 68103 1 12038858314344 68110 11 51717526888139 68110 13 20362856672354903 68110 21 -59366929073921 68112 42 -49555541071296 68139 3 8588356747158303 68142 3 -516180081730697 68145 10 65994398316664343 68145 7 37950653184972499 68150 12 -304492738747625 68150 22 -1419413582886625 68152 2 -41322603401792 68160 13 -9848253312134144 68160 3 4558156493801102848 68160 38 9848253312134144 68160 79 -4558156493801102848 68166 7 233184344470926435 68175 7 -4538153395125 68187 2 -71151978680 68200 13 -186727874313600 68200 26 -23340984289200000 68206 2 21885330777875 68208 31 2599406597198656 68208 37 914309234638912 68208 76 84079161776343104 68224 10 92453418293120 68224 11 -92453418293120 68224 2 -739627346344960 68224 6 739627346344960 68238 10 -2118194475549633 68238 12 346523821703631 68238 13 291533832679959 68241 10 -434926585967582413 68241 12 -2774358894272149 68244 9 -57315797399872 68255 1 -1412965499009752 68255 2 -113822857963512 68262 11 357275665151 68262 9 26354479010111 68265 13 2508610432419 68285 3 36063622352456 68289 5 -15089425143317 68292 8 -218790535339872 68302 8 -3714500642841 68306 21 -444347374465449 68310 10 93530302771707 68310 1 1333691624012067 68310 2 29703537707427 68310 23 -210010063571033025789 68310 28 -104752297474533 68310 32 -1361653339941 68310 41 2828312031812391 68310 46 7778150502630852807 68310 59 12355318951551 68310 60 -2525318174836089 68310 62 -49395986074521 68322 4 125486190215767 68334 5 -6807845060605 68354 1 522243694107 68355 25 59556137958639 68376 21 22737341084617664 68376 32 212900665511456 68376 34 -132961244427164224 68376 8 1611508071259808 68382 19 18158001802479 68382 22 -59696749906209 68382 6 -42688035311517 68382 7 21814637417379 68382 8 -16098797219485437 68385 2 -20639410564229 68385 3 29155576203467 68388 1 -6278138707605056 68400 114 -301650993432000 68400 94 85749451740000 68406 12 38511821307367 68406 15 -59347828466009 68406 3 -39893124509837 68406 7 5891004260675 68418 17 3379461379753563 68418 25 7676025118119 68418 36 -91245457253346201 68430 6 18513796594571 68432 26 -4722715103456960 68432 8 -42918029376704 68445 10 -96297193896380568 68445 12 -5191397825545737 68445 29 192273993538731 68445 5 -90571902241977 68450 33 220227739437375 68450 36 356904678684375 68460 2 -249150002912 68460 4 34194783670892704 68474 4 -39080129608673 68476 2 1115959133542528 68478 5 252760870716767 68481 2 910789868633499 68481 5 -690402913275825 68486 20 -62979236413577 68490 17 60890484094119 68502 13 -10820765915785 68510 5 -37079718709877 68530 12 -641307740121 68530 3 149412584545363 68530 6 200244241331 68530 9 47721477345543 68544 117 -43065885012480 68544 130 -277247562200064 68544 31 43065885012480 68544 46 277247562200064 68544 53 85480283764224 68544 95 -85480283764224 68550 9 1438015464767375 68560 9 11157313449536 68565 1 -35154553809752 68571 3 -165736153024976457 68571 7 2597033509155 68586 11 1514026862162459 68586 19 -4961712409793 68614 10 458871750626939 68614 17 -22155783726817 68614 18 -12273623663041 68628 1 16083264855232 68628 3 -251899226516960 68635 1 277616215716552243 68640 4 -153372682714688 68646 1 -45690286050917 68650 1 -68630094357038632125 68655 5 -26601351854653 68656 8 -327914612990659008 68670 10 -83540112669 68670 38 -1034477389623609 68680 6 -4640046690176 68694 1 3849738015942667 68694 4 -8041319965208845 68697 4 -25408527876216 68706 5 97780938941403 68706 8 4589162752491 68712 6 151452461070784 68730 5 274812612227711 68731 2 -403459507521 68736 10 19012631343488 68736 11 -152101050747904 68736 1 152101050747904 68736 17 -19012631343488 68739 4 622656902627 68742 11 -19249463738637 68754 3 -20214508001941 68757 2 -4292038757213 68761 5 123714393827912 68761 6 -8815841361944 68770 1 27343058986547 68770 2 -36234045119572533 68770 9 -2831804425525869 68775 20 570748635582875 68780 2 174069920930752 68786 2 -23172915692161 68796 11 1155542465149632 68799 5 -3850258846407157 68800 109 176518283840000 68800 64 -176518283840000 68800 69 -28529513280000 68805 4 17805040007126463 68816 7 -1409990235552 68818 5 -302433088285 68838 11 -1856743783957 68838 2 2769827367506973665347 68838 34 -164235996664921 68838 8 183153846054115 68846 3 745930867463 68850 14 -5394114107254125 68850 37 -3525365893883625 68850 52 -990150602792625 68862 8 382850562799 68870 1 24402983221441899 68871 1 329270050825795 68874 5 1490607977039 68880 17 -1360710680608 68880 25 -2490135107104 68880 45 -250901519489216 68880 55 -5123125324288 68880 61 -6275535000352192 68880 70 -29394844633216 68886 9 -2091545698905 68894 18 4061482111068543 68894 21 -2111087090749553 68894 26 -64801277016497 68894 30 724102872127096679 68894 8 -943933035666061 68898 2 567670323871 68901 7 212891654799944 68910 3 -335967193790173 68922 15 -31302521693073 68925 2 -8935010927000 68926 5 66251373090479 68940 5 31950491668128 68946 2 3492738092987 68949 4 84936638468979 68950 1 24191080621917875 68950 17 15918906523086803375 68950 18 113848939811375 68962 15 -8203464455633 68970 10 2398568323539619 68970 11 -329709426726581 68970 16 -49463064636029 68970 2 -11460821699019077 68970 31 -111456706587589 68970 40 -12001342150702817 68970 42 8610684972967 68970 48 89833646918719 68970 50 438843246973079311 68970 53 -767003138124641 68970 74 9883554978671 68970 7 9016785988507 68978 11 -4370054167809 68985 1 -53528404716330993 68985 3 1982533508012259 69003 4 3248939315979 69003 8 15565657775175 69006 11 418232943738735047 69006 3 11010263627483 69006 4 -130142823324877 69006 9 -13143581454025 69010 1 43153876876887 69015 4 242889464741147 69020 1 305983632534088832 69030 20 85328164730329659 69030 25 10002265985223 69030 6 138228963939 69042 3 -236320389413 69042 5 6288146096131 69046 2 -948030403645 69056 13 -1610595145216 69065 1 7830318623923 69069 1 -6767044496792 69069 18 236900640765608 69069 21 388386086314689224 69069 3 -11185661727512 69069 5 -12887469946353176 69075 15 -3857243695119000 69078 1 93070304744563 69090 17 20024965425493763 69090 27 -30919345997869 69090 3 -102607179696413 69090 31 -136784009228993 69090 35 381868245958591 69090 42 -6788565214417 69090 47 -61062639711409 69090 48 46916915165544599 69090 53 42086591422087751 69102 5 -7805232488385 69130 4 115684190141527 69138 16 -48678806620953 69138 23 2325119033512143 69141 3 22716852121043 69150 1 145408505327875 69150 27 -135448529865625 69153 2 3549084902119 69153 6 12171042667071784 69153 8 6856992193960 69160 7 -21016965679333402176 69165 6 12323920694271912 69174 2 -259169419477485 69186 4 -113653504340297 69190 15 -91255296937318433 69190 16 -4516563329513 69190 20 -168885367871113 69190 22 1236783071441879 69190 7 186357636985843 69206 4 -162075540564829 69210 12 5187284025579 69216 13 32296001080832 69222 1 25588863171712459 69225 21 -870554763556283125 69225 7 -6964438108450265 69230 25 -13848237258841 69230 28 -6480661103281 69230 29 12734460838791 69231 3 4984869915944 69264 11 19802843542380384 69270 3 -1772971363460069 69278 7 29375422798344695 69300 15 103920816142800000 69300 18 -2805862035855600000 69300 21 831366529142400 69300 24 -22446896286844800 69300 40 -30973974466716000 69300 49 3091110786576000 69309 2 -26628482898936 69312 85 -44063627746816 69328 3 -25673698659912192 69350 2 -1360201386717125 69350 5 -122564932803125 69354 14 14189884411813119 69360 14 -57529906203862592 69360 61 -15754276282505408 69360 6 -749239137973952 69360 85 -261391400097472 69360 86 -1266482098482112 69360 92 477664239854816 69384 10 739689613659584 69402 11 164395953340687 69410 6 -79880360959889 69420 7 -52830623577952 69423 1 -92041289679005 69426 15 -14637366057789 69426 34 -2403797063625 69426 43 -51420648239505 69426 51 33654818767023 69430 9 -81043998059321 69440 109 -11855311837853184 69440 40 11855311837853184 69440 88 21771499216384 69440 97 3414078595584 69440 99 -93908487504896 69442 2 -34385096005317 69446 3 -6598215828729 69476 1 2372924259777664 69480 3 6596860184986176 69483 5 706565088895571 69486 1 -67210998545606237 69486 2 34021460311946227 69486 3 -520725156517 69495 6 789994383211 69510 18 28680464530619 69510 4 142976842081723 69520 18 24312162818502208 69525 12 121618123029000 69525 5 -4504374927000 69525 9 274652132913000 69530 1 -217167061642533 69534 6 -8691435503469 69538 1 -1063132555133277 69538 3 598226768754327 69540 3 202091757895072 69550 2 1296436078258875 69552 43 149287720569408 69552 53 -46866136151232 69570 25 -31755158415915777 69575 16 -477730231647625 69580 10 246838417662592 69597 6 -101120286891897 69597 9 -32729878631025 69598 5 -30688671560589 69600 29 5517072064000 69600 31 27360438544000 69615 7 3744039705585327 69618 5 -1464677561177 69619 1 -290576004763384 69621 1 -4752565650305 69630 16 -200564471796409 69642 5 44972904966111 69650 16 23333490321875 69650 23 65935085737375 69650 27 -306967937865625 69654 11 10394061096911075 69654 17 -2106746168034457 69654 5 569274559994323 69671 2 4818260308392 69678 32 4878399910969431 69678 48 658264125903615 69680 28 -106894461466304 69680 35 -1483953053477478336 69680 38 -44459194351208896 69680 41 291668994554976 69690 16 -54280957453957 69690 31 -9217587908017 69690 3 2195437769011963 69690 39 4314477585486959 69698 1 348486846790355 69720 8 2614953473873056 69720 9 -1527162886304 69729 3 6281477566723 69730 3 206882635353139 69730 9 -203802387948361 69734 5 1018040382777375 69741 11 1538122122187272 69741 12 -41529297299056344 69755 2 -11594772499213 69762 21 12386372125231 69762 23 40485062663695 69762 24 18859375394789383 69762 29 7088019939575 69762 32 -13274226512279804737 69762 3 -401548339205 69762 37 -5663407070525401 69776 19 255114854382203200 69793 2 -39691172546405 69795 3 -4485781390024152 69795 8 166140051482376 69810 9 -177220714159241 69819 2 10996829212241672 69825 50 -11548187726784625 69828 16 41355385766560 69828 2 30978652697123968 69828 6 -41295782650976 69840 2 352411003822464 69840 25 -93313238948352 69840 32 -2123054345664 69846 3 -1028034562661 69850 15 1841742601652375 69854 9 -341480702168209 69855 5 1719421235432 69860 6 -12807208961482018112 69861 6 -806344092087832 69870 12 -361114698709 69870 19 10574817435287 69870 3 75930681923 69872 8 -2442139837032787136 69874 11 -2093461997692625 69874 7 -17157606884901 69893 1 2194777238571 69894 8 13522012490907 69894 9 -218059414608645 69904 2 -239904514749888 69904 6 -93909309382592 69906 20 -57918683803033 69906 5 -244789569995597 69914 1 -27665725161344869 69930 11 -1337420916621 69930 33 47292773013711 69930 40 36110364748767 69930 46 -37771016147649 69938 19 -464996053148121 69938 22 -2284525609116718473 69958 10 375016946217119695 69958 8 217898205138055 69960 39 -1671077062759128544 69966 8 -1437621898495653 69975 14 -4882425751179000 69986 2 -8814298665213 70014 1 11775384046551774436003 70034 4 -69626357074583533 70035 10 -990612373520321 70035 1 3611997645607 70035 15 5644041241096 70035 21 75629958482483 70035 23 207529217795087 70035 4 60866048016058607272 70035 5 829939557688723 70047 1 -4487413361840568 70050 24 -137823126315625 70059 17 8187003494868968 70059 7 5190537115751383 70065 2 -176251155768 70070 14 16646786229474387 70070 28 -3283712045901 70070 36 -70473434037500753 70070 37 962888048385998903 70070 4 73343398336079067 70070 5 -301081743747253 70070 62 338028308639 70074 1 533984962134627 70080 17 25790520987136 70080 70 -25790520987136 70086 4 2482736263522543 70089 1 2193693006088 70096 1 -15147127645632 70104 2 20364657565600 70110 10 -55547850622437 70110 12 -6697166836644837 70110 13 -6325004490326037 70110 14 -1337723279037 70110 22 -36336414125061 70110 35 2463907253319 70110 38 -15742377188006049 70128 27 439683028372800 70128 5 -539093892747456 70135 4 154448840014349192 70140 10 -28903624733152 70140 13 305855062303904 70150 10 -63753503567625 70150 14 -803129412714625 70152 6 -31052445738087232 70158 7 -238441808412881 70170 8 -30601514814841 70180 11 31921646227168896 70180 8 362908432237472 70200 52 -349071449832000 70210 13 13136587199 70215 6 8002332572291 70218 16 396667922350095 70218 17 400079712954663 70224 33 -721710694592 70224 43 83527415758144 70224 44 19416539450944 70224 49 1939426980756544 70224 57 -11625627009536 70224 77 -1122618720448 70242 10 36837847049383 70242 1 -203653693067093 70245 16 -41838162871896 70245 7 58474036248987471048 70262 5 -14870241316863909 70262 8 6982680676843943 70266 10 -60319812023840341 70266 3 175859510273587 70278 17 -27368059641857 70278 3 -2582587527565085 70278 5 30755723298756227 70286 1 -81332266496345289 70305 7 50020908329795624 70312 8 -397124168738112 70334 3 251732590193683 70334 4 -269771863213 70338 12 207131100263 70338 2 3464996824963 70338 8 -18956737762273153 70350 12 -66450632913125 70350 21 4753460092597595 70350 22 -3128716766125 70350 25 -7019227520605 70350 29 -410329668685285 70350 34 97321219046675 70350 46 -3166048649468125 70350 53 -25328389195745 70350 56 -2360817653668267625 70350 6 -11979872103882005 70350 67 -51291208585660625 70350 71 594182511574699375 70350 73 12165152380834375 70350 7 5016754646875 70350 75 -877403440075625 70350 82 -531605063305 70350 85 -1497484012985250625 70350 90 -28181786055625 70374 5 -316602964440341 70380 23 1102979042761248 70380 27 3958296466124448 70380 31 -10952628579865152 70395 4 1688335167460447 70416 5 338872612274496 70434 17 -6640601477301 70434 26 1320532390382535 70434 29 257371305255 70434 35 6608648925370575 70434 4 -65386936413765 70440 8 5791736120768 70441 2 -3178634958360 70446 5 -61225230201137 70455 1 15747286419208 70455 8 318438125207 70470 14 -80580809893581 70470 29 2984474440503 70470 40 -108942701927049 70476 4 -6761551733056 70480 9 -408585926969792 70482 3 -44837405096761225 70494 1 -149994942254153 70510 15 -5339752514369 70510 16 -331801834415049 70512 18 121820368426496 70512 21 4302677411839808 70518 10 21044700039203 70518 12 -21849544883557 70518 19 33676688238535 70518 25 -2745994800025 70518 7 8350872891283 70525 3 -11816895007000 70550 10 -5822644702724217125 70550 16 -90043446187793125 70550 24 -720347569502345 70550 28 13742999941375 70550 34 682616822609375 70554 10 -32126268625129 70560 45 -49616150898472704 70560 48 49616150898472704 70564 4 110442033299598976 70570 12 -7559892507889 70574 8 50342742211863779 70590 15 12621755193607 70590 4 55337066714987 70600 6 -36940923100000 70602 13 -114103149956881597 70602 23 -18759826385461169 70602 34 23168343794975 70602 39 -152231456571769 70602 5 -20763253835045 70602 6 -375039749197189 70609 9 12837065022772263 70610 8 1075910906566279 70620 7 -545018275588672 70626 12 -1126189022358045745 70626 6 189583945172675 70630 1 -32941040638617 70638 1 -12071696171237 70638 13 -1386325918513 70642 14 544148987566951 70642 16 -121815066321 70650 22 8500615698868875 70650 27 28465791163875 70650 53 -112312932719625 70664 3 105027449076352 70675 11 -85609089955675800 70675 5 -10701136244459475000 70680 2 1441088857792 70680 29 -100264335544611712 70686 17 -47373951165656373 70686 18 3142112009483763 70686 31 1754590783913199 70686 48 -116374518869769 70686 50 1791552674021823 70686 54 2324891241567 70686 8 -66353802741549 70707 17 -1557499614689368 70725 10 -8707982851000 70725 14 79652518325000 70725 2 1315170275149000 70725 4 -32452593859647125 70770 17 -13657848887521 70785 12 233865308046843 70785 14 -112600881752400657 70785 18 -2944568124138168 70794 15 27286378966794951 70794 3 -40024466780877 70794 5 -1010606628399813 70800 57 64230621889600 70800 89 71750297960000 70800 90 8028827736200000 70805 11 126428469988204027 70805 18 561343597596712 70818 11 33388730965475 70818 21 -541501687476589537 70818 6 877636258253515 70832 6 -83151419497408 70839 3 26475901278696 70839 4 -714849334524792 70840 12 -549823309781696 70840 5 1348123512853088 70850 14 -82754491086125 70850 17 30376863988875 70850 25 -16652452500537625 70850 31 -366776042625 70850 8 388284371207875 70850 9 -2621075313942125 70854 8 452055129081535 70863 2 5222682714835 70866 26 35905767508215 70866 6 -44382148862373 70866 7 356048425171878690034827 70886 3 26076112439967 70890 35 -39255822880921 70890 6 5865259970971 70896 3 449759274178528 70914 13 -171955130852358865 70914 1 6491847273139 70928 8 -2035220831992512 70928 9 5924577047104 70930 22 -101374653517569 70933 1 -743377657301 70938 15 -35636645104929 70938 17 13477026340791 70938 2 -1849366438498629 70938 8 68495053277727 70941 4 15016184371655 70945 2 -174628211337 70950 44 -55776269418625 70965 6 801061568457115752 70966 2 -8457663726469 70966 3 2395379730059 70966 4 19978610879179 70966 5 3082757897043 70967 1 8636183356744 70980 25 -2821646725865344 70980 4 -342444996473622848 70980 9 -155869365713984 70983 6 -50890340924685 70990 1 7355408271643 70994 8 116573513813063 70998 6 -1172089926253 71004 5 215580038510528 71010 31 -13474282462281 71022 11 -3164496867881 71022 16 16979091111863 71022 18 -709579738729 71022 3 56181810248803 71022 6 -10537162962125365 71022 9 89796043799911 71030 1 11299789378062827 71040 13 -102161996679808 71040 3 102161996679808 71040 40 -13068276438464 71043 2 20519987547592 71050 17 -208636351146775125 71050 3 608269245325875 71050 60 -103236609695625 71050 6 -8351946028125 71055 6 4073781964392 71060 2 51673268258208 71070 14 -1622002555112113 71078 2 1516272445297819 71082 23 -10924027037710641 71085 13 -222297422466642328 71090 1 3903180989491 71094 18 -342812079081809 71094 19 33085821464670871 71094 24 6734341840967 71094 2 499624685631955 71097 3 -8987707559960 71098 3 2031839335979 71104 19 13124718277120 71106 5 -10228197726809 71120 22 -1187209407168 71126 8 -740826643235849 71136 14 -71213610377331072 71136 34 71213610377331072 71136 40 -17004466861056 71142 12 -165392810033464169 71148 1 -5591875786925120 71148 18 234121984953472 71154 24 59138466841550295 71162 11 -440372382913 71169 3 558529586828360855 71175 3 -1156328072012807000 71176 1 420055080002496 71190 22 -12229325283069 71190 23 242185007992059 71190 30 39727009967931 71190 32 -1861467666724737 71190 3 64506515770899 71190 4 -1539170483157 71190 42 -1760074081214258097 71190 48 -95358439543914185841 71190 51 96201708552279 71190 59 -43466031907929 71214 21 7923235384376207 71225 8 996834816561071375 71232 35 -2362604165009920 71232 5 -179397887693548544 71232 66 2362604165009920 71232 86 179397887693548544 71240 5 -23337517914944 71245 2 -3283692580376 71247 2 5571870182019523 71247 3 -194950273784984 71280 23 62395968097152 71286 3 593524190602675 71289 2 103149174763080 71295 8 18522245925512 71298 6 16403862274340751 71300 11 38798231856400000 71300 13 310385854851200 71318 4 -3516796614825 71322 3 -7726847726561977 71330 4 197634158460451 71331 5 17652081973096 71337 1 -15112686134456 71340 5 -11260467059552 71346 13 -107012123873945 71346 9 -1829904735473297 71350 4 362352786163875 71355 1 -3950490857624 71358 4 -44334761534029 71358 7 -1234191708161 71365 3 69431584843592 71366 9 -13391991840745 71370 16 -1720180661568888141 71370 25 -4059191140497 71370 8 -14043587695821 71374 5 -879985904417 71400 13 38211283276804000 71400 19 919454037558400 71400 28 -217410835282012000 71400 29 -2285544192688000 71400 62 -328108344834824000 71400 80 -1215360870200000 71400 98 114931754694800000 71407 3 114433974254888 71410 1 229036767305283 71412 1 1228113733312 71440 6 5319616356928 71478 11 -14915478363741 71478 21 -770082676302789 71478 26 -1025919063564413661 71478 50 102305266096899519 71478 60 -3805037552660697 71478 62 1059810695272215 71484 2 108008448502547872 71487 14 1613197886392287 71520 15 3167836304896 71520 22 -3167836304896 71526 6 -169656939695053 71526 9 -3874091736997 71530 1 55642549217211 71535 2 -271951916557483529 71540 3 65635689859712 71544 4 20820238283616704 71545 4 35643457334728 71553 13 300192796344759272 71556 4 -3183465345205600 71586 12 -1756482935419007181 71586 14 133406951046651 71586 29 -29024198842166145 71595 9 829631383536456 71610 10 215601362731 71610 11 -290296960813 71610 14 -824459847040117 71610 18 3717712763973251 71610 19 -15872947230421 71610 22 -8844333854581 71610 27 159102464784103 71610 3 14483035396882387 71610 32 1961913419551 71610 34 63241967431 71610 37 501901761815551 71610 41 37422702620423 71610 42 -1128194442702843697 71610 49 -788768453721463921 71610 9 -61471990542509 71613 2 -260867253379941 71621 3 1407894119432 71622 4 -485022369009141 71630 1 1385171194987 71630 12 -985343835861 71630 18 -308094351180686461 71630 2 40525037724454083 71630 24 -1440418709066121 71630 29 -1971446343569 71630 3 -6314067167013 71630 6 -2017151147202173 71630 9 -55799148592732421213 71638 11 1684633347816335 71638 20 -2553354911259593 71638 9 2420612425885059 71643 5 2719432787752 71643 6 106597253756872 71655 2 201832701607 71664 5 56086573123648 71670 1 707972808043 71685 1 3527487228807 71690 4 -777060855981 71694 1 51127701736707 71694 20 7203037161375 71700 8 6774934616000 71706 17 -187397647185041 71706 2 11501604778411 71706 22 337294167713423 71706 3 -13595204572547031701 71706 8 29357396195147 71722 10 -292204214176841 71730 11 7341487517511 71730 7 -12823015468113 71730 9 -69062455521 71757 13 15029518421448 71760 10 -226232778695968 71760 27 1710136745213248 71760 4 75651105104992 71760 55 -16159193960896 71762 1 -17351987617946133 71762 3 2945769695747 71775 37 -768820248675000 71775 45 -40179256335000 71778 2 -65990544576389 71778 7 -9498826420453 71802 2 -5595145263477 71820 3 97217315425728 71832 7 -44185813905824 71850 10 6157726773875 71850 28 233812207182530375 71850 8 -27615934818125 71862 12 -594854829338205708973 71862 17 -92327813099353 71890 10 -27364400583857 71890 12 703777128839 71890 5 38690226282527 71904 5 757481736320 71906 4 358651482414607 71910 12 565360256993931 71910 15 3470201956611 71910 17 -94788778625469 71910 31 22981678023216159 71920 11 1225143346688 71925 12 1117950389183375 71946 15 -21076475090985 71953 1 -214809198664781836138904 71955 5 -4693902525144 71955 6 -542089670632821 71955 8 -169853254287192 71955 9 126735368178888 71958 5 -143297709382117 71960 9 4214021051008 71982 7 -100020446636769 71990 1 -54109180531153 71994 1 -4644148921929413 71994 29 9675775676868535 71994 41 -255776067332929 71994 43 -766669994732161 71994 5 -4014403860471675749 71995 26 -54101503039117941 71995 5 -17201178855377 72006 3 -104179870175813 72048 18 5594839108928 72072 36 2405554001651520 72072 39 -1989223583084928 72072 44 -2839118892717024 72075 35 -224023106575000 72075 37 -18376336298125 72075 42 8237882244365000 72078 12 72950713230948422903 72090 17 -5352812198577 72096 2 2255395922035712 72096 5 -2255395922035712 72102 1 26187939115507 72102 3 -7493911069661 72102 5 -137249910339353 72114 10 -899012117440529 72114 1 -37829665998125 72114 8 -57717643142249 72120 22 203834605292864 72128 44 88231579382016 72135 4 24393177626103 72150 15 30005679897521875 72150 16 5997216878875 72150 22 14047702285661875 72150 30 4030714546612224875 72150 3 7725377672875 72150 38 -834693465548125 72150 53 78456601770494323375 72150 5 -6009447015125 72150 64 112381618285295 72150 66 -2130971271625 72150 67 608708812479338375 72150 73 -38780063259625 72150 74 240045439180175 72150 79 216540688259375 72150 9 -5018634153125 72160 12 -2039456786766976 72160 5 2039456786766976 72165 4 5546263238007443 72182 1 5689320647651 72182 7 1376800467975 72200 13 -1198764358012000 72215 1 -10286143656472 72225 6 -68831738955000 72226 7 -23671064667073789 72237 5 -200033258610977 72240 18 12770464132448 72240 26 2474597389909184 72240 51 50702257347904 72240 52 -11316956007104 72240 68 -1863953912145088 72240 72 1964083554631232 72240 79 3949991661781376 72240 82 -134209863630847936 72254 1 -1476953477181629 72254 5 422485079827355 72270 17 2159524562833863 72270 3 -15887748123981 72270 39 -18035304105063609 72270 7 -58307163196514301 72270 9 -68233346567130357 72280 8 -316008425924934848 72288 7 -179540148635712 72296 4 -568108384434368 72306 2 -129751668739629 72306 21 4808381447871 72306 26 -45243944203401 72306 6 1221586493491827 72310 8 269343107983207 72318 2 -99647398557515557 72318 7 -1029462736486265 72324 10 2328525452631168 72324 21 1937107433559178944 72324 5 -798684230252490624 72325 1 -1675337075000 72325 4 11104091253000 72335 5 248939511898779 72336 19 129905324415296 72336 25 -29432278194112 72336 7 192654512620640 72345 2 850752469290088 72350 6 -3441434127625 72358 11 -3029464765224513 72358 9 -289560655147401 72366 7 921354370091 72380 3 -1053228170962304 72384 13 -406335716864 72384 15 210186478319104 72384 60 657936257536 72384 61 -300492669055565312 72384 87 -210186478319104 72384 95 300492669055565312 72390 16 -1118541649193 72390 6 2580111530299 72390 8 2700232667731 72390 9 -13798445935040189 72402 7 -15599900713553 72405 6 -220505186425176 72420 5 -303442948648226528 72435 1 -2337628164893 72450 117 1256600738622375 72450 1 190054352284875 72450 125 -1456757906949225 72450 26 -8227861539751125 72450 31 54484468198875 72450 34 115976191435875 72450 35 2458396429875 72450 38 108718053109875 72450 42 46297255390875 72450 48 -6159804610699125 72450 59 -182094738368653125 72450 61 -1097798770423125 72450 65 -5131467511691625 72450 70 161163177852375 72450 8 -4351405802014125 72450 84 -6058886638892625 72450 98 315904530063375 72468 2 -17034147397728 72468 6 459921979738656 72488 2 20548922152032 72496 10 5739029909964864 72504 5 -5399432741230272 72506 1 1910943544411 72522 1 -12290506909821 72522 18 3119572141191 72522 23 331843686565167 72528 4 -29002775620544 72534 12 -64280934040816094869 72540 17 -141443869790592 72540 3 -3614891890220352 72546 1 4603248758467 72562 1 501311013038981515 72562 2 -17115168351385 72570 11 6346468949023 72570 1 -2733161459237 72570 14 -1879483824089 72570 20 -41947557008833 72570 21 1695979137160727 72570 23 273736649216663 72570 5 165453168202651 72570 7 -4531066788493 72600 110 -1963393999732000 72600 28 -98299088360000 72600 36 122435479628000 72600 42 -2473250091400000 72600 56 37359707869880000 72600 73 298877662959040 72600 7 -6259509715976000 72612 1 240587739483840 72618 1 -1425327418433933 72618 14 -123363267206165 72618 22 -3950426374237 72618 48 23314182341527 72630 21 -165977259562953 72633 1 26812863028648 72633 6 -24506739393272 72635 2 -3297369329848 72639 5 34607085643625139 72645 2 -9129906809272 72646 1 2253962520291915 72657 5 -21064358346264 72675 17 520329318913798875 72695 8 -128108517949 72698 1 -492070312341 72705 5 -991094362285864888 72709 6 -1029819963537 72710 2 -720790587740466477 72710 8 -2458652022217 72720 10 -105737685795648 72720 21 -38300802371136 72720 44 -4789644982469568 72720 47 37365845057856 72720 52 86611223110377024 72726 15 44094885333335 72732 4 -4480527952864 72735 5 -1439202176504 72760 4 44622237564352 72765 2 -61184934605592 72786 5 434658541087 72790 6 2053441082367 72795 6 13260150033791176 72798 9 -7039761620201 72800 19 19878768792000 72812 1 18084955465152 72826 1 1572025681477675 72828 24 170264659136114304 72828 30 -6674788039512384 72835 1 -627043214008 72840 2 598146548460832 72842 11 557378335470671 72842 26 -100925633620222433 72842 9 -29518783615285525 72850 12 12777991241342502375 72850 18 -3093321817417625 72850 2 -168609315916125 72850 3 56289313046365875 72865 5 -1765998366209 72870 15 -505207240492501 72870 18 4223536276299607 72870 2 -2762822910077 72870 24 314821629919 72870 27 139268286605447 72884 1 -91010545516512 72885 3 -40399939276568 72890 4 16799024862379 72898 1 2548744350139 72898 4 -3319395872113 72898 7 -83479611887281 72906 9 -2723914665433 72912 15 86209626212416 72930 10 -9220806832176865853 72930 18 12599650315459 72930 19 -104003932215509 72930 21 3666628124794125739 72930 22 43595546616688390163 72930 3 3691828868203 72930 38 -4510784544157 72930 4 14339838483667 72930 47 -29998597412341 72930 48 127613301849899 72930 53 238846590164287 72930 57 -2819948799617 72930 64 118543188794311 72930 66 8957070030871 72930 83 -10567950251689 72930 85 -58717719656259769 72930 86 99580426383959 72930 88 -506285388147889 72933 3 -18823314381830776 72963 18 356358701634408 72975 15 -37407492690625 72975 7 32485510133000 72990 7 9167848802929539 72996 6 444889953641888 72998 1 97105294664927 73010 21 -10685776548041 73017 2 -15748632542817 73017 3 88605813764421171 73022 3 39231385135147 73034 3 11835436384912915 73034 7 2732274816974091 73038 20 -289522000077857 73038 21 407376946423 73038 6 -329263637296805 73073 1 -24839372841317 73074 6 1163813976071 73075 2 -6042092834125 73075 5 -13271149863000 73080 21 11888115799104 73080 36 -43997409394841664 73086 5 26284808608479955 73094 1 47124980788411 73095 4 6456231279496 73098 1 -2806638847029 73098 8 75779248869783 73101 5 -343799691681529 73101 6 56708510320979 73101 8 1588182470509256 73112 3 17035316537472 73138 1 -1967867628453 73150 26 177297759037475 73150 38 771795842438375 73150 43 22162219879684375 73150 8 881408916060875 73152 68 -148228874049024 73155 2 -106155794904229 73164 7 -18062079529804640 73185 14 -19816340381893 73185 4 21022133950747 73196 1 -1242035139051072 73200 43 -25692769592000 73206 14 -1758368169755757 73206 16 296767379966184907227 73206 25 780084631668699 73206 32 124320856251879 73206 37 -15384786286905 73220 4 27760077445936256 73225 1 -28108383409125 73230 2 2963398431907 73242 13 9428980325175 73242 17 12749307332247 73242 3 -254582468779725 73245 1 7460021610107 73254 5 176178257735147 73255 18 7305685905231 73260 11 437895028326528 73260 27 32003376161698944 73270 7 -4386067469569 73272 5 149762546972288 73290 10 -10237931083241 73296 32 -464943971286852944832 73300 3 -65587139210924000 73302 16 491894629847 73302 5 1721063114047 73302 6 -4353517874897 73302 7 135915539599 73308 2 -108206457791552 73315 8 26671388083624 73315 9 477133839674315019 73320 4 -5030834258695744 73326 14 16909450570331 73326 24 -135418009943249 73326 29 -27958295707851986081 73326 3 21005481373292251 73326 33 2221952455106351 73326 39 -22506478709110561 73326 43 121559679473111 73340 1 -19972816550208 73346 11 9981361044395 73346 25 90653619585484423 73346 3 9481851661691123 73346 6 41262457708459 73347 1 -1880512136792 73350 27 -344201014382625 73350 38 -1011711524315625 73350 9 -3623599285309125 73370 8 863199427368871 73374 1 -1150917273146690965 73390 4 -6991522770313 73400 3 3880897291000000 73410 8 -1871137755377 73416 6 -5657463619424 73416 7 5324664262038976 73424 1 -53947316898496 73437 6 5296570362539 73446 10 3208042168991 73458 10 -6910320031044093 73458 13 16684103477691 73458 27 -105734987852913 73470 25 -3884551687513 73482 3 61508559378151 73482 4 111880987108831 73485 10 -1044056051064 73491 5 -1740540375928 73502 1 17282404240083 73514 4 -251723812941 73515 12 13115506035203 73515 2 9477799193393128 73515 7 -10051725068632 73515 9 -20735449101020017 73530 12 -26610951624597 73530 16 -10793317390831629 73530 19 -1349032796721909 73530 25 235425780423 73530 27 154624099362327 73530 6 -31485047712453 73536 2 373789036094464 73536 39 -373789036094464 73542 10 -591531728885 73542 19 18967588210115 73542 26 -17716625225657 73542 33 -1733708951353 73542 8 -32177532108077 73554 11 159475253208751 73554 13 -4351689379961 73566 12 -88221734154045 73566 26 46997452354223871 73570 9 1945463685047 73584 22 25435701188447040 73584 28 -440024585822106048 73584 7 -43512866159904 73590 15 368956210802939 73590 3 7859512542990547 73590 4 123401504385739 73590 7 742491858558691 73594 2 21887116543215 73610 2 22526406029451483 73616 1 524495196310400 73640 4 63476360825984 73645 1 -22763027387413 73650 13 16581292071875 73650 1 51257900339459875 73650 21 53313070225375 73650 29 -31334114823625 73650 31 -38014611576625 73650 42 1837817759375 73654 2 7413645639707 73670 2 -252268267962789 73680 12 -51825424720905152 73682 3 -63000832085792749 73689 14 -86663050376309 73690 3 -21889096741297 73706 2 -2131081892461 73706 3 -103914187397569 73710 30 -165394785355353 73710 3 -16341736710573 73710 8 6125732790939 73719 4 2740996283112 73730 4 -1042893561330549 73755 16 -156853137731256 73761 2 -3112944935077 73762 2 -566834547910545 73776 24 38321482948928 73778 2 8130625407703 73788 10 25597341710088992 73794 15 -39303574262981 73794 25 336553862060647 73794 44 -1530273485432377 73800 31 4717406446020000 73805 3 174538082259 73810 13 -8908217693793 73810 3 -898373356804693 73814 6 956597968611 73814 7 -96528270224537 73815 10 -355360147924312 73815 1 -822624835302381833 73815 4 11477062247411944 73815 8 -1872892425546584 73842 4 -774666939608585 73845 2 -16588805846904 73848 3 -300754789393312 73851 3 -6197527079497 73853 3 -762984152204507064 73854 7 26660274523299 73855 2 48547893975688 73860 1 4661716879648 73865 2 1491913646792 73866 1 1407461471099 73878 10 4110072461263 73890 19 465219084596475159 73890 7 13869867754899 73900 4 23128495696000 73909 2 -766645471823768 73920 104 38311021715968 73920 110 -73419791328512 73920 123 -594533553579008 73920 128 -36651465850112 73920 146 826061007517696 73920 158 -15011447399936 73920 189 26115296643584 73920 197 -826061007517696 73920 212 2027807465984 73920 32 -7400386018304 73920 35 -2027807465984 73920 46 -26115296643584 73920 4 -7327077420032 73920 54 36651465850112 73920 62 594533553579008 73920 74 -38311021715968 73920 97 -20797751217664 73926 4 109225703478483 73926 7 -2279327614659117 73944 23 -11712304669248 73950 16 -68491953477125 73950 1 -9603240868611125 73950 21 -147163371228125 73950 25 -61629700837653125 73950 31 -3656162855125 73950 33 18252662946875 73950 37 40836224427875 73950 41 17631135957275 73950 45 -7387421888125 73950 51 -1546898460349625 73950 57 2203891994659375 73950 60 -5293742476625 73950 76 638088375134375 73950 77 -147878212610823625 73950 7 -8827753500125 73950 82 -1177306969825 73950 84 -493037606701225 73962 11 45083440479519 73968 17 1630871158720832 73980 6 147879998103168 73983 4 -272517880714136 73986 11 -41376598867931634577 73986 18 665340129335735 73986 4 -9969676225453 73990 18 -76996469772873 74005 10 -46370024825752 74010 7 11511296355511 74025 10 -516493828215000 74025 23 819324596462097375 74025 3 -1791954353979000 74025 32 -1020920389772760 74025 34 -127615048721595000 74025 6 66368679777000 74032 7 -3346423202240 74035 10 5786918216559 74035 1 -28876451707017 74043 8 1364385958208136 74046 11 -326229875749 74046 13 58047204753847 74046 18 -6876694689481 74048 27 -53234294681088 74060 2 84946103285408 74060 4 17285212574008352 74074 14 -8471699508609 74074 16 -22459750408369 74074 3 17717634136467 74074 6 -631412863111493 74074 9 -1087168627089 74085 3 58178137489768 74085 7 -2769690697057 74089 2 114853036906664 74095 7 -247014741719096 74095 8 951541969384 74100 39 40244200737560000 74109 2 5787538823368 74118 5 724513512079 74126 3 39577543072595 74128 3 -796118577193152 74128 6 1672361338150720 74145 2 -144050156518121 74146 2 -68855934675545 74150 13 -38715338065625 74150 14 -4250551048385625 74154 8 -2598595406425 74160 16 -3819117423185856 74160 42 3089710987373376 74175 15 -7668170624407625 74175 16 4468301409217375 74176 9 2292191018496 74178 3 834759720147699 74190 4 -1637246903376349 74200 18 57423714776000 74205 14 -127146211110678338357976 74214 13 11166570899595 74214 4 -15214658854149 74222 6 -321093945801 74226 4 -1605557461265 74230 4 -50067501455442277 74235 9 -2586158366678488 74239 4 -270850081176 74245 1 -1427251137912 74256 13 21593643978304 74256 19 -30377156655392 74256 26 337340165408 74256 35 -939061667883968 74256 43 1002713971214656 74256 68 -30919561946272 74260 4 -3349223054208 74270 2 -205951135310073 74277 6 -15385410179469 74295 23 -360681058145455029 74298 11 14383878942943 74298 13 8812665985105135 74298 2 -793041777557 74298 4 10188409123691 74298 8 -45721601203069 74307 5 -85667734865656 74316 7 -247370825090368 74334 4 2708255438407 74334 5 7976729351863 74340 14 1761962973293088 74354 11 -5216803505259345 74360 9 -484267362769216 74366 9 25442462661438943 74370 17 86722645071871 74370 3 -23662761451037 74382 10 356430173697451 74382 16 98021725749899 74382 21 -832877807168763377 74382 3 -160209342892277 74382 39 649626917280551 74382 6 -3270744203741 74400 24 -10406491076800000 74400 51 -83251928614400 74400 79 83251928614400 74400 8 10406491076800000 74406 2 -7506328319477 74406 6 443832676121001563 74414 1 -124686703119473 74415 13 141810876474344 74426 12 -2428884485209 74426 7 -133931133161461 74426 8 -1622881265289373 74448 25 14902113676746816 74466 49 12044652621399 74474 5 10988047821383 74480 28 81582241815872 74490 15 -10135010174797 74490 25 647080893613783 74490 38 747749331058800383 74490 7 3741040151083 74518 5 763575685543647 74529 32 2782440725939784 74530 3 -49366584621 74538 2 100322240992355107611 74538 9 1488878201800370907 74542 2 -819849230153 74550 13 254215038860875 74550 16 -58919844879125 74550 17 -300879125 74550 37 -185626810523125 74550 46 -2947455472625 74550 48 -18362922574625 74550 50 -24612173105089625 74550 51 3783476434375 74550 6 1864966258196875 74550 65 2794110754526005375 74550 75 16987583567375 74550 79 -178646061282625 74550 86 777928353158375 74550 9 561453195743875 74550 96 14919730065575 74556 5 657901470034018944 74560 14 -2568440043008 74562 14 -2675242920060685 74562 21 7215811760287 74562 26 -15143600254609 74562 32 35451283178290031 74562 4 -31529022234461 74562 9 -1975906945117 74571 1 453323183460313384 74571 4 263913258016808 74578 2 -19444973138717021 74578 4 290731206810835 74580 13 -5686624855936 74580 2 -1489254279488 74589 4 44803158350995 74590 3 6394571968103 74592 12 82122369111936 74592 28 -82122369111936 74592 33 -54558214322688 74592 43 54558214322688 74594 3 2683520289315 74613 1 1371857301928 74613 15 -2577516670072 74620 1 -83580793877888 74630 7 -21734898931153 74634 16 -345285726247729 74634 6 151225451314811 74634 7 196962247785871 74634 8 7565855262589135 74635 4 960194862745128 74640 21 -16192985891264 74646 29 -19381028331105 74646 31 15158209111479 74646 36 186074543266582023 74646 45 161706855840327 74646 50 -5138862947043489 74658 3 -8958796734745 74664 4 36312471033984 74670 7 -740013748201 74672 8 303804806913856 74676 10 -563067690677632 74686 1 8963415924083 74690 22 102367907843319 74690 2 390317395483 74690 3 1208823977467 74690 4 2799224237123 74700 25 -211235450940000 74704 11 759806350455104 74711 2 35920241301771 74718 5 -5794987404429 74718 8 -96148435257981 74720 2 -444285351890432 74720 7 444285351890432 74725 9 17370057981437000 74730 3 251959945277919547 74730 34 -4009540739833 74730 6 648373005883 74777 1 -1644020251155928 74778 1 193969524361987 74778 16 279911898933227 74778 19 -36811918654885 74778 25 -9686402050337938673 74784 1 -1008785618539136 74784 15 -20091528585728 74784 20 1008785618539136 74790 6 3124011950019 74790 9 -84348322650513 74800 29 10150542501832000 74800 50 7246385576000 74800 55 145692035708480 74800 57 -18808407576000 74800 93 18211504463560000 74800 96 12623980680000 74802 10 311266802666555 74802 1 -5266046421845 74802 16 285634644479183735 74802 7 4862143479507371 74822 3 -899179267769 74822 5 44131971388815 74841 1 -7103651330573 74841 3 -1395582658712 74850 17 2454751335460375 74850 25 102437098207775 74850 5 12804637275971875 74851 5 -122221262064600 74858 1 -4581043008093 74865 13 3182068028887271 74865 14 -3207345181489 74865 6 5367717645443 74874 5 65669687018191 74880 65 -17542702376064 74886 11 59840271140455 74886 13 -179894964761 74886 1 -6138382302485 74888 5 -2173340681792 74907 6 -26637118437105 74910 11 5891324359303 74910 14 5639461340687 74919 8 -14856013358776 74934 3 -1915735620213 74935 4 -2163251397861 74938 2 10467415981603 74955 3 2063738328623 74958 12 -173910778269229 74958 3 -18038054249909 74970 17 -21335801052573 74970 36 -79851775321269 74970 38 -91245777657741 74970 40 17113277348811 74970 42 330517204730811 74970 54 -509347367056017 74970 80 -13080706939157697 74970 94 14880653879679 74970 98 -1109356883049681 75010 12 -59472584273961 75012 2 158250587251744 75021 3 947956777411253608 75026 8 -31735766113823889585 75027 1 14972409119935 75030 10 -4167821886974677 75030 13 194637032618383 75030 14 -33674693419673 75030 9 6642453372579827 75036 5 683754416225920 75042 6 5138445833928675 75042 7 -103952481050925 75050 1 -125543675567125 75050 9 -1275502999625 75054 14 -1384093824121 75070 1 -943750953291709 75072 56 22082763045376 75075 11 -391572692374625 75075 16 -19546614119331125 75075 27 66219069925000 75075 36 -65398707739000 75075 6 25120026081541000 75078 16 -30365333971447473 75078 7 -56100438728757 75088 25 -978987166329888 75088 29 -4843507158296000 75090 3 603796887481087 75110 1 41826820193243 75110 15 -1021214646017 75110 17 8290862472729663 75120 9 -1095553058353856 75126 10 20103741576935 75138 4 6479845933751 75140 11 2578738408866944 75141 4 3975089916919176 75150 10 -149402440910284245 75150 37 375295134306375 75150 45 -18675305113785530625 75153 3 13850995530536 75166 22 2683307766125791 75174 1 -34618972109741 75174 14 15411635296111 75174 9 -903200021029 75184 7 2933274059349056 75195 3 -5235289592472 75195 8 141352818996744 75198 3 214439417005139 75210 23 184186393369239439 75210 28 -20480204707417 75210 30 21943409660930980007 75210 34 -74722030375909815721 75210 7 -4079497866877 75229 4 -7575268123063826648 75240 19 -224615783159136 75240 21 245564241084864 75240 32 12897699485472 75240 36 -9231807842784 75240 42 357399963296064 75258 10 -25657461070039906677 75262 2 -9990815496076349 75270 1 44260968110188123 75270 4 -413281234691851733 75273 1 -2180397330953 75285 22 15396353916264 75285 9 -32601919779288 75295 11 -3741979260110904 75295 8 -76179676249189 75300 7 -207394121384000 75306 29 -2948247022825 75306 2 -981318613085 75306 4 3310275889747 75310 8 21403741957224551 75312 13 61142482248768 75320 10 -196434934334352288 75320 1 25247139620032 75328 11 42796641633680384 75328 3 -42796641633680384 75336 4 -1775549510851456 75342 6 129167998300655 75350 18 -18764402503625 75354 10 -2131022725201 75354 8 537982179679 75366 21 -3272862296889 75366 23 959729239935 75366 29 -149512350291284817 75376 9 24978998559808 75378 13 -3066076940041 75378 6 -3668187108349 75390 14 -113587479181 75390 16 110521319492863 75390 18 -2134379241238481 75390 22 -5651314212041 75405 1 2422626089965651 75405 4 737936406615311 75425 3 -437248949215625 75429 19 -145835240499549 75429 25 376506184765896 75429 3 45520944826824 75429 5 -716488536574284237 75429 6 91659385497339 75438 14 -241221151656056025 75438 7 8934116728002075 75440 8 -1514838137263264 75450 13 322879899074008375 75450 18 30546543656375 75450 21 32195609984375 75450 24 -1028229128425 75450 4 -128528641053125 75456 12 36792388228608 75456 48 -36792388228608 75465 3 -1642714830648 75474 10 167984866496187 75474 8 -28663558375727808189 75480 2 -4194154487168 75482 2 -725822815797 75490 4 -690160130289 75495 10 2515028068232 75495 13 -2693925003736 75495 2 119311350200748712 75502 2 229389385252959 75504 42 -949917238728128 75504 44 161451714565504 75504 46 -393497247332936384 75504 56 763156330443584 75504 57 116670714484544 75504 80 7009567933271552 75510 3 1653143555187 75522 2 -2041739835496579853 75525 12 420571404884375 75525 5 3364571239075 75530 10 166480772110180991 75530 13 1076855138631 75530 2 343674262387 75537 11 -36872196492888 75543 7 -30440456976293 75555 3 5432330069930043 75555 6 -1022002031828183256 75555 7 -3940607821329 75558 37 187309762382071 75558 43 -69334043973985 75558 8 238053822632731 75570 25 -204591126121001 75570 33 -14908479563313649 75570 9 -754866357877 75582 10 24370812286371 75582 12 135790567179435 75582 24 -1274888695761 75582 29 -896575482470169 75582 33 51818549894415 75582 38 -1544329175147721 75594 4 -725966661553865 75600 106 3514900589640000 75600 107 -130181503320000 75600 109 -4613201416440000 75600 127 443684361770280000 75600 146 3549474894162240 75600 187 124556438243880000 75600 211 -11979477767797560000 75600 71 -95835822142380480 75600 86 996451505951040 75614 1 2163968520939 75614 6 -77181336910693 75630 11 8932345166447 75630 5 -30902924052973 75636 5 34934735911260960 75650 13 1421384091875 75650 21 8637162977375 75650 24 -558905193490625 75650 30 -312866467582625 75660 3 -751882996961504 75670 11 -1355334812695989 75670 23 -3539008249281 75670 3 367095391612363 75670 7 -159044507424109 75680 13 -187310552244917248 75680 14 13460661722304 75680 17 -13460661722304 75680 2 187310552244917248 75690 10 12531272224886883 75690 13 -654676815072213 75690 18 -5557009481696061 75690 24 -483394637542941 75690 27 66971752339599 75690 33 -11031162577137 75696 5 -7547228518524544 75702 15 -8988873964417 75702 17 -1101686801473 75702 4 -435115931577373 75705 10 41582412564616 75705 21 -23292648463672 75712 31 -117236526318080 75712 38 65380631127552 75735 5 10415201240808 75764 4 746400133741248 75774 5 -2134910380381093 75774 8 55242429279463 75790 1 10857308747563 75790 11 -30984598023913 75790 19 214420070432079 75790 23 -6353440148044080441 75809 3 -526948102397629 75810 11 -47911350146775893 75810 13 381137498395723 75810 1 347992495854256387 75810 22 1930123555811437580371 75810 27 673562615742379 75810 29 -7864104917789 75810 33 -44791296104197 75810 37 -370471801034917 75810 42 -146792852551981 75810 44 729218527889291 75810 48 363000424754771 75810 49 -136626257476673 75810 51 -11532276740053817 75810 54 307223499978687223 75810 56 166839047971903 75810 61 -4382009877204161 75810 64 -3449944833929 75810 70 -50735164871593 75810 73 132708721422887 75810 75 389655411029207 75810 78 442126011152933927 75810 79 -2614222101496264057 75810 83 328623950656735850087 75810 87 742760540078831 75810 93 -27139404624121 75810 95 5294198077205759 75810 98 53939895631114751 75834 10 -44615579188467645 75834 22 86501524286223 75834 23 104863364977311 75834 5 28472907591459 75840 11 -575574425156096 75840 26 -19122942034432 75840 36 19297108123136 75840 41 -2037111573248 75840 45 19122942034432 75840 50 -19297108123136 75840 54 -41275182003701248 75840 6 41275182003701248 75840 72 575574425156096 75850 15 -164090791968625 75850 5 -398178688222694125 75850 6 14137163080875 75855 1 16329649156484968 75858 3 191244883870619 75864 3 -2874344838976 75880 5 7867415467808 75888 13 -195173337983904 75888 26 61381976420160 75891 3 -260205919428745 75894 14 -220676803556509 75894 24 -346466288485169 75894 28 -15235800833161 75894 3 52686136005931 75894 7 415664902552843 75894 9 9677660535451 75900 30 41363145332000 75905 4 -150320611576 75910 7 -197001936521 75915 4 -30593441577707352 75915 7 3976142622579 75920 12 355727762121536 75920 15 1113439866589504 75920 9 143485679071808 75922 10 201803356735903 75922 1 -138436636294277 75922 9 4254535426455 75930 6 879889692531419 75950 21 285895741768875 75950 4 185675555492875 75950 54 -232985912268048625 75950 60 679259219440375 75950 62 140968588548375 75950 73 -992766591890537625 75950 90 -12573306195625 75960 9 4784006662272 75966 2 1538959983334219 75970 3 -10738185695829 75978 8 -43568471619513 76010 12 -621621156919753 76014 12 -440400364247709 76020 6 1959203226676256 76038 11 -75179566091609 76038 12 -3327965914495865124977 76038 18 -18104017510225 76038 20 -158339293430960881 76050 105 -1020877615757025 76050 114 23480454801375 76050 126 -4577024255633505 76050 147 -2232728862170625 76050 16 -127609701969628125 76050 39 8229074373277875 76050 43 5164498409074875 76050 49 -858768867055125 76050 53 -7994624671522125 76050 71 -542975275343337525 76050 73 -2069676799003125 76050 88 3185989240692375 76062 10 12604436038783 76080 13 -95558804257472 76080 29 -1030384456740946834624 76080 33 -47794835624896 76080 9 11613099840832 76095 10 -38590926418296 76110 9 378854547737405743 76128 13 18952434041536 76128 18 -18952434041536 76152 14 126647452331200 76153 6 2167051174987533435 76160 30 -277066025555264 76160 37 34633454442112 76167 5 -15649194039480 76167 6 422528239065960 76176 6 -9543027188836800 76195 2 -6515135432792 76216 4 36649414111680 76230 107 -2830569020308161 76230 109 -173810338109001 76230 120 -202500968628321 76230 128 1932922060818050511 76230 22 17114680235079603 76230 32 -108057386264157 76230 39 -2276143212697101 76230 43 -1452232953281781 76230 47 -1833018389610309 76230 52 -151294876840701 76230 60 -70360980318189 76230 67 269528789244295251 76230 69 1053645283616211 76230 74 -36174224485377 76230 84 -1839780606457233 76230 86 -1168892415308673 76230 90 -2689029662903793 76245 3 914623757754751 76245 6 386781390393256 76245 7 -145323117403541 76254 6 5115954687623 76257 1 8759899805256 76281 1 -2080213536336632 76290 2 6730094761019 76290 3 -2883927067021 76296 11 4342273315288192 76314 15 -2043556527349 76314 18 -139869279521 76314 28 37372535522351 76320 33 11021265978048 76323 3 -6617670032897 76330 7 5323032794609991 76336 15 51270133515840 76336 22 31035511877696 76336 4 3537560691072 76342 11 1192771625662799 76342 27 -5883837447037938633 76342 29 3805282397511 76342 4 162267076249526061611 76342 6 369158313152979 76346 1 -41004413675217 76350 10 4601866848875 76350 13 -33633099774801283625 76350 18 -140267870077414625 76350 27 2116199564984375 76350 7 16929596519875 76362 18 -1623393141371585 76362 19 -18785443342182713 76362 7 1409904729803051 76368 16 -7863771134656 76368 2 -190039877049536 76368 8 14534152273020736 76374 12 -3954562870529673 76374 5 -4953088647549 76374 6 2127177511587 76380 1 -32274883088864 76383 3 5115755391003 76398 18 19188865033631 76398 20 2603399707439 76398 3 -2690666558899901 76440 23 -49410354484288 76440 37 218840969606336 76440 39 234062914250816 76440 41 46108490920202816 76440 55 99976886069536 76440 76 -127901220981184 76440 8 -134427087230912 76446 2 -539795832426837 76446 3 -701672905789001253 76450 1 -126107186625125 76450 7 9335369508145875 76454 7 -34788968437609 76458 1 -225897681562927757 76469 1 -2648362707512 76475 10 -30063464693800665625 76475 16 -240507717550405325 76475 17 -238673916680625 76482 10 -5104945469205 76482 15 299723927782455 76483 2 -2062583148312 76494 12 -330120672857 76494 2 -2074411379848733 76505 4 254981836799 76510 6 660871746207 76518 13 11597784808527 76518 5 -313140189830229 76538 5 -2893069400233229 76560 11 33745715100512 76560 12 -1437838550907328 76560 13 3409984921912928 76560 20 -4567081495744 76560 27 105735872894116672 76560 35 6205692385050688 76560 36 13665682549216 76560 45 97107123670336 76575 2 -11129203439000 76578 1 3444084143407 76580 3 63085199663744 76590 12 -21695408108037 76590 18 -3431999725758216837 76590 1 9429018913467 76590 29 192207014274339 76590 35 8210488458807 76590 47 -224654609105433 76590 53 680220489405637863 76602 12 -72897962147857 76608 114 29746020151296 76608 132 -29746020151296 76608 144 792157714094592 76608 32 -792157714094592 76608 38 3517446821650560 76608 69 -3517446821650560 76608 74 -279993505572864 76608 86 8889758747136 76608 93 279993505572864 76614 13 -172657019133708713 76614 7 862683424003639 76622 11 91375271911223 76627 1 2277168621768 76629 8 300823905194135 76630 8 15423101977942999 76641 2 1054234603943747 76650 14 -96404112737045 76650 16 253349245007515 76650 22 -1726876104273125 76650 31 604595384196875 76650 33 -11496491669125 76650 36 -17909940520505125 76650 54 -1101938742883588625 76650 66 -71756983705625 76650 73 34204939823375 76650 77 -31830482191992625 76650 86 -12050514092130625 76650 88 -215859513034140625 76650 89 31668655625939375 76653 3 -10733266697157 76670 1 1720106986563 76670 2 -3867537584917 76670 5 9976261498019 76680 15 -24142510376352 76680 9 651847780161504 76705 12 -9847625437788344 76705 7 124172749077256 76713 3 3036877094808584 76714 12 1605935668447 76720 14 6648163048512 76720 16 2828833989696 76726 4 -77694105154185 76728 8 -10740621108032 76734 11 6145573141323 76734 28 -165930474815721 76734 37 -17688072482577 76752 20 148678152324480 76752 28 -2559008583360 76752 61 -94236345027884736 76752 65 16846987267100160 76755 19 -2980406411180344 76755 7 157270875586651 76758 1 4948233880555 76758 5 5249425845167 76770 12 -53077117915799253 76770 17 344870002178739 76770 22 -6267839390793 76770 6 217697739321267 76772 3 81756277142688 76776 17 -114097441127104 76776 20 73560511520 76776 6 -59618929889728 76797 16 193219044991848 76806 3 -4688925894621 76818 12 1537697137823092583 76818 3 -12873157473581 76824 7 -217950149805120 76825 4 717466389949000 76830 17 1048345068301543 76846 4 -1897861847517089 76860 13 -150031970790624 76860 14 64123856177184 76874 10 245498769590688963 76874 16 13312513246985639 76874 18 2269678546123703 76874 29 822177270156087 76874 9 19536481367571699 76879 2 998862329672 76880 8 14543841405739328 76890 19 -112433612931377 76890 20 1529061701527 76890 22 -86842326620233 76912 6 -2346257551446720 76930 15 -317204855760149 76930 31 -57143752385769 76930 7 -7285333397237 76941 3 5488291926120681675 76944 33 33033152009024 76950 26 -72013736274525 76950 49 -9001717034315625 76950 61 -9705967785392625 76960 17 -320651961610752 76960 5 320651961610752 76962 4 -720575138215189 76986 18 -474202968659926605 76986 1 860988812400963 76986 20 -31888474533369 76986 23 -3134571794384841 76986 30 312898726369503 76986 33 -1992395434270905 76986 35 -416269802839617 76986 39 -18106043643297 76986 42 -31153294527993 76986 47 -1979277047721 76986 5 6456863250531 76995 5 1210455151587 76995 6 30937421705411007 76998 5 -4376163440701 76998 6 -4786548608125 76998 7 -122765533660961 77006 2 -1825910540274149 77010 11 -318843676621 77040 7 -12174243499584 77049 2 2492469160875 77050 11 -244067483125 77055 4 -6675309551224 77055 5 9077751541979 77064 13 -304529148007136 77066 3 2962614545768511 77070 24 -1319201273377 77070 4 5316070322179 77070 5 -5318300461949 77070 8 -58187285319941 77070 9 -116475477327357821 77077 15 -72389669224514257 77082 11 1177541572160663 77082 6 19485738502975 77082 7 2338784603479 77088 18 43336558263808 77088 2 -43336558263808 77106 11 6461273721079 77106 3 1673737286977527931 77106 8 2446340081743 77130 10 4706991611523 77140 5 -233865047594368 77140 6 8730989024270976 77142 2 669764096659 77142 3 2159783621315 77150 2 83531298311088875 77154 16 -4156599052621 77154 28 403562233439 77154 31 -44770489953841 77158 1 3755918923703 77163 4 33281195055587 77190 11 -7583341996097 77190 4 43957537056307 77190 6 76628993248531 77200 26 1008555400000 77210 12 -1280672311337 77210 3 132594512707 77220 13 -2041870824353664 77220 1 75624845346432 77226 1 -7849799005013 77226 8 -79556678433001 77235 1 -13985875494512792 77238 11 -138338977355434269 77238 5 -125269404862797 77248 10 -63109114274304 77262 2 -46022427554309 77280 2 -112941134453888 77280 34 -540598500224 77280 44 112941134453888 77280 6 1998334670464 77281 1 -7599573590093 77298 1 32312367930799 77319 27 -154489925507544 77319 7 1370443435583112 77326 2 -2735643539773405 77330 9 -943517404441 77343 2 11354979126079 77346 3 109126515200211 77350 10 -48614159620125 77350 20 109311697851875 77350 24 -193317353820132625 77350 33 2890190201894336375 77350 40 21899406324375 77385 17 12849020866151 77400 33 7280600789173392000 77402 14 27448328512943 77402 19 -33678199103567993 77415 1 -43657006289525117 77418 14 -2015573925645 77418 21 -941834328715233 77418 23 -254232383235705 77430 5 -17766074910995029 77430 6 19231945953463 77441 3 -3925504534602104 77454 10 8505268855529967 77463 1 110336666106014091 77463 2 -4086543189111633 77464 1 -342944903744 77469 16 3493694667630664 77469 24 -379079109187093 77469 4 130024134451172899 77478 1 -461444303472517 77490 27 -2673219049353 77490 8 72176914332531 77505 8 -5099663004086296 77506 14 -84144238148177 77506 8 -6788514669769 77511 2 3879747122959 77511 3 3229632559511 77520 11 -13657628642336 77520 23 7144741543616 77520 38 12989927582272 77520 46 11680704551047744 77520 47 -27685765624256 77520 51 -3634563029696 77520 52 2674206743637078496576 77520 59 9866985603106112 77520 61 -45455749711552 77520 7 -1439178408512 77529 2 11977514572328 77532 4 51525406079776 77546 7 -26183222430976297 77550 18 778066806615875 77550 30 1077988547218375 77550 37 -14440754871328625 77550 41 -6745788544625 77550 45 168782571454375 77550 55 -42875141190625 77550 9 -23765171103125 77568 11 -269723819395072 77568 15 33715477424384 77568 19 269723819395072 77568 25 -33715477424384 77571 19 -108778173954957 77574 10 -293587498688833 77580 10 465008825765664 77595 11 -12683813245741 77595 1 -52384789021697 77602 12 -1339234868089 77610 14 -43214777280037 77610 20 1844922676303 77610 21 -58931496475073 77610 27 2682566447752151 77616 101 881057815735104 77616 105 -1383596678245824 77616 117 -69435185287104 77616 134 2590513613610048 77616 154 60137628489792 77616 62 -1384988564167488 77616 67 -209563201735776 77616 86 338543874285120 77616 90 56966768776512 77649 6 -46523579982625 77658 11 -363001606424045 77658 19 -27098541193501 77658 21 33808750080928451 77658 28 -46905432208937 77658 36 -54651999162743065 77658 5 22132907497387 77662 4 -2540197501353 77670 11 234848743568091 77682 11 -62227908811189 77682 13 94557480496523 77682 21 -708051143308553 77682 28 28517058047159 77682 37 -4491226639733185 77682 6 200536380441595 77688 6 -367112399114304 77690 1 -16374053544893 77700 26 120408288848000 77700 29 6758547246800000 77700 4 -4630260052412000 77714 11 59820206282767 77714 1 -777783374018871661 77714 2 2267590011716827 77715 12 -10912977092709 77715 3 5744001890952 77730 12 1133825178210911 77730 4 6622452067787 77736 1 21546374308480 77742 7 1614405486963555 77745 6 -3789013023773 77760 124 -10529860944384 77760 87 10529860944384 77760 99 28510798696128 77766 2 17388599584715 77770 10 -886040092097 77770 1 -24084811940517 77770 22 16251222849269239 77770 2 -953932070853 77770 9 -206410011669 77775 5 -411544033325 77775 9 -51443004165625 77778 4 21594444025455 77790 10 30147381914111 77792 2 -101436254540288 77792 8 101436254540288 77805 16 6447500407999503 77805 25 -1111021384203576 77826 10 -3942451619245 77826 15 -1943366786873 77826 6 1759025817163 77826 8 -329436984181213 77830 4 -1649774371257 77830 5 654085980183239 77835 3 341050987453931 77847 3 14498011011835 77847 4 -162797936438305601 77847 7 413550987314584211 77847 8 -988575508978597 77850 1 538603256437612875 77850 31 -19948268756948625 77850 61 156925227504375 77850 9 293426628850789875 77862 13 11622738086047 77862 14 17634475738392319 77862 20 5551147296503 77862 21 -245603448225145 77862 24 -931947876865 77862 4 -565710175781 77870 4 -237849536374175393 77880 14 289116217078208 77894 1 58638591191641709159 77896 1 9148603425408 77907 4 -28347091548184 77910 12 121192700871403 77910 31 -174697066885347181 77910 47 -123536225012417 77910 54 -4084371378895409 77910 56 116923562820688463 77910 62 98295092849303 77910 64 -2911269634031017 77910 66 112247827890191 77916 3 -68319601118649152 77924 7 -16560959364928 77934 8 -1114526614985 77946 1 1428032737891 77946 3 47993463758899 77958 4 2427709542723 77994 4 63919947721202091 78008 6 -319985220602656 78014 1 -2476823545961 78014 3 -8395392600017 78016 13 2245493412043264 78016 7 -2245493412043264 78018 4 -668736525457 78030 21 2312454389794803 78030 33 -7298477594719497513 78030 52 29086893751887 78030 5 -2579989210426197 78030 61 -62436268524459681 78030 64 95555155941711 78030 7 -785346131300949 78030 8 270313984989611019 78039 5 -3843947156184 78045 7 5069565728132059 78075 5 -837268685110125 78078 11 380815837126075 78078 23 19221214466467 78078 29 -9699562738333 78078 54 -258073798640489 78078 56 -480751318868561 78078 62 -186180950368673 78078 68 -1294347195845873 78078 75 -3968747859797621641 78078 85 -9602362071289 78078 89 -5867917424929729 78078 9 -22227732085389389 78090 11 103637229356071 78090 14 39305559540144636919 78090 15 -95626613666377 78110 2 -8964856050547357 78120 14 -5733187038144 78120 2 1287739889483328 78120 23 -8244850406976 78120 32 -316941145329024 78120 8 15829890070464 78126 3 2315453304973211 78141 6 706400601306191 78141 9 729566584504883 78144 19 231734953889920 78144 32 -231734953889920 78144 6 -1205365774144256 78144 70 1191464055296 78144 79 1205365774144256 78166 12 -345847270905873 78166 1 897570532096227 78174 7 -4643540582985 78182 4 -591293240901 78183 8 -149501690259480 78186 6 -94279978694341 78188 2 -158328827742592 78195 3 1064576923723 78205 1 -3820558515561 78210 11 15490465175116683 78210 15 57600934960558563 78210 18 10256693689055619 78210 42 -48640411744641 78210 44 1907047807666839 78225 4 3219494041000 78228 1 -1240131175380554112 78234 12 27671791109571107 78234 15 -13335521712733 78234 20 167123905423019 78234 30 -1764301678637057 78234 3 2608832162539 78242 4 -2675134460790377 78246 21 -38059879219209 78246 6 1409625156267 78280 7 5763021787584 78300 17 2600908597496016000 78300 45 107074134900000 78300 8 -96329948055408000 78306 4 18390564983663 78309 11 289977311283624 78309 12 42743931666939 78309 15 -3951226504752696 78310 2 -11940558309269 78312 8 8356237366816 78320 20 126860620290112 78320 24 1639883281591872 78320 26 -3593016876652992 78330 10 -423415057797593 78330 12 -1503063324881 78342 8 980231542615 78345 2 1643134782804552 78351 15 -3344048977207960 78354 5 -1900157300181 78366 1 35089218732691 78370 4 -481628683621 78372 12 1775447119687968 78386 1 -11325964759381 78387 4 -1311132368600 78390 11 -18756222616916253 78390 14 -626042694435811173 78390 22 1723657547129211 78390 25 -73545511395069 78390 27 8866420114808619 78390 34 50518861258527 78390 38 -2684872981575153 78390 39 122946137468487 78390 42 -45096100931097 78390 50 10663607465064351 78390 6 -1871068935501 78390 7 22451878369537443 78400 171 11031999552000 78416 4 -47288070378432 78430 3 19987532119503 78442 10 -19011349969842257 78450 14 -80128864253125 78450 21 541084908784375 78450 27 4422922616375 78470 1 -9620556466877 78470 9 -12254696245709 78474 7 -2024488036333 78477 2 -134895761222552 78480 61 -32397791534784 78486 12 -5540566946332969 78490 10 -82356499575937 78496 2 -1050727734365696 78496 3 1050727734365696 78498 17 -181728649388349 78498 4 1072778105624715 78498 42 -154201034740631697 78498 44 42675230860214463 78498 48 -124417582682841 78498 55 107626579192491975 78507 7 2920301251119 78510 11 -4908841057529 78510 15 -3528958262041 78510 6 -960360300613 78526 4 955979412412879 78526 6 -2975182152665128057 78538 1 -2893000198301 78540 14 -1030692001832071552 78540 16 -439649305258913632 78540 18 -1388299204654048 78540 23 -3139251282784 78546 14 -3376632114649 78550 11 9285301642375 78550 6 -1998063558125 78554 2 10469928417283 78561 6 -32441495678136 78561 7 20880638433424008 78568 2 15283403492832 78582 15 27944302037966495 78582 9 -263308552575641 78585 15 -5356096335608824 78585 19 532372189742665064 78585 2 2326307114924767 78585 4 726603861159000136 78588 6 -4045904348590944 78606 11 -1030277743748207073 78606 9 -174721929333705 78621 3 -1194390392725 78640 6 2629214293174848 78642 11 58894805572263 78642 19 -1034297619345 78642 6 -39617989895781 78645 9 98829217018063 78650 3 -146042201504225125 78650 47 -977985705849625 78650 54 -14717625503625 78650 6 -109162844839415125 78650 72 -13619832937665625 78650 88 -53209649040625 78652 2 -7120075420861920 78658 2 876864776529627 78660 14 -425334842254656 78660 22 -76769747097984 78666 11 -1814743688129 78666 7 -16894361726297 78672 15 -28621828865728 78672 17 24287207902784 78675 3 250352461000 78687 5 -8821514234319480 78690 1 -5930843816662757 78690 5 -63963997839973 78694 19 8930401259369247 78694 2 -495148498281549 78694 4 14485678808419 78706 2 -81382423109733 78714 1 -2724376389237 78736 13 757827565913664 78736 23 -176127446888128 78736 28 -12091200376256 78738 3 862650522991 78738 5 207459453511 78744 2 -11062428711616 78765 3 489049221596522408 78771 14 -244822144575448 78771 17 3090896916974504 78775 3 15077722509000 78780 8 -3583835465696 78793 2 11554130730007 78795 3 32312379348603 78800 19 482837366664000 78810 12 -152340092763115213 78810 14 54059290828091 78810 20 671390066791 78810 21 2018684649079 78810 23 -27222047350066889 78810 4 -3312712486997 78810 7 -991970288549 78819 1 219562841391031 78838 2 -1509428417597 78846 1 -6520758793047269 78847 1 985624671592 78850 9 4519752861375 78858 6 -6390194475501 78870 1 5054695682644027 78870 18 -247848823246537 78870 19 -100946729057473 78870 20 22461982297127 78870 21 -3627965894401 78870 22 824069520234431 78870 24 -669468344549551201 78870 26 587824857431 78870 3 -66100060840949 78885 6 -11992579973496 78900 14 53811962000000 78914 1 1166478742604331 78920 2 -28247560329024 78936 15 393870571840 78936 26 -237184944191200 78939 14 -3969863453304 78960 29 -1623141757504 78960 39 -5921888347808 78960 66 15536821977355328 78960 69 7852891693917248 78960 70 -640263726208 78960 74 3736436697468224 78960 81 4871566434176 78960 83 15202059384896 78990 6 -6260148425881 78991 1 438888693275 78993 7 -5634037897257681 78996 4 91291728462112 79020 7 752879991970944 79024 10 -65215621257408 79024 4 2149477538624 79040 32 -255055803719850496 79040 54 255055803719850496 79050 45 189111784375 79050 52 -23233850340625 79050 63 -12405273466740625 79050 6 -8740155853350125 79050 7 4440247136875 79054 1 1335040551386091 79056 9 -13556622055104 79074 10 -2060753879061 79074 9 177566142096315 79079 2 7169361570216 79110 9 -8648074754757 79120 19 -158288612481216 79130 5 -4862367879154029 79134 19 -192186518133889961 79134 4 144392575607731 79135 1 -1505474911050514488 79135 17 6444222399944 79135 20 -8215815693176 79135 23 7113252905435411 79135 25 33116687878519 79135 31 4389139682363016 79135 32 63158661420904 79152 23 -11789315666432 79152 5 2773369053310528 79170 12 625304723779 79170 24 -8219112247331423173 79170 32 4828191283169171 79170 35 6945648951851 79170 37 957110724179 79170 38 160777245580379 79170 45 -821198763377 79170 50 2076363340325191 79170 52 -24886190186801 79170 56 5531446534951 79170 6 11071805797963 79170 62 -10733947077673 79170 65 -140468926796281 79170 66 -2082000242472064467769 79170 68 49067054833679 79170 72 -3029635352306809 79182 15 -1581551206281 79182 2 4961695097835 79186 8 -937881877227841 79198 1 -2088515161557 79200 100 -460109253744000 79200 116 -28903285840320000 79200 120 28903285840320000 79200 22 460109253744000 79200 27 -231226286722560 79205 4 27070756896168 79212 9 -5539759909982432 79215 2 72625966189617799 79230 11 1085324714616269699 79230 19 -17830412836721 79230 28 8062098730991 79230 6 232707977829379 79234 2 -9581495272317 79234 5 -9338508409393 79235 4 2055898334184911 79248 6 -363209925860051392 79254 15 1551979696928571 79254 22 -354883961633193 79254 2 -3802808149965 79254 3 13143850430859 79254 35 -69217994570985 79254 39 -22344118755057 79254 40 406397334628935 79268 1 2090818082632320 79275 1 1488137864653000 79275 12 16793030393000 79290 11 -172372187940381 79290 15 -1247680167631137 79296 23 -17252235887104 79296 29 23521444494848 79296 33 -23521444494848 79296 34 17252235887104 79296 7 -6160848439040 79300 4 1609029304596000 79305 1 1293445362799 79310 10 -257935809884409 79315 1 3267087691963688 79326 13 -192704142848705649 79326 1 7137190475877987 79326 3 938273042907 79326 9 -25333372158489 79339 3 -389438261772760 79344 14 -784076790296160 79344 52 73528580424398400 79350 102 553149812681804375 79350 11 765246061500155875 79350 15 4425198501454435 79350 19 -2663830356433325 79350 28 -270449060006125 79350 30 -7945304193749125 79350 39 1562442376821875 79350 41 -13643642113319125 79350 44 -46956101966948125 79350 63 -61855669858625 79350 72 -1325960382415625 79350 80 4848153642092375 79350 84 -119370405260859625 79350 85 -332978794554165625 79365 6 -15004624994776 79368 6 -595571700740320 79386 1 -11508381488429 79386 3 -821323726541 79386 5 -62915973279805 79390 1 3290681450801251 79390 5 -900569098369 79395 2 563899996223 79395 4 -688095566776 79398 10 -587365839109233 79398 12 -320219005487300505 79420 4 -83488246443420256 79422 11 -25075866814237 79422 19 -20775489006858137 79422 2 27808367406499 79422 28 6092498629110095 79422 6 -174664711577341 79440 16 -1345256360027072 79442 1 10196362535715053730035 79450 6 -562711653125 79458 16 25380918972199 79458 7 148288145354841275 79464 12 -203087010907360 79464 2 -17942292007763264 79470 15 369602117611623 79470 4 -279157375572237 79475 27 -969087766888125 79477 1 271097546694175 79478 12 -62498337083441 79482 4 -86220882470845 79497 17 162043322290344 79497 5 721576336924872 79506 13 63069081006807 79524 11 -8546782039422336 79530 11 -70543162662661 79530 1 -4002380076796761293 79530 23 45285631225294679 79530 3 -11776592760389 79530 7 -4165128491600557 79534 12 -125356349722213 79534 24 1786964580855 79534 25 656636197671 79534 4 294466857667602355 79534 6 35935109879579 79536 9 -10637978389696 79550 20 819060850309375 79550 9 6552486802475 79560 17 -137990837242497888 79560 19 -48751722195552 79560 8 7898772175208102592 79566 5 -21692168162369 79570 8 -2115546205707953 79590 17 3118364151599445911 79590 21 -2432740926516769 79590 5 -139191173964037 79610 9 -209128548472209 79618 13 379621328735627 79618 26 -619294161143449 79618 33 -264829211356193 79626 14 -49039682050081 79626 2 133998319952947 79629 5 -3208946964045228856 79629 8 42752660382728 79632 16 910255376973888 79632 31 122824793171520 79638 6 -11417548065013 79650 18 167146245700875 79650 20 -277742465335125 79650 28 942910594567875 79650 4 5954724142875 79650 54 -4512948633923625 79650 61 -34922614613625 79660 2 85274147456128 79662 2 -19133426302165 79674 15 -137602979417701 79674 2 189329691501811 79674 30 56771380006775 79674 6 -2014498246733 79680 20 1096900808192 79680 34 -29338009722368 79680 8 1852867749376 79686 6 36140391049260631707 79686 9 -35079505100469 79695 16 5025810188662227 79695 24 -41479239614301 79716 12 1469627755289504 79716 5 5194907224480 79740 3 5684521816512 79755 5 67594370924296 79764 2 -4225493329601408 79765 6 -18259350056703064 79768 12 -84506462419392 79770 4 89925378765031 79786 4 -383619138135885 79794 12 -2370922001443341 79794 20 -858608788496841 79794 25 -1174855267597617 79800 15 -15512600368000 79800 24 -175792031864000 79800 6 -105062837081768000 79800 8 -20774627831600000 79809 1 -37251125425745 79810 2 66189260393083 79818 6 -11080000501993 79821 13 -481681469130561 79825 4 -1527132575369125 79827 5 976412136668930639 79830 9 2373384378913083 79846 2 706935677167 79866 10 -66915197435817 79866 8 1806710330767059 79870 16 -1873366524493821 79870 34 -7028524861561 79870 3 85559910600843 79884 6 -233997240232512 79890 15 741761361618031 79890 3 -5046141382463717 79910 2 -1559014509853 79920 18 318012510839616 79920 29 7160337983808 79920 32 -249574200725952 79920 3 -8586337792669632 79920 49 6738503419600704 79926 11 -40687752320893 79926 13 2949913345807 79935 2 -36421794817417 79940 2 702640597823648 79950 16 -6816865236392125 79950 27 -152519398065325 79950 32 1563918817375 79950 35 -19064924758165625 79950 47 -388847937415625 79950 59 -1205348865625 79957 1 -4136483587362264 79989 3 17641683095336 80002 6 -210974869549153 80010 40 15974135272143 80010 51 20200060908904311 80010 6 -24180325190253 80025 12 894956537800 80025 20 -4845988348458625 80025 2 -312813043209125 80025 3 35855376301000 80031 4 -4697626574062360 80040 10 20746348453504 80040 1 16873196644288 80040 14 258855551201888 80066 6 -64151493223041 80067 1 22034842873055 80069 1 25952039370315 80070 1 54850394296747 80070 5 14888026488619 80080 22 79798101159232 80080 33 -22222485387712 80080 40 13685065578743616 80080 41 179664242264442944 80080 44 9797643378496 80080 45 40498665997824 80080 8 408761490123088192 80094 6 424164623612311 80106 11 -95331786078581 80106 17 -1307626044307453 80106 18 -22289329654865 80106 6 53085657888523 80122 1 154850687839819 80130 1 -3940155145709 80142 18 10128179099663 80142 3 -69469180444588517 80145 3 19353377084787 80178 16 5230115855264719 80184 3 138375182949056 80199 7 -3103361900195544 80202 2 228072262108735 80206 1 35197208352755 80214 13 149625195758200151 80214 17 -54895095042049 80214 3 -7224115148819821 80214 6 -17184238121269 80220 5 -3454423266176 80223 7 810263356100560747 80226 9 5353118898439023 80235 1 -1883364707448 80235 4 80802277695144 80240 21 -10530380625518016 80240 25 8087273476786062144 80274 14 21580298579591 80274 5 -2999982957373 80275 2 13078356525000 80290 11 14158237153031 80294 1 420843865015 80295 5 -491272352426550437281 80304 5 -8073325557856 80320 16 -4549547146752 80322 10 111253522419071 80325 21 -21886032446353125 80325 27 82264862212875 80325 29 -3880728711000 80325 41 4727383008412275 80325 68 185307208029000 80325 79 590922876051534375 80325 86 -175088259570825 80364 1 39534417139616 80370 20 -1087547137936749 80370 35 -4229580872313 80370 51 -194097929881329 80395 2 6421961133288 80395 3 -3757329641897 80400 20 -13007157876800 80400 27 -1625894734600000 80400 57 701151430312000 80410 11 287000632416527 80410 16 4243028839963847 80410 2 502289224674363 80410 5 27198100587203 80430 11 368965861051859 80430 14 -2667902729941 80430 21 3964770653311 80430 24 245615090671 80442 10 129670269707871 80442 8 -2839212539433 80444 7 12043472818684320 80445 1 6458472959743 80445 4 -5682429027161 80454 1 2473853228443 80454 13 -4401536468933917 80454 19 -13941311675689 80454 3 511910670043 80454 6 109029504691 80454 9 -78990218435197 80464 13 -14434105481920 80465 10 -1857857837121 80465 16 140554359560439 80465 2 857229582000968 80470 2 2806908512809851 80475 12 -65835151255000 80475 8 128871741725000 80478 22 -42183339072849 80478 26 -26696076740217 80478 29 -35673163896985569 80478 9 -69591902417613 80496 35 -5525421289548480 80496 5 9559909966091328 80496 6 -354070739484864 80510 3 596171300599 80520 12 23783770766368 80535 5 37635133888955611 80535 8 27941544791551 80546 6 -187663794389721 80550 36 -9204817640625 80550 40 -27955305140625 80550 5 199602415123875 80560 5 -32241046078144 80563 6 -40620774565839448 80580 9 644981682464 80586 12 -81737709643557 80586 16 -35451474922413 80586 20 -930357163649925 80586 35 -83628210459321 80592 6 16280759624896 80600 22 -591016019400000 80619 3 60134289301864 80626 1 2571588434508787 80626 2 298882358294759 80634 14 31937386174055 80656 16 -1020970000896192 80656 8 -766840775679424 80658 13 793074003831 80675 2 3301278138089000 80682 13 13629458262491 80682 27 -857215476377 80682 5 1251885440611 80682 6 35563248768376531 80688 22 -532656400621760 80688 29 -448568391886863040 80730 19 -4381161081280173 80730 32 32779725811299 80730 33 137787727832379 80730 34 66574154564451 80730 39 181466441685927 80730 48 1976575683087 80730 60 118291349194564671 80755 6 37492583179464 80766 14 -92717283336705 80766 18 7620903431847 80766 5 169760568224115 80766 6 -986916871854045 80784 35 131424334990848 80790 10 -759433164280793 80802 4 4548324412588419 80808 18 -873675361947871626683968 80820 3 960666499566941472 80822 4 -827671746861 80822 9 -9315633786481 80835 11 -1309605314795641 80842 2 -242755793513099765 80850 10 3208173937640875 80850 108 -709895889418625 80850 117 -39103699021816625 80850 119 -166284876865625 80850 124 -1257062123578625 80850 127 20950098792175 80850 129 -106910765396225 80850 133 36055594264375 80850 140 -9859007824465625 80850 145 13233211161608375 80850 150 359198209884815 80850 154 2186901061706375 80850 160 -473477717715625 80850 165 243494290070588375 80850 171 114004953416375 80850 188 279103602089375 80850 190 199995983318009375 80850 197 3381639683791709375 80850 28 44899776235601875 80850 37 1599967866544075 80850 3 -9741860476641125 80850 44 27053117470333675 80850 47 2618762349021875 80850 53 13494950196875 80850 58 28401925587875 80850 64 699288296469875 80850 66 -124122055826125 80850 76 -13363845674528125 80850 8 108847744208875 80850 84 -573934370078125 80880 14 -58252701857984 80883 15 78335803919592 80886 10 8629434335886570539 80886 4 -12255987083309 80886 5 1241585460759691 80892 5 237488314233024 80901 3 -7801979779512 80901 6 373934341560168 80910 17 592499575312263 80910 22 -3489486526522161 80913 4 129829562954216 80925 14 2148326343593000 80925 6 50918760007597000 80934 12 -4411737609425 80934 20 -9373274384102757505 80934 5 1450060996463603 80936 1 -112511091749184 80937 20 519962889833847 80938 8 53379422092567 80949 5 6462117016186603816 80962 2 19743984637075 80964 13 519439405809312 80965 2 955855473128 80976 12 84348478895680 80976 6 -799132988851840 80982 5 189649778218947 80982 6 651736055717595 80990 16 -2802832751529 80997 19 -2475003789073585 80997 8 -757871754194681 81002 7 476993594255895 81025 4 -23127964803000 81037 1 22267846397225672 81042 5 -16971813770777 81046 4 -551580689650473 81054 18 -74854325766249 81054 4 2021066795688723 81055 6 1221319813832 81060 1 181150795625248 81060 2 -3454022447072 81070 1 -2230059357143997533 81070 12 -255921182652421 81070 16 1675476601911343 81070 17 120434547578103 81070 19 -258155658611081 81070 2 -160298382826455093 81075 14 160984288025000 81081 2 -2628970423410456 81081 5 4489981666344 81088 50 -283277630025216 81088 9 283277630025216 81090 14 -1550380394555648901 81090 18 157030394416299 81090 29 8939820338703 81090 30 23469058178703 81090 5 -125993194382709 81095 3 52962119843752 81102 5 -5735840201785 81104 9 -529446089651904 81114 13 60272093482008828031 81114 6 -163118942800729782101 81120 34 -1480850931682304 81120 49 1480850931682304 81130 2 6663847106393947 81130 8 104078448958483 81137 1 -8690864261365 81147 4 511167551912 81158 13 893154043150055 81158 7 7980393926987 81165 3 7001023918223961352 81165 5 -49309560980009 81168 29 68257488392000 81168 39 405403822086976 81168 67 40948454741898752 81168 71 -321477600564928 81174 11 -8504416970105849 81175 3 -15343200491625 81180 2 89871164737045632 81180 3 -2426521447900232064 81180 8 3927241009075392 81198 13 350259919659675 81198 16 20487527216883 81198 20 176872914662859 81198 8 -7715019288511917 81200 48 -191766915136000 81210 1 -107639728793 81213 6 -14716673300888 81225 34 -7847334662067000 81235 5 1495225404359 81252 4 949737094923456 81258 2 -18708324392825 81270 11 -1093981225000077 81270 19 -53431381549350477 81270 25 1442647301832462879 81270 37 178646388391071 81282 19 -1060518855493 81282 20 -22833932304648061 81282 37 -511424619567193 81282 4 -93663303930168677 81290 14 -474319871583348601 81290 3 -45744322336741 81294 1 -18722230142118821 81294 4 -5579902837 81300 15 222728440976000 81300 16 224547515443844000 81300 2 -7473753836000 81300 3 -7924713416000 81305 1 5823800944401672 81305 2 -166202107872408 81306 5 25225874523459 81306 6 -1011863908129437 81310 5 -615546255373633 81340 10 -9347956051704704 81340 14 -76467999355776 81340 9 -109549645107816382336 81354 3 3609643716379 81354 7 560649601885283 81360 35 6643378727051328 81360 41 422379715288896 81370 2 11224356740667 81378 10 -10264033719513 81396 11 9516198708864 81400 19 -3632240333800000 81400 7 -29057922670400 81430 3 60676765679378411 81438 12 -29910119582917 81438 13 670755986366795 81438 35 902029720987069703 81438 4 -103840538264981 81440 14 -18652108092416 81445 3 -1874398552417 81450 30 8341700568384375 81450 3 -308951872903125 81450 37 -8824634409416625 81466 10 -166472264587509 81466 14 -281228770976581 81466 25 495668976594751 81466 35 103084760242799 81466 39 1115440723316079 81468 8 -31857475233888 81471 1 728084131388752735 81480 13 36439520382656 81486 10 -9056142952785 81498 18 -13230362545260497 81498 20 -65000771184864821761 81498 24 315496482843671 81498 27 1241542735816607 81498 7 893966586100523 81510 10 -1338863810400557 81510 31 -27519822875917 81510 33 -14774749788218077 81510 37 -10851619308301 81510 41 -3838779858421 81510 42 341873854044731 81510 45 -2221595316901 81510 46 20522796842287 81510 47 -20389744552553 81510 5 195978195402787 81510 52 2835783199299727 81510 54 -6451073999676593 81510 55 235069642472887 81510 74 -190355241661489 81510 76 -41429920748634001 81522 21 2063091550239 81522 6 -114113930437856061 81529 3 -60063148905633 81530 1 -980355193225568307053 81534 4 -845266740137 81549 4 629576984350107 81550 25 -14073056070625 81550 26 -996974505225 81550 27 31799620254375 81550 4 -124621813153125 81558 12 -236224972562608989 81558 14 2421153243266427 81558 18 724882803183 81558 2 -19571835685941 81558 23 -3749003582192577 81558 26 1374272886401390295 81558 26 21473013963294423 81585 23 557491063610439 81585 24 -168249952721529 81586 9 90766755139245777063 81588 2 -31810381899616 81592 8 43674378466397333696 81600 131 5385410982080000 81600 135 97224555232000 81600 141 172991047836160 81600 14 43083287856640 81600 197 -5385410982080000 81600 214 -43083287856640 81600 250 21623880979520000 81600 54 -21623880979520000 81600 65 -97224555232000 81600 70 -172991047836160 81606 18 -208902966553 81606 4 -128138231773 81606 5 -610857448617277 81606 9 1148243377807 81627 5 -87744820787000 81630 12 -126245737486310769 81630 2 3408634912130390763 81639 1 -2148378414921 81654 2 90092527584355 81666 30 -91665222522849 81666 8 -4660260075363069 81675 11 108057954571875 81675 3 -366424684659000 81690 10 -33843488841770569669 81690 11 674211932012051 81690 18 -57442247739577 81702 10 -12211124572593 81720 21 234841918395744 81738 3 -697004183959749 81738 6 31057718401251 81738 9 18819112966913223 81753 3 2084768015912 81765 15 -3659657777469 81770 11 -2922741465979301 81770 21 -203802853232753 81770 3 4524728472764054963 81770 7 7168979402027 81774 19 -6871416428925 81774 25 -3482158142245077 81774 30 -61522185943989 81774 32 -241348011206323869 81774 35 -57619005754617 81774 43 -9956190605913 81774 48 21139534919007 81774 54 9564183597807 81774 55 -49100240587833 81774 64 2041079257746927 81786 3 208429462600111 81795 11 172988240243687 81795 17 -1529900462688184 81795 9 18245646791191 81810 10 -6573407397021 81810 22 -9389986945641 81810 29 -174192896611233 81816 1 -5008855264064 81830 14 -2679419914381 81830 27 -197832608754119353 81830 31 67856584802662938079 81830 37 231266217721141071 81830 41 38141105501359 81840 46 -1030611292352 81840 52 7224577961536 81840 67 -11694976646336 81840 69 -91466595011008 81840 71 -1578872930752 81840 73 764908044575552 81840 81 889277579335232 81840 91 12152724223540544 81850 3 -1868863303125 81855 19 253752540875098587 81855 20 12723852816648 81872 19 -476427738544064 81872 32 451659461389632 81880 2 -2077370455116448 81891 1 -22645347154776 81900 11 144808635600000 81900 23 -2207960135100000 81900 30 -430423885800000 81900 35 -17663681080800 81900 43 -1752324300000 81906 4 71388882989891 81906 7 56459939051555 81915 4 -107374808924261 81915 5 -1272502387873 81921 2 13491761326723 81926 11 145126360696663 81926 8 -30357194456421 81950 12 -3249027684125 81950 14 1525731819875 81950 29 -5231657112625 81950 7 -115688929965869125 81954 15 -239527871445105 81955 1 -700677357013 81970 3 -230769937413 81970 9 3526027909985118511 81975 2 17505519589000 81983 3 -57090792135185 81984 75 -1645679996416 81998 1 35968146897383 82005 14 3713174998856 82005 21 14963186025030536 82005 5 91768967550856 82005 7 723323888911 82008 10 -94150554306624 82015 4 63689317567759 82041 1 2268738819632467 82050 7 119261213052875 82059 1 -739686104 82062 12 -4131058737501 82082 10 224072740738575 82082 16 8593128379863 82110 13 -261855738297172349 82110 16 116742270954021859 82110 18 -8554812357869 82110 19 -9169535720197 82110 25 -133911327445813 82110 33 -68429939740793 82110 36 379266553548847 82110 3 -87256551489890957 82110 42 11742364713174983 82110 44 33923956560983 82110 46 -114399142832449 82110 47 826992352871 82110 5 -398320486538009237 82128 19 48252300074560 82128 32 1752193428198602624 82130 4 -277938167139754757 82140 5 -1550488717394144 82170 30 -181168556079501 82170 53 72829690771182399 82173 12 1679841136232 82173 9 405055806714755 82192 4 10007272248128 82194 10 -4168925438201 82194 11 -255253894444025 82202 3 26793601587271 82209 1 4404734275278197224 82212 1 -259241392736 82212 3 -1695389338756576 82215 3 23804129733903 82218 3 -12762385713629 82222 7 -1329847923944169 82236 8 331696041656608 82248 2 11836226427328 82275 6 384289254557000 82290 9 -14742526258673 82302 10 1243055822989643 82302 1 394858989887563 82302 19 -93305250953 82302 28 -43407430842846313 82302 8 47835514829771 82305 4 -6793016499657 82350 11 186636830308875 82350 1 -25980591952125 82350 41 701475982707375 82360 4 -2053676083758912 82362 20 -2585942803025 82362 22 -6855359278321 82362 9 -2360696729077 82365 14 -757445316688442629 82368 105 -63858306103617024 82368 15 -4169868498362880 82368 51 154156366315008 82368 57 63858306103617024 82368 6 154439574013440 82368 76 4169868498362880 82368 86 -154439574013440 82368 99 -154156366315008 82390 11 -3166773676849 82390 19 -9097652410001 82390 7 789890271765687 82401 9 48960593045314984 82410 10 -83156888524933 82410 14 194651051125571 82410 22 -78108765383897 82410 25 2129453301727 82410 34 -57267020370097 82410 36 -40346002826713 82410 37 -524923827193 82410 8 -48303315313813 82414 2 43819511676859 82418 15 -431544965425721 82418 20 -36677779905162529 82446 6 -300248483245957 82458 12 -3296187744417 82458 1 88997069099259 82467 18 -320008318413021 82467 2 74199563145855 82467 30 -150734612938077 82467 35 799544292073128 82476 3 -118887208442208 82478 4 48273681190887 82485 9 -958668119928 82488 6 171743669242496 82490 6 66319697619451 82503 1 -128110442082453 82516 1 -14380021118457568 82516 5 41924259820576 82530 39 -73048953012183513 82536 5 -26380808341568 82544 28 -4416758421844672 82544 29 35325702697536 82550 16 218411731658375 82554 1 2567815372403 82563 5 -5027960604565432 82563 6 9586457018891 82576 5 -9498285658304 82576 7 289674132265792 82590 3 -2688670358893 82602 10 -22759024316553 82602 2 630105855458139 82602 5 -167634433493541 82610 2 -3284651874573613 82610 8 44741752294879 82614 14 -6287047223653 82614 33 5133521815415 82614 4 2156457197712979 82626 1 -28575314726165 82650 11 59950373921875 82650 25 3061966507746875 82650 31 -39200406593725 82650 35 5318907727459375 82650 38 -14464452757625 82650 39 -20800567165625 82650 41 -4900050824215625 82650 52 24495732061975 82650 65 9461765477375 82650 71 2248545218942375 82650 72 -4723114379703625 82654 13 57572360621912583 82656 19 32967033510150144 82656 7 -32967033510150144 82680 1 -10410911709632 82680 13 -7449517800512 82695 2 -3990408623576 82698 9 -104750004270185 82719 4 442818330334051671 82746 18 -2092810741073793 82768 5 49706063067968 82770 15 3442377885299 82770 20 12704947955263 82770 9 107200035625139 82773 2 -126905318609688 82775 18 -294483864178125 82775 26 37146833396875 82775 32 -20432689358815000 82785 2 -742137862904 82786 10 950947312383 82786 1 -3461951013157 82786 3 -32365893778389 82786 6 820760963296679 82790 2 -14169065008177 82798 3 -30515498265745 82800 111 16953403492296000 82800 125 -329220503568000 82800 140 -135415299960000 82800 34 -52229137716000 82800 38 94802833117800000 82800 52 758422664942400 82800 61 1435074040584000 82800 94 188317542600000 82803 2 2394275881411 82810 1 253737900419003 82810 25 -14568970711399741 82810 30 72084980928779 82810 32 7864567130193352579 82810 34 -72916457605901 82810 42 -18749973824476713 82810 49 3579684629127607 82810 6 1439356221504747 82810 66 119548047227404159 82810 71 796666053315951 82812 4 12411148357664 82818 2 296367197979267 82824 15 -45836516272672 82824 8 5093257489715872 82830 17 -1325759225018077 82830 25 -139838621474537 82830 29 -448569406601 82841 2 -930368829464 82845 20 3327420056655966870024 82845 23 4924982130984 82845 7 -248225284514808 82850 21 -3136144425625 82860 5 -47061260672608 82866 5 -590214202633 82880 33 661186762063671808 82880 5 -661186762063671808 82894 4 2368292575375 82896 34 93349793192768 82902 8 13382520115607 82908 17 344289583016064 82908 21 -833372317139040 82914 1 -1261559637109 82915 1 -9698610813716033 82935 6 -5438510349302232 82940 2 -459091420926848 82950 1 -1367809128125 82950 13 1940307077465875 82950 22 -648862584986125 82950 37 -26412689705725 82950 44 -50583977375809625 82950 46 -3301586213215625 82950 49 1077241140113080375 82950 65 65846019746375 82950 68 3283431739670375 82950 69 8884895339375 82950 8 5148580319875 82960 8 178561243936576 82990 3 -284270247423973 82992 34 -27398495007008 82992 50 -23018218953920 82992 5 135293438544256 82996 2 2681585785376 83016 3 -103699054056209472 83022 8 2191208926989887 83034 13 -671632271092413 83049 3 -6943447501624 83050 13 -172375886513125 83050 14 -7582496778125 83050 24 -1379007092105 83050 4 982463311065112875 83056 4 17146048382301248 83070 14 -7952689105893 83070 17 4528369958787 83070 21 27316981455219 83070 37 -267175739571057 83070 40 29906560032471 83083 2 4643407375524072 83115 3 3347741647071 83116 1 34408320018624 83127 3 325906917956587 83130 16 -1141672671737 83130 26 -2837514972241 83142 11 -6021707544585 83148 11 -997649587129312 83148 7 3036455644012938368 83148 9 1382091781526144 83174 12 -29414775813697 83178 1 6445802342742579 83190 5 914664860659 83190 6 3614210571044611 83190 7 523988373305251 83190 9 -6929523480133 83202 11 -149006660591285 83202 16 695610294271235 83202 8 -6445232673173 83205 24 1724057748385704 83205 4 15587914659556887 83205 8 -577330172576181 83208 1 -10634822531648 83210 8 4921954671261599 83214 2 1087594062585939 83214 7 -29365039689820353 83215 5 -1043051469813 83226 6 -1896212439109 83226 8 6270079800707 83230 11 19305804162259 83230 17 96388146496918207 83230 22 -1116521761249 83230 24 -181109837437129 83230 25 -2591854752689 83230 3 -67050162594253 83235 6 -4861987908049 83262 3 15007600249507 83265 15 -18328529401489 83270 9 6762553722487 83280 13 -15877095065792 83280 17 110855475067456 83280 22 -2289512636864 83286 13 -1012207357881 83286 4 248416836583546611 83300 27 5808236187600000 83325 19 -220988368973125 83325 6 192394470817000 83330 10 -165091082493169 83330 4 -162815807852261 83334 11 -2235347058366307405 83334 13 15217931093363 83334 19 47218588250435 83334 27 -1084664453345 83334 34 -45231705460009 83334 5 -7565416495109 83340 3 31656763723392 83369 3 109947601262312 83370 11 1445829225947 83370 19 696909536191 83370 24 -648126131550409 83370 4 676680389012683 83370 7 -4379464889549 83382 10 25751072947029247 83391 12 -77347088346977 83391 2 -1245940244662616 83394 21 -335862524753361 83394 24 705527439532335 83402 1 -44009048627153 83414 3 36788155905411 83421 10 -5569345339416 83421 15 19968012382239 83421 16 1248338122344 83421 20 -1598727239712693 83421 23 -2574213370353 83430 18 3150782905671 83434 1 -2834581090342581 83440 17 131740493229568 83445 1 10000533152631000403 83448 12 -38731151024352 83448 16 2005776440070957504 83460 6 -279680526062144 83466 6 -15310331455833 83470 7 -20781975221109 83472 19 -649199673157312 83475 10 499675738437000 83475 13 720824700121875 83475 20 46248368043375 83475 2 45207556005375 83475 35 -2957388553125 83475 5 -1220604012145125 83475 8 -18506508831000 83490 13 153201061286531731 83490 15 -35612624757149 83490 16 221479171076251 83490 2 -295418648520413 83490 25 25492213646990673011 83490 29 -239936301384705541 83490 33 -1201794131989 83490 36 393202221180669703 83490 41 -739255687848161 83490 43 969692744701351 83490 44 -104467500223361 83490 45 -167644875500729 83490 47 -115102224858401 83490 52 96466487259439 83490 53 -279798558163289 83490 64 -19152677420729281 83490 68 -7350311763289 83490 8 -200319835917509 83502 1 14065359277851 83520 41 47278837804032 83520 45 -7310068411392 83530 2 -1080567281737 83538 23 9469570282047 83538 28 -29659139646417 83538 35 18348291401103 83538 41 -8757431954361 83544 6 2385353502705088 83545 8 -2550841687576 83550 8 -2180494956215125 83558 1 10522630588987 83562 13 1624846892717087 83562 2 -14868528496829 83562 4 3447638313139 83578 12 -1151250267337633 83578 6 1417738124989963 83582 10 231106411529875 83600 1 1136871486504000 83600 21 59711571692000 83600 40 -1521509083748000 83600 43 -2590540975512000 83600 45 -2087367626296000 83600 57 22851094902696000 83600 59 -142036659000000 83616 7 573274276926976 83616 8 -573274276926976 83620 1 -52296843367648 83622 1 56274056575003 83643 5 4854410866264066408 83643 6 40163063570371 83655 18 742491344047752 83655 24 4860417857799816 83655 32 185863363794157959 83657 3 -23629663412931960 83657 8 -1513494068248 83664 53 -2838302529243840 83664 57 55373505299812927296 83664 63 145555149932352 83678 7 -4200593273857 83694 3 464281645355 83706 6 -6338258408007665 83718 2 -7415435588661 83721 9 -3727359697240 83730 4 -980286467653 83732 2 154411901978752 83754 14 3243773959479 83754 3 423428011515 83754 5 -108816243654933 83763 1 -117029037381624 83776 18 11615867790848 83776 21 -11615867790848 83776 31 -13179630650217984 83776 8 13179630650217984 83790 104 63820200345929607986343 83790 111 15570843401317743 83790 114 -528030556242777 83790 126 -596957135046992433 83790 150 -186064724040611102001 83790 153 -7148209417262361 83790 16 -28908556018461 83790 23 3471342957087691203 83790 27 -174533493852837 83790 35 500209848284643 83790 39 -430484971304997 83790 47 -10953653723901 83790 52 -490122019777509 83790 56 -2606046690533565159909 83790 5 -757707997078053 83790 58 130150420337259 83790 59 59864988391523091 83790 6 -33202129280733 83790 66 -3128420708469 83790 67 -10120533402588021 83790 75 780531012498447 83790 83 880959049716879 83790 95 -526111497527553 83790 99 -33492381354653193 83793 9 -23747874359962168 83800 16 2649616488000 83806 2 -8903592381573 83810 15 -261782326535272821 83810 20 6197488314303007 83810 22 77786458176468007 83810 29 -886749575745393 83810 41 15832782042839 83819 1 -1360403904809809 83820 9 43248591081181216 83830 6 -48010677605137 83832 4 -22145207741504 83834 2 -121665812805946637 83844 2 116537220173952 83844 3 43001318448010368 83846 1 672163683731 83846 7 -12739948598043128393 83850 16 960427162347875 83850 20 152636779545875 83850 21 1520762741880875 83850 26 -399697720598125 83850 27 1162934999322875 83850 43 1415838015938317375 83850 46 156112743136375 83850 49 -30997303690625 83850 51 -8974301728625 83850 59 -330669040625 83850 62 -25985925914613625 83860 2 -1081250403510752 83874 4 5632796153228455 83878 2 -6789316726153 83885 1 -4397971013848 83886 11 1414356559245107 83886 12 11780278152241458851 83886 1 -2597380766045 83886 24 26855693842358663 83886 5 -9337341203045 83886 8 73264567441355 83898 7 -7597461111525 83904 10 -4808176623424 83910 8 1180399216971943 83925 24 -770174774415000 83925 5 -951609324164625 83930 4 -917703619029 83942 11 -14110650154019665 83958 2 316752673300883 83984 2 -46892679221758771648 83986 8 -34072803828663733 84006 13 -133462557992529 84006 15 128167652916783 84006 6 -123723618776109 84018 18 8334863048951 84018 2 -19090646549981 84018 8 19962878227595 84032 13 -469437751808 84042 13 108431414779303827 84042 1 -743852131348761189 84042 30 20084007546416552103 84042 35 -18943801685577 84042 36 97177267067175 84042 40 -96686129339073 84042 46 230048354327175 84042 49 320543304098247 84045 5 830729949256 84048 24 -30502603912384 84050 5 851181026721875 84075 4 -244774315907000 84075 9 15201809455375 84080 7 -2858830059791906496 84084 10 2696687091382816 84084 21 -40705264012672 84084 6 228770309891872 84099 1 905014185455944 84102 12 -16981379704006129 84126 1 -1488258311430869 84130 4 3769626064131 84130 6 6341581227223 84135 4 -8669554953749 84150 106 -18343850054625 84150 119 64111492659375 84150 125 -103462010852625 84150 128 -1163318502848625 84150 134 4282260117960375 84150 143 27048637284492375 84150 153 -62219591582625 84150 172 -535691043746465625 84150 18 44389808638875 84150 184 7682978445564375 84150 185 -3073794831320625 84150 20 -54725645854125 84150 43 -46093831228125 84150 50 716805994551784875 84150 85 -4285528349971725 84150 97 -1198524833249625 84162 15 -841246994570489 84162 17 -2727235749329 84162 2 13036390084983187 84168 8 99191054848320 84175 10 2342449207405000 84175 6 18739593659240 84189 1 9402950804059 84210 13 -1367477044597 84210 14 -648600959413 84210 4 -50990401946357 84210 8 533402679985867 84216 11 -995355047570752 84224 4 -15609979607552 84227 2 -10357426243341 84234 2 532428438995 84238 4 994127426459 84240 23 -103896229022208 84240 37 2805198183599616 84249 4 43338058243155 84255 4 -389604115947736 84258 4 -34815622769109 84266 7 3574451922487991 84270 10 35188524050058467 84270 12 -42664368915818317 84270 13 1263618336168034163 84270 17 856386085643 84270 19 -1806821305540021 84270 22 19560420070019 84270 26 -320692322182697 84270 29 -4721486928346889 84270 32 273986213780359 84270 36 127496191272272911 84270 6 -14479724953693421 84280 12 9633947730624 84294 14 -781332836829705 84300 10 -53582972300000 84315 10 607869792067112 84315 2 1063430356069747 84315 7 -39429370302328 84318 19 2658571769719 84318 29 -14533633447345 84318 4 700992806875219 84318 8 27808539186115 84318 9 -1405243501322597 84330 17 -3014406987777 84331 1 25371841371227 84336 12 62797222075456 84336 38 -285532078914496 84341 2 -856319430880952 84350 3 -99367427295624304125 84360 12 572653231257536 84360 22 -6315205880512 84360 23 232082216237888 84360 24 -57957408852544 84366 10 4391433148633227 84390 15 13651552885807 84390 17 67018840451983 84390 24 1216299621253823 84390 27 -162123452794729 84390 29 -5034768343899409 84390 8 50379697477891 84400 35 -186963264766008000 84400 51 -422699758200000 84405 2 -2779476822896237 84406 2 -816791066001 84410 3 387208327887 84417 6 665352005363 84422 20 4267358150743 84422 3 -50086871086429 84441 2 553524597683 84454 2 -17117612784757 84462 9 -21702428954137 84474 10 21041280299188683 84474 15 3493697540962923 84474 2 -256405654862037 84474 23 576485906493483 84474 25 -112346350630749 84474 28 -181325434758597 84474 31 -2043354582406125 84474 42 -568114568078094441 84490 15 -76365719897112073 84510 5 2951776592811 84525 21 -60939509687000 84525 41 -159824399707000 84525 73 438592898681000 84525 8 -150437364247583000 84525 9 545408351173000 84534 12 -3283685328800105 84534 3 -356402288645 84534 9 -405764318929553 84537 2 -85105618424938665 84537 4 3152059941664395 84540 1 -17829566533952 84546 10 -219678046232686975485 84546 15 -1017486036405 84546 26 -1036425777381 84546 2 -6201091758861 84546 44 -531663859161 84546 46 7508758598991 84546 5 -1004777437647213 84550 13 2204476248657275 84550 25 3373632970255 84552 3 -71552728442944 84552 4 44844839615168 84552 7 -14661529419023072 84560 1 -1942937725667392 84582 18 2442083982759 84582 5 37050609457467 84582 8 1237474993787883 84590 1 1574296609427 84590 5 -76426464084057 84590 8 442112085592290919 84594 10 -430143432533762509 84594 11 -1357540163297 84609 5 509914880126163 84609 7 4656250433115 84618 2 13561566172355547 84618 6 -502280228605761 84624 18 4349039847488 84624 24 -243838727635456 84624 26 63720775101824 84626 1 -1608047355005 84630 1 -195131908813770557 84630 24 -1720298838892717 84630 25 -144131855794597 84630 35 -21902377082221 84630 44 -29291409206513 84630 48 -626880608942489 84630 49 123313752875918431 84630 59 81266553277926718967 84630 60 -40174897366297 84630 7 9278090023145842963 84630 8 -3352836293569853 84654 3 -166671786645 84656 11 -887699731927744 84656 26 -62301690938304 84660 4 -1383012531316448 84660 6 -7933931768701025504 84669 1 22729776318847 84672 104 196620125635584 84678 11 -532879341128209 84678 9 -215345706784572025 84690 3 9244827061803 84694 3 -2051648077586201 84700 31 1217791369080000 84700 34 -958876783920000 84720 5 199868385003328 84735 2 -7091194305537 84735 3 2490726825063 84744 11 144438665513671296 84744 1 -9476127276192 84744 8 118237905448128 84770 14 -188070860277657 84770 4 35635779594107 84774 12 -353270624237137 84782 3 -5082580459025 84798 25 4452186476151 84798 6 -2328230737855413 84800 61 68973076800000 84825 12 31853500553455875 84825 25 -14559659662131000 84837 7 14715609794812808 84838 3 -678523777906013 84840 19 223175784371392 84840 26 5331331537531712 84846 11 66244387261879 84870 14 -14749003523709 84870 15 -68144406071229 84870 25 24829021102023 84870 3 -11733390807813 84870 36 -31529337745329 84870 9 2576500769691 84878 9 -1089459371885193 84882 1 -66336868162377413 84890 1 -3775616681517 84900 12 6491468600000 84909 7 -444125603091320 84912 33 -1336182332902336 84912 9 10514404417760 84916 2 -1518998396483456 84924 6 -7222324058496 84925 3 66308718608973000 84925 9 213696210977000 84930 23 -2828075219713 84930 4 -119235632223869 84942 26 -8885500314632469 84942 29 1122719902002171 84942 68 123204752774631 84942 76 329092604245647 84966 11 -104992940927227157 84966 15 -990881087011613 84966 2 -22629439053053 84966 24 13289238973110835 84966 29 4795942125261259 84966 43 2182310194748579 84966 49 -38744136947845 84966 55 5021050275076283 84966 58 224279349722603 84966 65 -1069573536529309 84966 6 -76927816954852829 84966 73 1699154374564423 84966 79 10420129449351559 84966 81 -59422048010297 84966 8 75367666199035 84966 92 -582809950475597089 84966 97 722574759143951 84993 1 1156927314227038120 84994 3 -835911241393509 84994 5 -978764928497 84995 2 -4382325388376 85002 3 -488573605179352781 85008 12 150972459042880 85008 13 30589066966240 85008 29 66505921622848 85008 35 -155405771600002496 85008 40 -20580435703959200 85008 48 -29893288469696 85030 11 32845393496494302111 85038 1 12308809420763 85050 15 85482502729875 85050 19 808023917023875 85050 32 -10476789328125 85050 45 166980401629875 85050 62 -42654776428125 85050 75 355704865806375 85050 76 189849973260375 85050 7 -9818719676164125 85070 2 -661382793416421 85086 3 -265258047159355509 85086 6 -1706226853725 85095 10 -38819302473190392 85100 2 424238396948000 85110 4 -52328988799757 85113 10 42847475802075 85136 1 386408949981760 85136 2 -29845515607674560 85140 13 331280195891328 85146 5 -2431740624661 85150 21 357478740450775 85150 26 7684383379375 85150 7 44684842556346875 85152 2 53169230320640 85152 4 -2836243911680 85152 5 -53169230320640 85162 11 348365430589813371 85162 17 -1084077465671781 85162 20 -29397953168170993 85162 21 2014299490315175 85162 5 -92153871831581 85162 7 116662407956451 85170 11 1347831131687 85170 2 -1207533470381 85176 23 23032509160413677184 85176 46 80175323416324032 85176 47 -158597848573632 85176 58 -4000975515740736 85182 5 -194481418326157 85190 5 670814370933839 85200 58 -65714708600000 85200 66 -15274800440000 85200 74 -12116425816000 85200 83 -71221195215642232000 85200 91 6509918272040000 85202 7 -6646331671641 85211 10 94430884243475528 85215 1 119719714057507 85215 11 -9266122082872 85215 6 8774932322359 85232 11 -3628216562326208 85238 2 -1386308508644989 85239 2 -3607176757919832 85239 4 133599139182216 85241 1 893384938862811 85254 5 1759451382755 85254 6 -878540465990465 85260 10 -13892386355421056 85260 15 33072925966140032 85260 20 717993493777952 85260 23 40502584126592 85266 5 -12624641183997 85270 1 5663702954107 85272 7 2991970244800 85296 6 -24683812950464 85306 2 2522712072627343 85312 27 -22201362228736 85320 3 -126676993585536 85330 11 66271494087 85330 8 16503784339491 85350 5 -4727861532125 85358 4 -12982481692371485 85360 11 -303525843897024 85365 2 27540172283990472 85365 5 -743584651667742744 85365 9 286183649785608 85386 10 -2863168761725 85386 20 6230646591621299 85386 2 -47555013290525 85386 29 395787380728067 85386 30 66042916696259 85386 34 -9721054800953 85386 36 -3530143384865 85386 37 -12164742554273 85386 5 -9961974057293 85395 1 368235221215528 85395 8 -29087017167206584 85400 7 -151600480100000 85410 14 -76974491344869 85410 17 -1070625364616673 85410 25 469732443717447 85410 31 9728104338711 85410 32 1770010547319 85410 34 -189430148961 85410 6 62439483378013340067 85422 12 -32197254042169 85422 4 -1885353316284133 85422 7 407179755410239 85425 6 -14504522363000 85434 4 -1122015041173 85434 7 2652306389263 85440 8 -166540523342336 85450 2 985113835640875 85455 2 4135750959607272 85455 5 -111665275909396344 85456 9 -168447366229184 85470 1 26962547010753187 85470 13 -301376332781 85470 15 -12161815740269 85470 24 2823359449931 85470 32 2265815566783 85470 35 1034481954871 85470 38 -300129260827481 85470 43 -2750608443417841 85470 7 -5871957125453 85470 9 481141508203 85475 16 -6151127790266200 85475 2 -768890973783275000 85488 17 -368108176071104 85514 16 5000551532079831 85520 4 3043816379519552 85540 14 327732875680384 85550 15 -113989099493925 85550 26 -14248637436740625 85550 4 -71452981640485125 85554 17 -655624600266069 85554 20 2796688685821275 85554 8 23560087879145979 85560 13 25950632974651072 85575 2 2090581597000 85595 1 -163002729493 85602 6 -169113294508291145 85608 15 1932285627421920 85608 4 -71566134348960 85620 3 -67767100574048 85624 3 -110675300026752 85626 13 -2900640022327321137 85650 7 412701818536034875 85680 102 57601793521728 85680 110 -206993704125888 85680 120 -4313092654368 85680 12 -493677545620608 85680 128 -5968515851905536 85680 148 -2440714997393856 85680 35 14262708490848 85680 44 -70871402484321984 85680 55 8253637187789664 85680 77 -32968699660270368 85680 82 -95038575777216 85680 85 1221062950380384 85680 89 -6675481695168 85680 90 64110278643552 85680 9 -46960740420914592 85686 2 -1388553970141 85690 14 -3190050136161 85690 3 174648251912465123 85696 17 53378786166272 85696 31 830904826807808 85696 39 -53378786166272 85696 54 -830904826807808 85698 19 19915178439879 85701 11 534750376560715 85701 17 -28617227453773 85701 24 -183419379160325245 85714 7 6016087960788815 85715 1 -2630059059032 85715 5 32834156854339 85722 11 17902388742659 85722 12 2150388988549657955 85722 15 -1350825301179735445 85722 8 14007647052151507 85725 10 -151686686755125 85734 23 -572299958906289 85766 3 -115639554575717 85778 3 -46610347422465 85782 10 -4330714995465589 85785 21 -1495594586663416 85785 23 -9733378063949278264 85785 7 16159321724741405659 85794 1 143672505701845067 85800 16 -772878442760000 85800 23 -966763827496000 85800 46 -90473454512000 85800 61 106677140140000 85806 2 4750625908251 85809 1 -39041385464440 85810 3 257199139927 85824 10 198799899028992 85824 2 -5367597273782784 85824 35 5367597273782784 85824 39 -198799899028992 85830 13 6526678836945550679 85833 10 373661896880808 85833 5 -10088871215781816 85848 20 71359496202176 85848 5 552774558994336 85850 14 1162576786453168375 85850 22 2152334892375 85878 4 21629587576995 85878 7 13093106573403 85890 1 50811547370830723 85904 23 500675501551168 85904 9 -458917171929728 85905 2 43925471900523 85905 4 217150288708527 85918 12 -3168680062662829 85918 18 10035827095520323 85918 20 -205740284281029 85918 23 -16960364469469 85918 28 -342738868435281009 85918 39 -31319281857977 85932 14 -1375368423565536 85932 22 -20022174456192 85932 26 1430470589313903264 85932 28 107008109647776 85932 30 -1732749069185856 85932 35 18733152954816 85932 8 50939571243168 85950 15 -882625043053125 85950 19 199855679146875 85950 45 31851146706861375 85950 51 43887665271375 85956 2 3280390716977229952 85970 2 -3288352686021 85970 3 -72383239493433 85974 10 3388124838995 85974 31 -1901042192449 86002 1 372306136720168323 86010 11 -195808156586317 86010 12 -209755047493 86010 17 42428534722451 86010 20 6583511551303 86010 22 -17214616569977 86010 29 2429574644719 86010 35 990850079879 86010 36 34182405065519 86037 5 10903527864872 86040 2 -19215815274432 86050 17 -16202362675625 86058 17 -39126105329864265 86058 18 1751351863357431 86058 2 -23212117487133 86058 4 -32470396840864989 86070 5 -525531874979357 86070 8 5646236012171 86082 1 -770393340378989 86082 4 37349899168355 86082 6 4612563985043215 86086 11 -69018767858097 86086 12 9815056274746295 86100 23 3674355579152000 86100 29 26146034898488000 86100 43 2576959303220000 86106 3 -2283454501525 86108 1 51383390787712 86112 37 -154077260382720 86112 44 154077260382720 86130 20 2681791620687 86142 18 -49173819698465 86142 30 16866620156573495 86142 7 328621201413659 86142 8 144587519337779 86151 4 2823497431833079 86154 5 616689314567 86160 11 48511518134336 86160 24 100387733339139904 86163 1 63249952754143 86178 1 -2158885633854061 86178 2 -12026537853713 86184 12 -65403350004096 86184 3 1765890450110592 86190 24 -389480770400293 86190 27 -42225813179173 86190 39 -2135077318112869 86190 41 218852818123303 86190 47 35466938633247823 86190 5 11069284569231187 86190 68 -634798460886159817 86190 79 -19129924067761 86202 15 -8596925201889 86208 16 739969933998592 86208 8 -739969933998592 86226 5 -2043450295963973 86229 6 -66781720164024 86242 8 -31922849298254589 86247 8 1832558341603989672 86254 1 2083031099521667 86262 7 32461533382015 86268 10 -415098028864 86268 3 74425161853216 86274 3 5611747728123 86275 17 -16616751075000 86275 9 93729897269000 86280 2 965366098841728 86295 8 -2314959150808 86310 13 4028449299867 86310 16 2987964080667 86310 20 19867169880850347 86310 2 -183950969712453 86310 32 4864816071459 86310 38 1335962966983371 86310 4 -23074842573 86310 46 -76586619151377 86310 49 -14492058846050673 86310 57 -318054005554957503201 86310 58 4949724266139591 86310 60 -62921277515601 86310 7 14393743676523 86320 25 42984182799936 86320 34 -298342000268064 86320 9 -2529471415570624 86328 6 3373222755091392 86328 7 37963150609536 86346 2 -5085511439445 86350 11 -17560147129945609625 86350 5 -670796873721125 86352 11 44418205972288 86352 19 -39933579135075560864 86352 21 34949926508608 86352 34 -12936964473280 86362 1 16745266733211 86370 7 26316201220831 86370 8 -36972257634793 86380 7 -100192010846528096 86394 13 -1789130038949 86394 15 69917042446075 86394 23 -1324376293141 86394 24 -191571942341989 86394 26 -23968826618869 86394 27 92759645631059 86394 31 -46176996023002405 86394 32 -62973756164341 86394 38 1682275376457775 86394 40 33849127932103 86394 42 -1709708398734545 86394 44 -2744586660282137 86394 49 -57929412106313 86394 64 83818069454737871 86394 8 -17451975559733 86403 2 1302232293899 86415 4 -2696379600284948017 86430 12 -3254547165877 86430 19 -17358630776749 86430 25 -187216542383630921 86432 1 -8371139097600 86434 1 652844210427 86434 4 1625852094293619 86445 12 -265406400158121 86450 1 20821496380875 86450 17 -1277225703125 86450 23 1127758127358346875 86450 41 9022065018866775 86450 46 -28715143990625 86464 16 -19212952598576640 86464 2 19212952598576640 86478 15 -2050898660549605 86478 19 -2019755935457 86478 21 -8819565727924729 86478 23 -1313569424866198753 86478 5 53840153146793635 86478 6 -9178722243125 86485 3 -418871493853848 86490 13 794027916346131 86490 1 -547202562148053 86490 22 503918778354147 86490 23 28033142377598307 86490 26 -71651588271309 86490 30 72446673228580539 86490 35 -3365549402865381 86490 4 10163273270786777259 86490 44 -376417528547658417 86490 46 6392530942988463 86490 53 -29408441346153 86490 6 -236760405295869 86490 66 -9297796195502229969 86490 69 -160129683910089 86490 8 -341152471242549 86526 11 -2042820704565 86526 17 -989827404516585 86526 18 395414719767 86526 26 1600349535567 86526 27 2057550025282839 86550 1 -32512168854125 86550 14 43784565673375 86570 2 -105868801133 86583 16 3676753370250415 86583 22 -17796845175256 86583 29 -30778239193912 86592 15 -173591828656640 86592 42 16449061211648 86592 44 -5098063536257536 86592 52 -16449061211648 86592 55 -262048399009275392 86592 56 5098063536257536 86592 74 173591828656640 86592 97 262048399009275392 86595 2 7860252799144 86598 15 60061489858362303 86598 17 6016967993367 86610 3 263602874896883 86614 3 -9295209753597 86618 2 129631437634735 86632 18 58318085572535587456 86632 19 -2534002387587750464 86632 9 10731855046528448 86640 101 38185541787104 86640 107 279966176104256 86640 16 590032760499136 86640 4 -552095921223296 86640 5 10062017318664064 86640 56 -5869303154196128 86640 82 849876411968 86640 94 -613044196725952 86645 2 -87081873118417 86646 1 -990673863605 86650 4 19331681136875 86652 8 -206224213680864 86658 14 49964885284211 86658 8 1263742010979499 86700 29 -59708029981852000 86718 11 30314582842276943 86718 8 -4049837779825 86730 10 254437060324699 86730 1 198574540836427 86730 13 35816372775379 86730 15 1974352849651 86730 16 -61806485620061 86730 21 -438265896857511420509 86730 30 1277743139526272363 86730 31 -12285015861954997 86730 36 -29822311215833941 86730 47 557755528823983 86730 48 598398185491183 86730 51 -982549663751537 86730 53 -15100466279633 86735 3 -8846846129368 86736 11 69862969351928800 86736 21 5738964971560768 86736 35 12707653787360 86742 9 -267573614781652137 86760 20 -34653638983392 86760 25 -74501997645888 86760 5 6231979057848768 86775 22 6644787137000 86775 26 7800231609665000 86800 25 16159630528000 86800 30 53344978056000 86800 37 -185239247466456000 86800 8 -1467320117264000 86802 10 -648659536344269 86802 1 18693543511243 86802 20 -176656967733473 86802 23 -179371298639507545 86802 26 -739355443129 86802 28 167628608505935 86802 3 -72440566876277 86811 4 1568232687815 86814 22 -3918669605397 86814 30 2114948191959 86814 33 542600053640919 86814 8 29380014787509923139 86814 9 -1867701431133 86835 5 10954125111249179 86838 5 90189602515 86840 1 -20236662402624 86842 2 -134218009575469 86848 10 -24399189453312 86848 15 24399189453312 86850 11 -8228620833525 86850 34 -1028577604190625 86850 46 28052802390375 86856 2 148763265969088 86856 8 12477740820544 86862 1 6244815567259 86868 13 -742206619141344 86870 2 16311373211547 86878 7 -538514073599735673 86895 1 -3873354490940472 86898 1 1238222187850983427 86898 12 -2695123119457 86898 2 3026830383235 86900 9 -2188051506506664000 86925 10 3112606600238375 86930 2 1104918490831751 86940 19 -41222782922112 86946 2 56663592048883 86950 11 -21749839018525 86950 21 -2718729877315625 86955 4 -7413962521913 86961 3 -953738288504 86970 3 -28164183176917 86970 5 -2198503596853 86975 13 -398861051687000 86975 19 -61796966473459000 86975 20 180166083013000 86975 24 109286479925000 86976 14 1183412709913093632 86976 66 -1183412709913093632 86982 10 -14197373698285 86982 19 5823872128871 86982 5 -10243991619989 86982 6 89100658136771 86989 2 -1322598642399873 86994 5 -1150139763621 87010 12 -400587610714658109 87010 2 -4156271464583573 87010 5 -234324273653 87010 9 -380825834661 87020 2 570608519850318464 87024 44 -1105809490616768 87024 59 -103231234715840 87024 67 -29414601390938624 87024 74 -30944384725184 87024 76 -568305658692800 87024 86 493849727411264 87024 88 -12705433583818528 87030 2 -78580356401637 87038 2 -19781329869405 87050 2 -1584498177125 87057 3 16350618913128 87058 1 -3736222809733 87066 7 720184526042283 87087 7 -9726088337848 87090 5 -479183307940981 87090 7 -3084895351241 87100 9 -36458624319372000 87115 7 8326458021736 87115 8 79943492371215304 87120 124 36573668514580032 87120 147 -280827939674304 87120 164 5838981423967296 87120 38 -424093103942112 87150 14 4005606575507300875 87150 3 1226352100805875 87150 34 -38224943876125 87150 37 -84990246374125 87150 44 6073492553675 87150 59 759186569209375 87150 65 -34822323294625 87150 72 -1248637926544642383625 87165 9 -331248572328357 87172 2 -16572671086976 87178 4 36494131768219 87186 10 2208984116489207 87195 10 2835093662603 87210 11 1314285260913819 87210 12 2579495934339 87210 20 34557295898403 87210 23 -148100083319337950277 87210 34 -48677231885697 87210 35 -69646390227153 87210 52 -933046989256881 87210 53 62438360111271 87210 55 5485188271086590751 87210 58 740408551839 87232 11 -28026600611328 87232 3 28026600611328 87234 10 587953086663925135 87234 3 8572948863011 87234 8 -103575981028237145 87248 18 -1097858882246145984 87248 19 30277238717112734528 87248 21 68880851433792 87248 25 11591212463424 87255 12 132867168808316328 87261 1 -857197373669 87270 4 358317859188887 87282 4 -41992740470565 87285 18 1106508556391048 87285 4 330838482821032 87285 7 639005627365192 87290 5 178133492223 87312 21 842001245813312 87318 13 39469441962195 87318 19 -348016465220229477 87318 32 -54201771243837 87318 45 12889498711860351 87318 57 2454274995543 87318 59 1463447823583599 87318 63 -1065674932979265 87330 19 1110784096813617287 87330 21 -15311200639321 87330 4 -12301411111453 87330 5 -5822837627653 87330 6 291447101122379 87330 7 -8295598221301 87330 9 -8047407656819701 87348 1 41717173760128 87350 8 168129761484375 87354 12 -47399249266281 87360 10 596729415941632 87360 116 306581686778368 87360 132 -8426031533010944 87360 138 17935490930176 87360 142 52701606816256 87360 146 147411465900544 87360 165 -596729415941632 87360 179 -24307990511104 87360 187 8426031533010944 87360 190 -17935490930176 87360 193 278701057852434944 87360 26 -278701057852434944 87360 32 -2331822415616 87360 38 24307990511104 87360 56 -8092768642048 87360 71 -306581686778368 87360 76 -52701606816256 87360 84 -147411465900544 87362 23 -18250998492969 87362 28 52244742052122895 87363 3 10736195935990451112 87370 5 -41616112505913 87381 9 -10668927183993 87390 11 -2265848822709 87390 26 21216236727879 87390 28 14335745703471 87390 7 -1702242031293 87402 11 -5309528652665 87402 17 4748669766326303 87402 3 -417824943955397 87402 9 -1363614258565 87423 3 -25267171561309 87435 6 -7872422055669 87438 2 -1356080847389 87438 7 -549094188417605 87450 2 -18531608553125 87450 29 -96028134527125 87450 34 -3160740434832325 87450 36 109119757252375 87450 45 -9865428556625 87450 52 -395092554354040625 87450 61 -5149486194837625 87450 7 -83687332266125 87464 6 524947086235584 87468 1 1055556191872 87474 1 3154892910787 87482 2 51624407996623 87483 5 154262016205352 87493 1 88743372949279 87493 3 -7794061652917 87494 1 24587294028443 87510 3 1138890853567 87514 25 -46617348784265 87516 6 72907127296704 87520 1 -82951523711488 87520 6 82951523711488 87522 2 147256938806023 87525 12 -70677834758857125 87525 15 18009494535375 87525 17 8916921286677000 87525 25 15255887416032285000 87525 9 122047099328258280 87526 1 241505883251 87526 5 578930811124959 87528 5 162856793938112 87531 3 -81323841427768 87532 1 6285829149389440 87535 2 -1055782912113 87538 11 -55997129368009 87540 3 88800849801856 87549 4 -1012770100626488 87550 11 314551135075375 87550 9 -4037378036625 87555 1 1458737790408712 87565 1 42316891992343 87570 1 -494282059893 87570 20 -172815692620941 87570 23 -1033064862452937 87570 38 -40470328173831672969 87582 15 -12023166599137 87582 5 14894996888025467 87591 3 -5999796606392 87600 29 -7093861496000 87600 41 3447599752000 87600 57 -4279713716800000 87600 58 -402976890424000 87606 10 14969235651399 87606 12 5224518842247 87606 3 -599325132712968693 87609 2 -1003646625911992 87618 4 -120164546986885 87630 18 85159813391 87630 2 2408089453579 87630 4 -565870611707173 87636 5 51924257252000 87653 2 5285278204765064 87654 1 604906255603 87655 1 -1978554290777 87666 10 -34927098404869 87666 14 2522937025207 87666 19 -999499340665 87666 3 30393707105325691 87670 8 -8618118887897 87672 1 8989812079552 87674 2 -7385909132953 87675 1 492390994717000 87681 1 1330821740375 87685 2 28832835608559 87690 13 102812525146979 87690 18 711337648303 87690 20 -2446948255343921 87690 24 -8856876403849225769 87690 26 -209171024819369 87690 3 18454785405504194179 87690 4 -29637888488621 87694 3 -1466470666493 87696 11 -30960788303808 87710 10 839023542787553011 87710 19 19104315232807 87710 26 -998060571679662729 87710 4 -1743450046345133 87710 6 -2446132777806277 87714 3 -2203897087503433845 87720 7 -1695703663936 87725 18 18632547909613000 87744 20 5890111343687168 87744 34 -5890111343687168 87745 2 -10134550438424 87770 13 17173595183000942951 87770 4 -2083165564509 87780 11 -13121843070176 87810 10 33678013098007 87822 15 -3034776336344397 87822 31 -10872890176833 87822 32 -11989086092577 87822 3 7022688192171 87822 38 25239118402406511 87822 48 49923553326471 87822 8 240821780037147 87840 39 4385184794496 87843 3 205512533378783 87849 3 2059930537416 87850 3 27978219177875 87870 14 -525257835661 87870 17 351934291207 87870 23 94122120128543 87870 9 -207626047677253 87890 11 -981127904033169 87894 26 2318361228835119 87894 30 -61697081264193 87894 4 -90159359122917 87906 12 100638305179307 87906 23 64894253160079 87906 27 -25912173486185 87906 35 -49546364183334305 87906 36 -10162579159263601 87906 37 16994402914883666615 87906 40 -55975109657761 87906 41 -131195201710321 87906 42 -64338834453060097 87906 6 2201610049495507 87906 9 181852821991099 87912 11 12712639929408 87912 17 3229949122748367552 87912 8 -87208626314205923904 87920 27 -1359362499776 87934 5 -153415358563573 87945 19 4100752567592 87945 2 3442877146567 87945 3 347808696050564488 87952 16 -122542626059200 87962 1 58124639932821827 87970 1 -808969357 87970 2 -7695463617253 87970 7 -86197510087713 87978 1 2871379 87978 3 -8013786630029 87978 5 -5304579856271297 87978 9 -31470360025657031441 87984 48 1328208911945280 87986 3 55729330878735 87990 18 236284583294087 87990 19 5648235163703 88026 1 -2435753659589 88026 7 -133397471075633 88026 9 492477015167 88032 1 -242148355546112 88032 7 242148355546112 88050 15 47131542532770875 88050 23 -130652635405625 88050 29 -125863828404625 88055 1 172660580731 88060 2 5312610061984 88075 4 182647104675875 88077 2 13364090271667 88080 11 -1489529583560096 88088 26 -98061355151334784 88095 6 -26429570488189 88095 7 159541701479 88102 11 -244809514618417 88107 2 20576283918947 88110 11 -2469160744427493 88110 13 354553764317307 88110 18 -213744064612797 88110 19 -7390512733118090013 88110 27 691825759421571 88110 29 -1515803994837981 88110 32 -23530636163703429 88110 33 -3294944387000829 88110 35 53519324184891 88110 36 56276806272939 88110 55 -320496136440417 88110 63 -8788154951529 88110 69 -2188688734577889 88116 2 71630817100928 88134 4 -9832275813077 88134 9 -9214097840210121589 88146 9 310485223890595550079 88150 10 34714337636631375 88150 12 -10709544366484907625 88165 1 -159800438421289 88170 2 -101227354835093 88176 18 3425962059408448 88179 10 179482103117351 88198 6 -81909918108393345 88200 101 -58904494556040000 88200 11 -155702364542424000 88200 118 5766754242312000 88200 127 395124269400000 88200 144 9313825262616000 88200 205 7862865533460000 88200 214 737747929800000 88200 52 1802538406116000 88200 58 -8652420275184000 88206 10 2554078295015 88206 11 -38075898264625 88218 13 -24351663491036973 88218 14 -168204482975061 88218 23 -66671959903965 88230 12 -83955891051521 88230 15 -30020726297233 88242 11 -29122662593989 88242 17 -576289190646003997 88242 24 181921617611 88242 26 -2049915447181097 88242 31 5884295440519 88242 33 489985025853511 88256 11 99086666227375616 88256 20 -99086666227375616 88270 12 1954453643563303 88270 16 -98460805876217 88270 21 -49360781504232801 88270 7 137533423659731 88275 11 -195386877935000 88298 8 -17064271066717 88305 10 -88686163823741 88305 18 -29827944475611157 88305 2 -1396537161459992 88305 8 5104967591691199 88308 4 741659516942976 88310 8 -1891173376881 88312 4 7151066610624 88314 6 367887294669779 88326 4 10077665061114099 88330 20 2660233226607 88330 2 -1046956168305333 88330 21 3672389518138143 88335 15 47717170805448 88335 16 24919609194584424 88350 10 21742076522870875 88350 11 -71974490355125 88350 12 17325508472875 88350 27 546375689475875 88350 31 -145219491128125 88350 3 -439982735375285 88350 35 977764697358875 88350 4 169224539228875 88350 43 -131755222748125 88350 48 -137728149115625 88350 49 -16749112373158625 88350 70 1163616263759375 88350 73 -54997841921910625 88360 2 -76470832271299968 88366 1 -2270793699125 88374 12 -4645759812569 88374 12 -4645759812569 88374 20 1651500461807 88374 21 -1018617086521 88374 4 -30003339704957 88374 8 -42030920143504189 88404 2 -3150701138816 88410 5 -9520980015581 88440 1 29259449476768 88445 20 -375887457336888 88445 22 -778906597360248 88445 38 -34832421162441 88450 10 -38542910372186625 88450 21 339066809484175 88450 6 42383351185521875 88470 12 1109199779933139 88470 17 -2839523982746229 88470 4 -68662575167661 88470 9 6269705441307 88473 1 185960589057755 88486 4 -3473999542385 88502 12 1057368668671 88530 13 23584990739619347 88530 1 57213261299683 88530 26 -1372500074321 88530 8 -3919667001749 88536 21 -473749746611392 88550 1 422638269353875 88554 3 691141491020591 88557 5 -790656104440 88560 8 1787916747897216 88566 3 -1560565308293 88578 17 4681088598843 88578 22 319708504369827 88578 23 27491615503983 88578 31 -74303766655929 88578 32 37610590131927 88578 6 109068693480027 88582 9 -498317487296365953 88605 10 1541036755546659 88634 1 5900656625011 88634 3 -67219203168629 88635 1 10636493843939203 88635 2 -62470783987928 88638 2 -4398678734117741 88638 7 8252689123187 88640 19 -88556756848128 88641 20 361869552938439 88649 1 -32998019751352 88650 13 44865976493095875 88650 38 -2918322013658625 88650 40 203697014061375 88688 11 -352013097268160 88689 2 1547136678223 88690 12 -2556561959935613 88690 22 368233759589059 88690 28 387671639364863 88690 33 -10443988625833 88690 38 75626934598999 88690 40 -3936536890097049 88690 9 49873837176387 88695 2 13618297031931 88714 1 -2921759275629681 88722 21 -2094092648217 88725 12 1667646683135875 88725 2 -217228311287000 88725 23 -1365494983775000 88725 31 -31635406278125 88725 62 302497601631875 88740 13 797185957283699616 88746 3 -78252845453 88752 22 -2184935917404608 88752 24 -15684392922524864 88770 18 14538585785717791 88770 7 -34891451570269 88774 1 11425194378667 88788 6 -10397228674762720 88790 2 54208785056139 88800 44 5616817185016000 88800 64 -434820307744000 88800 65 -5616817185016000 88806 12 -17836278962365 88806 20 127197908629487 88806 8 -41305055585525 88816 11 11161787761216 88818 13 -1292311026248642605 88818 18 106935383116204039 88818 23 84697452701855 88825 15 -501541951011304095000 88825 8 -4012335608090432760 88830 11 136972529700147 88830 28 -5073056655561 88842 12 298663603770511 88842 2 -3355541865629 88842 6 844466960771 88863 1 -2146893422552 88863 3 2025746703784 88872 22 -568713548136896 88872 23 117194169121856 88881 1 44165376151775 88890 7 7996999879999 88890 8 54418449427039 88894 7 -66792599388541 88900 7 -471930827696000 88902 23 -27512840217969 88911 8 52453563161931 88914 5 -8474358481597 88920 22 11247434100561703968 88920 27 5877509202978912 88920 6 -416571633354137184 88935 19 -150297686903672 88935 26 470876977874611 88935 44 314278143981263 88935 49 77237162353736 88935 51 -3757812453725176 88944 11 114365914791488 88944 5 -70248160956608 88944 8 40236022313958464 88944 9 8622885325684544 88950 1 28300646312875 88950 15 11080021853281375 88950 21 1654684213375 88959 2 731021613256 88970 10 353327172659 88970 17 -829905648993 88990 2 605654897018147 88990 4 6902328839939 88998 14 -16302910750309 88998 15 20638614428368399 88998 5 3340632611874967291 89010 13 -4028221837773 89010 37 -66778008390513 89010 45 1054837162059831 89010 51 -23295673135089 89010 52 1018166346711 89010 6 -1324545198741 89012 7 -9255141995750496 89012 8 103787275770144 89012 9 -1875541316602176 89024 17 -5310202176548352 89024 3 5310202176548352 89034 13 -189044046161 89034 6 -614536687837 89040 12 4829998083414848 89040 3 -269033683226048 89040 33 -762098449706432 89040 40 -23050490964416 89040 59 20944201122368 89040 61 -32596537261405888 89040 6 -487294627904288 89040 65 21816641459253824 89046 6 3787804803627 89055 5 -1140454883169 89055 9 -19906096472181 89056 11 -70312401545408 89056 12 70312401545408 89063 1 -110729991106540117 89082 9 521706467037483 89089 2 -91518726721157 89096 12 8816889866688 89096 9 320221958607424 89110 18 891408392110711 89110 4 -5043153105397 89121 2 4085390268071 89133 2 4046216700392 89134 4 -458066494029986937 89145 7 120907447103043 89152 14 7463212142336 89166 14 -4339180795346209 89166 15 -138112253697097 89166 2 -28330576522093 89166 4 127484409779 89166 7 -6285715221493 89166 9 -127506119581 89175 4 -4022704941425 89175 5 -502838117678125 89182 6 16386257443879 89194 2 -332721537614173 89194 3 135047482787195 89208 12 35635866003648 89217 1 -33496624135224 89232 24 -21129073959968 89232 34 649521752359475008 89232 43 1567970077750336 89240 2 7607650532890816 89268 1 -2273054759252864 89271 8 121541333140863 89280 122 -159795631301303808 89280 125 -16172731565568 89280 14 -109864584700416 89280 141 -7340068744704 89280 156 150785309293056 89280 28 159795631301303808 89280 64 -150785309293056 89280 91 13646480251392 89280 9 -13646480251392 89280 95 -9404441335296 89280 97 109864584700416 89298 12 504271622944683 89298 15 -64239735947013 89298 20 3654592372797795 89298 35 -357830291606420061 89298 68 1154550610865223 89301 2 -906156935936801 89310 14 -37103662483289 89310 17 -861741092794056337 89318 13 -1046354221302209 89318 7 784602345809400887035 89320 14 197725246963264 89320 5 4072915927158112 89334 11 11436431233347 89334 13 -9690091588701 89334 31 -4659033701601 89334 33 776844668165679 89334 35 155962608197103 89334 39 4536803867679 89334 8 5530224735099 89337 2 50806014479351407 89338 9 1846819357839 89355 17 -1135961603029 89370 10 -14572134580617 89370 1 -93260379624453 89376 13 -14049575854128640 89376 18 -40960862548480 89376 21 6444057461287040 89376 3 14049575854128640 89376 56 -6444057461287040 89376 66 -47235578295808 89385 4 -3240225726904 89392 4 -50786241689024 89400 50 358874718200000 89408 19 -4544932290707456 89408 24 4544932290707456 89415 3 190437511973832 89418 5 73671984059435 89425 17 -4213106387000 89425 20 1076803632513000 89430 9 -5313648178513 89466 17 -68719248887117113 89466 9 -9729313447933 89478 6 -12185875418481 89488 5 -197445218521536 89490 4 356705349855220003627 89496 13 -6224377925952 89505 2 -265946358338712 89505 5 -102548904154776 89520 25 -18045332369344 89525 5 -49813788179246625 89526 4 -447712641745591913 89526 5 -9843911433953 89526 8 -706292575993 89530 8 27169142117725567 89540 12 -873035475298624 89540 6 45268857963648 89550 1 -1108813465125 89550 27 -1283661543763125 89550 67 -1726969175015625 89562 17 -44972606158217 89562 23 -65541057223393 89562 25 4031149071671 89562 3 44579518683692563 89570 2 16033066448446827 89570 22 8728020354144663 89570 27 7297708897791 89590 3 293710258173043 89590 6 2801096165630771 89590 9 389013438062259 89610 10 338495279651 89610 15 19354755131583047 89610 3 458557638899923 89614 3 -901366890085297 89622 6 10487219176539 89622 9 -1231674491601 89640 32 -21686047071793056 89640 34 4291909259616 89640 7 803186928584928 89650 10 -3230806213125 89656 3 3493678575942080 89661 12 94338486743435 89661 18 66409338120488 89661 7 148262770687240 89670 11 -264716944297757 89670 24 90797911894130651 89670 25 47680664658439211 89670 27 73654681483474091 89670 30 -2841077925939421 89670 4 -16354467977844649373 89670 46 -7771707645569 89670 47 -104787423468161 89670 51 -74820906227848753 89670 54 836457295555007 89670 60 49065409038023 89670 63 -1870621851889 89670 66 -962877697201 89683 2 10063037941487 89688 9 533718472522688 89698 1 -4646271090788389 89698 3 554676889843 89700 20 -12773982376000 89712 29 20081927312884800 89726 10 -67162779331612145 89726 12 1084788780895 89726 6 -338919441593090149 89730 8 6830605935303183 89745 1 -4654541665071512 89745 9 2147391520712 89754 11 -3985891270453 89760 12 -1523517792694784 89760 15 172676030616064 89760 1 8483766301548928 89760 27 1523517792694784 89760 50 -8483766301548928 89775 2 14206270772520 89775 43 -755273420418483000 89775 55 83663701922277000 89775 58 -3098655626751000 89775 6 27973089645129000 89775 68 1775783846565000 89782 14 -340653183752581029 89782 15 -11581372985589 89782 26 15414807443818959 89782 5 52306129566251 89790 16 437240368423 89790 17 -445330169729137313 89790 23 -557508066409 89792 14 4809479763456 89792 2 -261134350612992 89832 3 -6421198518656 89835 2 -16419615604568 89838 11 -12739988577872781 89838 15 -24746623602273 89838 19 -58445717122980081 89838 20 430625329383663 89838 29 36606018956247 89838 30 -14665348193049 89838 32 43536706830718191 89838 6 -164791469206125 89850 25 -57825718807625 89850 32 92897971157375 89862 4 -7124810273081461 89870 9 -19572418998073 89871 2 -5156975193656869 89882 2 10568083527224127 89889 1 75528226394131816 89892 3 155657767651984512 89894 1 24416598146723 89900 3 123246355024000 89900 5 -6422391404000 89910 12 -4004986569273 89913 1 1265169889819 89930 11 -1728417473686557 89930 12 659630763152091 89930 16 -173855838906341 89930 25 85897260413338967 89930 34 131831890773839 89936 26 -92389224169152 89936 28 -4342383489536 89946 13 4877961050582631 89946 4 478286689777659 89950 11 481399951101875 89950 14 -37906774790625 89950 17 3851199608815 89950 5 32600044646875 89950 6 -940181035050125 89950 9 -10742374053125 89955 7 618362974689219 89958 10 -882972091853 89958 15 877412982438323 89958 19 -3681971902261 89958 22 99901286311447 89958 4 3025846867267 89964 10 -352677346878528 89980 1 -21839618807648 89982 5 22651888998843 89985 3 -2751253925281912 90009 1 16774039061703 90030 4 11642777042059 90030 5 -4774216543829 90048 11 -335528651106944 90048 20 335528651106944 90048 28 38816084752640 90048 30 -38816084752640 90075 13 -9041810246300125 90090 101 14259495471759 90090 11 2998121941179 90090 19 -6720481037997 90090 20 20695634739963 90090 24 -16648003509957 90090 27 75795852205311867 90090 35 -47340620190261 90090 36 2679900706303731 90090 44 -9375111022941 90090 48 -20298686877981 90090 52 13948163789139 90090 56 6157656455859 90090 59 -80949292411833 90090 6 -2275803601317 90090 67 61446697235559 90090 68 -1021075915305275649 90090 69 -6726984436089 90090 7 -126602725594437 90090 74 1177741810881063 90090 78 -5477874294537 90090 84 -4015202752742553 90090 86 5773387041032463 90090 8 69117083954787987 90090 96 33664823926551 90100 1 215944418384000 90110 3 83532676392251 90111 4 1566749701971496 90132 6 -231356011881952 90146 2 1873702589068115 90150 22 -3931976500345 90150 23 -247879753881625 90150 6 -491497062543125 90153 4 2642453369004744 90153 8 -97868643296472 90160 38 38317918881088 90160 5 340092959554432 90160 54 -487287574002208 90160 57 -6762234857319872 90160 80 -45532359143936 90162 4 -405971399413701 90170 4 -1712846375281 90174 12 -5981496517261 90174 22 7919323560068311 90174 7 -5700692152709 90181 1 318506546612584 90195 1 -308110266218224261 90202 5 -84014695499246217 90210 11 3123628631459 90210 1 13838375067787 90210 9 -95456385150063821 90222 3 -46130856061069 90222 4 12109408226099 90240 30 740348837420032 90240 43 -740348837420032 90240 57 92543604677504 90246 11 -70459270973533 90246 7 -53038424220821 90252 5 5302597554606528 90270 13 1361120527179 90270 23 3411818498019119967 90270 30 13138205709879 90270 8 -4442504326390413 90282 14 58130211913136927 90282 2 901366804171 90282 4 -127531019641877 90282 5 539372630987 90282 6 -3165086154493 90288 33 740741628165696 90288 41 15825209978852928 90288 63 -427280669429029056 90294 12 59722653075983 90294 5 -568685686903361 90294 8 118332970330397239 90300 13 -19587703148000 90300 22 93223150840000 90300 36 -493748957722672000 90321 10 3250329734035 90321 14 -463393394949169 90321 18 -513360762380210872 90321 2 6763989577617595 90330 11 -80453924815681 90334 16 330800898244887 90334 24 118604188292327 90334 8 737225202101507731 90342 14 60783596771031 90342 15 -98515663314991929 90342 4 2659922909504782083 90342 5 -2251244324853 90354 17 -49968655125497 90354 24 -115208843436433 90354 4 -87788964154301 90354 9 -117873493736149 90398 3 -2046105718425 90402 2 -793204222447781 90402 3 123234394017619 90402 4 -35886558761 90405 11 -71829128991258072 90405 14 741332244191112 90405 46 -75992003153829 90405 50 -289467381712824 90420 4 -31068148222304 90432 15 -460033772419584 90432 38 460033772419584 90435 1 -168017094084248 90440 18 138669474047264 90450 37 -94930194633525 90450 48 -536069507113125 90450 64 6176331759375 90450 81 -11866274329190625 90454 10 -865674389377 90454 4 -63377555611573 90454 7 -2789202883033 90459 6 -259485041044440 90465 4 -586104651064 90475 9 30949018785000 90480 24 181290619033408 90480 34 -394342407661184 90480 38 604036751235904 90480 48 -276094286926336 90480 6 -15431778041984 90486 14 -274110260481441 90486 5 33509254294005795 90486 8 -71290102993893 90502 1 -164719644475791797 90510 4 3314033999963 90510 9 -2578815701729 90520 1 959078145990592 90522 14 -6089388250185 90522 3 741203357211 90525 9 1284392125000 90528 19 -441508550390272 90528 4 441508550390272 90530 1 -59142439788813 90540 3 177700265090496 90545 7 -284212194199361 90573 2 765234495523 90573 4 10739157147365219 90576 27 31916566990656 90576 55 -1170905755018176 90576 57 34340044889664 90597 4 32738702352448538915 90600 8 -191853737200000 90610 16 -12437605586817 90610 3 -6861788487880613 90610 6 -3817122039381061 90610 7 2965822433891 90618 3 2846397596519591 90618 4 1686669441551 90627 5 126857332440584 90629 4 68278582425691 90629 8 173982900924008 90630 15 -9124485512361403293 90630 18 1222912900827 90630 2 -1492716019534317 90630 21 6533470775403 90630 33 4625799602401539 90630 38 -97899198698457 90630 43 55285778501271 90630 47 -716779682577 90630 53 -121227060648969 90630 54 425005405711479 90640 10 60157062510912 90640 19 3293790066496 90640 8 -48970756371558592 90644 4 -1973923840864 90650 24 -37744315563548125 90650 48 119590274227375 90650 9 55367934420859235875 90651 5 16903295285795 90662 5 -251678795467393 90662 6 -124576941711977 90675 19 -65908405971000 90675 21 8227958640273000 90675 30 -1116198466732647000 90675 33 -817822549104003000 90675 35 -6029951175000 90675 44 -198319727122200 90675 58 -24789965890275000 90678 2 -2049664001922053 90678 24 504976059820511 90678 4 -76704890311925 90680 1 308234443392 90702 3 35005231408347 90706 15 190657639400031 90706 18 -55915611137 90720 14 4750190873856 90720 23 -4750190873856 90729 5 2719190066184 90729 9 -2765607187032 90738 16 -323510952239757 90738 21 6546164470866783 90738 22 2169335616578055 90738 29 -430721719128081 90738 30 -11218179201929001 90738 5 -58572061647607485 90740 3 -520287811078528 90756 2 -143861400999648 90762 4 -500351687821 90768 9 135967404637342016 90774 13 236063381628555 90783 7 -3406866501249 90783 8 -91059807221496 90783 9 1010497829780907 90790 3 6319550224586339 90792 10 3332744046349632 90792 4 -150105302584128 90800 2 70598687400000 90810 23 -14705771959953 90810 26 -66636962491329 90810 28 352764171607671 90810 6 -12532450583711493 90816 17 -14683123280384 90825 1 -1356335575213625 90825 16 -1262688466961125 90825 19 2308481225000 90825 20 -16063321515625 90825 6 -97047468971104625 90846 10 -1163477494751733 90846 11 420318723700353051 90846 14 -2190297979370781 90846 31 1104419818407843 90846 33 626513675607603 90846 37 -179104434795405 90846 39 41070404758617675 90846 42 -3107816421822693 90846 4 399072780699844419 90846 44 7679448586138707 90846 59 -14780473359253497 90846 63 -15567360137050113 90846 68 81122147384103 90846 87 205161296731335 90852 2 -55588739017024 90860 3 1249790338857376 90864 16 18972713160000 90870 1 23561802892243 90882 20 1065754376235 90882 35 6220516735791 90882 45 -28775368158345 90896 18 7840696151872 90896 24 22226211079239168 90906 4 5467700444147 90915 1 -102932500764977 90922 3 4765653195388371 90930 12 -18003607501697 90930 1 -4067723088197 90930 14 -602989267689073 90930 22 30998200664591 90934 3 114937959199571 90942 1 -862591356027053 90945 5 1027263853940074056 90948 1 -42537989643016544 90950 16 -1842929806625 90950 17 -92857244568625 90950 23 -1199892310700625 90950 9 -149986538837578125 90954 13 -8918456764842009 90954 16 -13893982367337 90965 4 -1495168276085217 90965 6 -1582604086897 90972 14 24641027955648 90972 4 173006702056224 90978 4 51408472460455 90993 5 1672609028237063 91010 3 -10072923501113 91010 4 14388432346727 91010 8 1302898746591 91014 10 6307538323169791 91014 14 -279444043738945 91014 4 2017293844915 91020 4 -1911117120946912 91035 11 9952095305193903 91035 16 18704033845777512 91035 21 -154053573038417277 91035 34 -4421837680816401 91035 3 458176849693935912 91035 38 -19218278988452529 91050 30 51537001459375 91050 38 25340488542575 91050 8 3167561067821875 91056 29 10592910555200 91074 12 5593077489295 91074 5 210729450059 91074 9 -153611281917423521 91078 7 -14197352552590141 91080 45 4671339156288 91080 54 -62044156941885504 91080 56 977710667990976 91091 14 503373292492616 91091 9 -41500597491779608 91102 4 70544107961002943 91102 6 2371674721428359 91104 1 276980841685504 91104 5 -276980841685504 91110 13 -11767796273017 91110 6 132377144578883 91113 18 -28138642261048 91113 24 9187936305416 91126 3 -1446613709330563316397 91143 11 728293959979379091 91146 4 -384038133461 91150 7 -2324665355625 91154 2 -35540747715168891593 91155 11 2094994277819 91182 11 -759867582282973345 91182 2 10025032713767947 91190 4 186740457286491 91200 137 -40817345984000 91200 141 -28475235008000 91200 156 89378072128000 91200 82 -89378072128000 91224 13 5252477312178720 91234 1 2089510793586315 91234 18 -253326910463514217 91234 3 -51405157327733 91242 12 -223360069071897 91245 1 -2487433030819064 91248 3 -24002435093984 91248 8 44688140902304 91260 19 -5088408399895392 91260 25 466817605341984 91260 30 -772645735821024 91266 13 -26314183639549 91266 19 -555571541047697 91266 20 126328824525583 91266 24 495153365687 91275 6 4662217945014875 91278 6 -811124459157609 91280 8 -1311444872128 91290 12 -88518230704097 91290 2 21729300076603 91290 22 -2838429343182169 91290 4 15503631472265419 91306 1 -24052351580228659517 91314 10 36294869881107 91314 2 -5927569296741 91315 3 -9403874299601144 91326 2 -3227870564897417 91344 14 -168714126094846400 91350 104 13174391816526375 91350 113 -41574518861625 91350 120 -12926711506703625 91350 1 -27962122232422125 91350 128 -140570046779625 91350 131 -696161813432625 91350 132 34440185554869375 91350 143 502118485734375 91350 145 5118946490334375 91350 44 -482346457885125 91350 47 275521484438955 91350 55 -1332489070386892125 91350 60 40951571922675 91350 74 -49153139803125 91350 82 -20217058365227625 91358 5 -163402327561761 91368 6 -41768713222848 91377 3 4370873865480 91385 12 -36646341533220664 91390 17 491253028733871 91392 26 23894953367552 91392 48 -23894953367552 91408 5 -440652003226048 91410 15 106127097716863 91410 1 637804765387 91410 5 -12850720924373 91410 8 -164883148704917 91434 4 13999855145059 91440 14 1498982469514855488 91440 21 -55517869241290944 91450 12 1397370281132375 91450 4 -7352831278125 91450 7 -13870534321125 91455 17 1018830061502361107 91455 20 310098693195656 91455 4 -129148814679893 91485 9 235810864739592 91494 14 1281211555908851163 91494 26 22041733719591 91525 15 525725079517000 91525 4 13358380069000 91530 22 -200485533321 91542 11 -18389590274809 91542 12 1714325067287 91542 13 328879025639 91560 41 -16311226258144 91570 3 4980691836091 91574 2 4172134015531 91574 3 22388811627295 91575 19 570585568683375 91575 26 246565025325000 91575 40 249327384417000 91575 47 -47519479575000 91575 53 1972520202600 91575 8 59785308225000 91586 1 -22554397657637 91586 3 217578125647 91590 22 -554849031411905333417 91590 26 -1125965339473193 91590 33 -120209861530009 91590 6 -12504315708269 91605 2 218971497902533247251 91630 24 2013081424534691 91630 34 100739150684767 91630 37 30190333481623 91630 42 435204509766047 91630 46 -48918996792729 91632 4 -383422002339968 91650 12 -194928852528125 91650 36 129139411032195875 91650 46 751259051106875 91650 50 33445231033375 91650 67 2920275667048375 91650 85 206239140187220375 91650 96 -1559430820225 91656 13 -7337809317204864 91656 17 -330287708262123072 91670 10 564581155239 91675 4 -52178953439125 91680 16 98010756783872 91680 8 -98010756783872 91683 10 3800591982849877839 91683 17 -1593997321464 91686 16 14264128365227 91686 19 6044251892239 91686 28 21031361952551 91695 1 53669758563467 91698 11 629353456055 91698 4 -2112076884219929 91698 6 -1602785304434249 91700 25 -1162120580200000 91710 8 -3118986037557 91718 14 -13419904612609 91718 6 17861893039382579 91725 9 133564010244875 91728 111 1419745698762048 91728 153 -644106189795264 91728 15 -4064595615751104 91728 155 -6314260767820992 91728 158 -8290094110816896 91728 164 45920397337920 91728 39 -90827589117888 91728 53 3595881038699085696 91728 86 -144512145102528 91740 12 19754764740224 91742 3 -10791055363941 91760 4 -668865509710272 91762 5 379785575487691 91767 4 -2994208524123128 91767 5 -9120733198200728 91770 16 -14165863376202397 91770 18 -3176567928757 91770 41 3490499518353847 91770 42 129755326099519 91770 44 -39227471534609 91770 47 -443201437779337 91770 48 -220947680582497 91770 52 -2961953530129 91770 53 -57632263337809 91770 58 388458251993519 91770 62 -1804865324721481 91773 2 -5897527369815384 91773 7 218426939622792 91780 3 -1818728965728 91785 6 -83920745290168 91785 9 380065173928424 91790 1 -111088843856353 91790 2 2330364392343 91791 1 3491599329576 91791 6 -2546489175705 91800 49 -272866577904000 91803 3 1242227573135603 91803 3 19409809586795 91806 10 -3961942505161129 91806 11 428657584609223 91806 12 1135172451239 91806 3 5424576619123 91830 2 168460491752947 91845 12 -648598628431728909 91845 19 -10921532585976 91845 6 24022171423397367 91850 16 -1458202798120625 91850 18 -879656567405625 91860 1 -4247434608704 91860 7 -1748236891629376 91866 4 119127601372823 91872 1 4862275661952 91872 16 -4862275661952 91890 11 10563296999859 91890 13 -10452776845509 91890 18 5352781462479 91890 32 -4868911226961 91890 33 -158767541375165721 91902 21 -126889970258537 91902 22 -10230380466641 91902 23 -2587003389433441 91907 1 92613656757123 91908 1 -18198351002592 91910 10 847971534973779 91910 4 -3124457020282641010813 91910 6 -15798017627757 91920 23 -52176067348672 91934 1 -960388336239453 91938 15 242215834249439 91938 3 30796778215603 91945 6 -2395078163064 91950 19 -332954087690125 91950 21 -27420147578125 91950 22 417535746875 91960 17 -2554830605888 91960 2 12105407588294592 91960 22 -455093934768352 91960 30 635808815376416 91970 4 -32484343185161 91977 1 -57217748329667053 91977 5 -317733881329 91980 11 -286987731810912 91980 1 1551571593796512 91980 39 144936408923424 91980 6 -41892433032505824 91982 5 102653955941085423 92004 4 -54797828901472 92022 15 2415590409926267 92022 1 -7548050007672965 92022 24 -36677732166593 92022 9 -7042537638269 92040 12 20280347107136 92040 19 -2740552641371491712 92040 5 11011401042389632 92043 3 468435477672 92043 7 -12647757897144 92046 17 -52490904968753 92046 38 9862877020993991 92050 10 -9727064317125 92050 7 -5855024322125 92055 16 1057463347682887847 92055 3 61453846521352 92055 8 42968102505256 92070 13 572585478743041227 92070 16 502904174788899 92070 34 -13578412719300273 92070 37 -15459807926062113129 92073 3 -8773143276664 92082 2 5316251352067 92082 4 363575883521251 92095 4 3250589498216 92106 10 -71256180251565 92106 14 -92625245881965 92106 16 -1162153983213 92106 23 -200992952198277 92106 35 1923916866792255 92106 45 190543835273751 92106 52 -168536541264489 92106 54 974421286975935 92112 8 115941058891264 92115 3 35112356716563 92150 7 1268886810660875 92150 9 -809412736365125 92158 2 -28543814774873 92169 22 104433792853383 92169 34 1682264558364264 92169 39 -955973422897857 92169 8 1860353110052136 92190 11 -55301183973181 92191 1 887063600590344 92194 6 -235217493361132857 92208 12 1352753252241472 92253 3 118656107133535 92253 4 -2020324225933 92265 4 -14898739129361 92268 12 -2801546488710720 92268 8 -8439831021518208 92290 5 22968115666443 92290 6 -312450341301 92310 12 228206662849639 92310 15 6563277910191439 92310 2 -75739536925613 92330 5 1448161405917464979 92336 10 -1154684249083584 92340 8 -62783675794656 92351 1 13675875807943 92352 11 5867509197742336 92352 40 7696706853376 92352 62 -5867509197742336 92358 7 -3139591194153 92365 14 -146765788427014561 92378 11 -228683845701449 92378 3 -97056651267685 92378 5 -1424951091006093 92378 8 450756748675 92394 9 5099092982091 92397 2 6953851982051 92400 10 -9289586774672000 92400 115 598609714312000 92400 122 -1147184239508000 92400 132 8377800813640000 92400 137 6727574440000 92400 140 298536278305600 92400 147 -4288904460800 92400 164 114485584688000 92400 168 -536113057600000 92400 18 43428550600000 92400 185 67022406509120 92400 188 408051510056000 92400 200 52077640040000 92400 201 37317034788200000 92400 207 -2493545548600000 92400 215 -107089795000000 92400 23 324964862776000 92400 3 -572679153908000 92400 53 115631031536000 92400 77 -123562985680000 92400 92 -234553865624000 92414 29 -17473833000505 92415 2 -2407044847672 92418 8 -4271278773025 92430 21 7334123817145059 92430 24 -110759213933404713 92430 30 322752153432357927 92430 32 81491934784771503 92430 3 4099608669437451 92432 5 19643208372800 92442 16 -7166576991345841 92442 17 -105266785472857 92442 23 -803118924217 92442 24 -5406077316077425 92442 3 -530801542523629 92450 19 4430265649126875 92450 35 27411014049349375 92454 1 -299632578712901 92463 9 -297207668138333176 92466 10 521630595495 92472 6 -1269733950836288 92480 25 -107939718687232 92490 12 32253857426807 92490 13 61762550051807 92499 2 -10550390210776 92505 7 -3824403952312 92510 13 11527501381545444291 92510 17 132841285155143 92510 4 3239866103648782627 92535 1 39815927078419 92535 2 16445777727979 92538 5 -729954030291453 92550 15 714005899989875 92565 17 4515755550692859 92565 21 -172078453959093 92565 23 229036422219552783 92565 32 1396418078191752 92565 33 109689666581979 92565 42 86901479456616 92565 7 -121925399868707193 92568 1 16457393943712 92568 20 -152159642457920 92568 6 -4088486291392 92574 6 4894440236451 92575 11 -853361049859767000 92575 12 3154565721257000 92575 21 -242806024679419125 92590 10 -39004681569921 92590 1 84941629870427 92590 9 -263003875146361 92598 20 -5059846509297713 92598 23 5873306618863 92598 9 4357608822539 92619 3 -47774880601575768 92637 3 -2964203550360 92638 1 62079041114875 92638 7 9484973202167 92640 10 3192834492928 92640 16 -3192834492928 92650 10 24848043907375 92650 7 144355521360375 92655 6 28045854764739 92664 17 269472770961984 92673 1 576044138783835 92680 3 -658331758014848 92686 3 382077971056243 92690 1 377839549512667 92690 8 -5626464467833 92690 9 -24569877242529 92697 4 304556304318659 92718 22 -2045207858829273 92718 3 75748439215899 92718 8 -16026457764141 92720 11 33724203822757952 92720 15 -17532260287901632 92730 2 552117649344643 92730 7 -22718128931497 92736 116 -59012575612416 92736 141 6945342983424 92736 97 -23776018670592 92742 3 661473650323 92752 7 -929553229504 92774 5 59709120594623 92778 12 -27701450582777 92778 23 1144203475935815 92778 28 4174171094747807 92778 31 2387035905521399 92778 3 4663272027331 92778 5 317308220329787 92781 7 173052630183771 92784 8 9131966487872 92790 16 562350965184747 92790 33 27048918916791 92794 7 -1119028738639608081 92820 13 12781862039584 92820 23 101329915988384 92820 4 -49328831950208 92820 7 -5269052164832 92834 2 -6014246136875073 92850 10 -5369542967125 92850 22 -17995226566625 92850 5 36278222282875 92855 1 5528860264648 92862 10 160995431149155 92862 16 136300647946779 92862 20 -14733032516168805 92862 25 36287956118763 92862 3 -3108907394613 92862 37 -7749789268185 92862 39 -1863319959215721 92862 53 145918995458319 92868 1 3231025509536 92874 6 -41026393434421 92880 45 -46204079159808 92880 54 24774251132736 92890 6 135375488188219 92895 4 5322911752648 92895 7 -61398837664856 92898 11 11150505991503 92898 1 78566873078862459 92898 23 10484627851055083023 92898 24 122206274549631 92898 8 -2909884188106017 92906 2 354496626899 92910 22 -6146502255881 92910 26 -35327491423633 92910 29 -112567255089441697 92910 5 320383776017251 92916 5 -83763598747968 92920 12 427011222531392 92925 26 -592245530581725 92925 38 -74030691322715625 92937 1 -31812849284293 92950 10 241062897599385875 92950 19 48130243971875 92950 31 845937168049675 92950 32 61457415621875 92950 46 105742146006209375 92950 49 -270644385597625 92950 55 -1271019337394625 92950 63 27908220847817375 92950 70 415902034559375 92950 73 186033340894375 92950 9 6702520543875 92967 1 -41575828818509 92967 3 80328781493416 92967 5 1289322874840967 92973 1 -27672877606904 92976 11 790371484575776 92982 2 -1878641118253 92985 2 -405298067896 93002 5 64277135200747 93002 8 8194706678253267459 93006 14 1370672775625095 93024 19 -44770649159808 93024 32 44770649159808 93024 36 6704710229376 93030 12 -16835227355393 93030 1 3759285870072307 93030 5 -5108761846061 93030 8 22542841874267 93051 12 -41764585423617 93051 2 -11264671110105 93060 8 4520891790183849408 93072 34 168308752604001344 93075 15 5236142267375 93075 18 119815234361000 93081 1 -700503933304 93081 3 17223584380424 93086 1 -54783868479677 93100 35 148018308905600 93100 39 18502288613200000 93100 4 -5768724131100000 93102 2 9471498632803 93104 15 -3363955487545760 93104 8 -40558486497640128 93114 8 20969745356799 93120 8 104418075206656 93126 18 69486691375 93126 20 -19833554451401 93126 25 -1897039774513 93126 29 -495466542289 93126 3 -90697715400365 93126 6 -2344136878781 93138 10 25312333327435 93150 28 -141225181003125 93150 45 -232055765240625 93150 54 -1208949080625 93160 1 10905537331648 93174 11 -5214463762177 93194 2 -1908631267254649 93195 4 63012478355904591 93210 11 115350940335779 93210 16 99278541884639339 93214 7 -1514137358390625 93236 1 109062417983104 93240 17 -456514703666496 93240 23 224387708373307296 93240 44 93193774008768 93240 48 9908569306805184 93246 3 346459151934971 93248 17 -12670246164142592 93248 21 12670246164142592 93258 3 -7905060864081 93262 1 18191853103455 93264 21 173210350951872064 93264 24 -100783865189312 93264 28 -64839302868160 93270 5 17687115881927891 93275 13 158524581927375 93275 4 1331326402308440875 93288 15 -3967864265100736 93288 29 -6091641022688 93310 10 -30574552595021 93310 16 -167573889023913 93310 19 -2984828988681 93318 5 -88246954179253 93330 13 -2072897709237 93330 17 32878169032128830739 93330 23 -55389647383821 93330 25 989357992767 93330 2 6991906625763003 93330 27 -258959504657889 93330 5 -26712665804709 93345 10 17688508086403 93345 30 -115908488799385062277 93351 1 570104412338395 93360 21 169091248102912 93360 26 -26006817265856 93360 35 -1340261162834624 93360 38 -22092510094784 93366 33 -246277467368505 93366 3 9121387680315 93390 19 -11340231600041 93390 5 2199539530071467287579 93408 11 -12135764015360 93408 16 12135764015360 93410 3 -290154643689832281 93414 8 776420454655 93438 20 472391263162791 93438 5 7233489161283339 93450 13 -59981349078125 93450 17 778106006875 93450 19 2559271121875 93450 30 -2452875626125 93450 32 -899611445125 93450 35 9864771727136075 93450 41 4325282151875 93450 55 1233096465892009375 93450 5 527260809158875 93450 61 -407883108865625 93456 26 1411780325184 93456 32 -438077444895707328 93456 36 -89704480349376 93465 7 40561030340322219 93470 10 -25919291215956861 93480 11 -1845762053105728 93483 3 22662324311112 93483 5 19749718047951 93483 6 -87802129913688 93492 30 -442909371310560 93495 2 -2768517869181517 93495 3 1601640110087 93499 10 -27055056620341 93504 34 -130276452851200 93504 7 130276452851200 93513 2 4423052682091 93520 31 43151714093740608 93520 35 -14148379617408 93522 1 9285882054571 93522 4 5401153152955 93525 19 -36416334799000 93534 4 2424663457147 93555 11 146674931014179 93555 1 -3960223137382833 93555 17 13217431424616 93558 5 260742553511651 93558 6 -24287778496189 93562 1 12843735667803531 93570 18 256555112839095167 93570 2 -36933233486093 93570 24 -3987525003409 93575 3 1203998483545875 93590 12 -19743213614103413 93590 19 57560389545491 93590 27 420533649456291 93600 22 -2274862036608000 93600 39 10659214656000 93610 19 -14797261557262809 93615 15 18414758237723279 93615 7 -4293689599892024 93642 12 -5175310352545 93645 14 -133407035616969 93648 22 66427412465728 93654 17 -1030600393217109 93665 1 -692035338968 93678 14 8533060293887 93678 16 11692777362551 93694 2 -55436127113105 93702 1 -11075042137949 93702 3 775171829731627 93712 5 32072682145773888 93717 1 37839524510952 93720 21 3376276961614624 93720 25 -796111857856 93720 9 -7648409942231392 93726 7 49755285184887 93730 13 -565319746909 93730 21 -1219210551369 93730 6 -203397395105684053 93738 4 -9793956254813 93756 1 92119876490656 93765 14 855697885269704 93765 1 -95029942600088 93765 9 -2066209565922433 93786 10 20131186723795 93786 13 -1226736289060037 93786 20 -11435968681109 93786 27 -6904997046261685 93786 34 72863556211691 93786 39 -187664708142541 93786 43 57464097040259 93786 6 42852558186739 93786 69 -50995146884689 93786 70 -16497465082777 93786 73 -31823524679905 93786 77 2920013433071 93786 78 13170657014651591 93795 2 1310092253680483 93795 5 -14321971348630712 93798 19 537202843791975 93798 9 -19896401621925 93808 25 -210198271402358208 93822 5 -2848987330372837 93822 8 728470874110591 93834 6 27774627335775 93840 31 334741315221568 93840 36 56637325767232 93840 38 -3544491330247616 93840 39 -405652910365376 93840 41 -1383713063562176 93840 46 -116211268997694656 93852 5 -13671431740224 93860 4 1130096717643808 93870 24 47088525636783 93870 29 35482319915463 93870 37 111370994362431 93870 38 5834960103101751 93886 2 -38494819116261 93886 4 1487780850447 93888 12 33612385549824 93888 21 145204124997312 93888 26 -14842262672626176 93888 37 -145204124997312 93888 65 14842262672626176 93890 4 1640529227871 93891 7 -15536517070391297 93906 13 -6690628629214533 93906 17 -4649904584073 93906 30 247801060341279 93912 16 18952617345472 93912 5 177228383517856 93912 8 -74617939633600 93924 1 -110800088753760 93930 11 709585992467 93933 18 -84673805683320 93942 2 -66521762291744181 93950 10 -399917421959625 93951 4 -2177525701944 93968 10 -248134889598912 93968 3 -51153012621220320 93978 5 70620534184347 93978 6 73997395071992091 93990 10 -115267547500093 93990 12 -39579106443733 93990 3 574646539704067 93996 5 -5455803023712 94010 10 26858391721269219 94017 13 1783474601464072 94017 21 -79933216717367992 94017 24 -18216816055768 94017 28 -41561400023704 94017 4 2779501141512271 94034 2 17039609109387 94050 101 -59921715515625 94050 106 32009377179375 94050 16 -1944880233787125 94050 28 9640305662074875 94050 44 -2988463107550725 94050 59 -9751905010397925 94050 86 -880608217343625 94050 91 -1218988126299740625 94050 93 -373557888443840625 94055 1 -8467396055543313 94080 12 -61761067289859392 94080 127 17430936822656 94080 141 -494075145216951424 94080 28 494075145216951424 94080 43 61761067289859392 94090 6 -3327157811702889 94094 17 597279589759 94094 4 -5025251126343869 94094 8 5716633539583 94116 3 379753841922688 94129 1 -9883793951801 94146 1 162101956983715 94146 13 1971652552893343 94146 14 4564973181943 94146 17 8474150052343 94146 19 -6910701824310857 94146 20 -7994397662369 94146 22 -1005457855985153 94146 23 -1966162682537 94146 24 -12114746648081 94146 6 -492520145597 94150 7 11680004806875 94160 14 378562313883456 94160 9 2265597290585005632 94170 14 49518957921319 94170 16 -401100994956153313 94185 12 124258944044871 94185 22 -165945815296344 94185 23 -6355711986021 94185 26 -16829243263047680109 94192 35 -6843667387552192 94200 11 -760969615400000 94248 23 150141182420160 94248 24 10210242826657728 94269 7 -16599136136381 94269 9 24816207770920 94288 1 16397584367680 94290 15 346722986051 94299 2 89717066600344147 94299 9 4054340301876993320 94302 10 707289644548539 94302 23 -701263755520029 94302 32 2354186872126323 94302 42 -19096820402810553 94302 50 33046850811663 94302 51 -1540676470877503713 94302 55 492997063254111 94320 20 -120700711680192 94329 2 7560988160904 94330 5 3433768453351 94346 6 148787964453295 94350 14 -13543979672125 94350 38 -531701950324625 94350 43 -43783379680625 94350 44 390756683659375 94350 52 -84700937139625 94350 57 4942319478005375 94350 8 34022267839394875 94367 1 405824518599665131 94374 10 149999470209603 94374 17 -74819807637309 94374 18 -73148071642821 94374 22 -51449818281893829 94374 32 -2004443588637 94374 34 -861746288007717 94374 36 25089788573487603 94374 48 -943526513392785 94374 54 -68467730402856393 94374 7 34945426421955 94374 74 199614374352351 94380 25 -216699057679456 94380 6 -172625144548427648 94395 2 -383345613197 94395 3 362676391178536 94402 5 1404127713591 94410 5 -13163541211557 94420 3 25242942907584 94438 1 -752405604237 94458 16 -18810119508517 94458 20 5632903295839 94458 27 7960930699175 94458 3 -6672378990941 94458 8 -13914722044133 94461 1 -11936383350281 94470 13 697906834559 94470 6 324639387682903 94482 4 -19782849046679481789 94482 8 -538987255137 94497 1 9660863733256 94506 1 15483081971899 94506 4 -3491192406061 94512 20 312886482364736 94518 11 -25076226242859203421 94518 15 -8270577778041 94518 20 9204065816991615 94518 3 -48538823398893 94535 3 -3114550567864 94542 14 1252527098327 94563 6 -42661301592888 94570 21 235439915501231 94570 23 -4573817468801 94570 4 7881485058307 94570 8 3238888672733651 94575 12 7269620489000 94578 5 -5853504763189 94584 6 84313915231904 94590 14 -1206068931474710553 94598 8 -19595305099089 94626 15 353961998174079 94626 18 -1096907954991561 94626 28 -9385470592569 94640 19 -85050483262849728 94640 2 2143272410556992 94640 37 2064117010580911936 94640 42 1467441097178934592 94640 52 148649059510848 94640 57 22306341173626432 94640 63 268567924712256 94642 4 -78785309829977 94644 3 10927025037216 94650 34 31317876605375 94650 42 1316258290649375 94675 3 -1051733619000 94677 2 -724773727457 94677 5 -462454419878029 94694 3 -52451847123088621033 94705 2 699996338309672 94705 3 -2831268640888 94710 10 654350642739163 94710 14 92280544372171 94710 16 -582778669661 94710 18 -369415304189 94710 2 -393451268410493 94710 24 -5403512189069 94710 25 46650905167904659 94710 29 439697526227 94710 32 120378797398763 94710 36 1525416819947 94710 40 -1362648314740332510112501 94710 47 -7917270709697 94710 49 -45045272006657 94710 52 -109729603745639672633 94710 54 1594724381263 94710 57 -1565278832735801 94710 58 712328463495745603471 94710 62 388477486476143 94710 64 -63300269637793 94710 65 -15311589801913 94710 69 632612533146119 94710 73 35837302806407159 94710 77 -14067424202329 94710 8 658559920399723 94711 1 10511179846831 94725 15 14775156875475 94725 7 1846894609434375 94731 1 -1745381144172329 94734 7 -10653912115389 94738 8 886937165001495 94752 4 12302059386240 94755 1 -134084489239169 94758 7 -54480072817025 94760 5 13262748072128 94760 6 1220765814368 94773 2 12223436834015 94794 14 -440444282473 94794 15 21128727066623 94794 18 -1165195906881049 94794 2 -3128951749411781 94794 8 19707684151303 94800 23 4682596171400000 94800 46 -301517314424000 94800 47 298795969288000 94800 64 -644924718807832000 94800 77 8993350393064000 94809 10 3455641773064 94809 4 -1337451985990181789 94815 13 91618757412903 94815 16 -19647636693328728 94815 19 -8197197588738648 94815 32 -7336775082795921 94822 4 -18262904411025 94830 10 17429821489423 94830 7 840618360251 94831 1 -3312547018552 94842 3 6482801740779 94864 21 38112777309376 94864 30 424052539704640 94864 77 -4273104672996544 94864 84 543619481993280 94874 7 -39762846740681 94878 11 -31224819448341 94878 21 5550213423159 94878 2 17658231318099 94896 14 91023006844224 94896 27 653303550247488 94900 7 -439442094320000 94920 2 7472746427952448 94920 6 1620436466368 94941 14 107112718902888 94941 9 -43240318427160 94950 47 -78875127323159625 94950 57 -178326460490625 94962 20 -4496018898929005 94962 24 -12342052913365 94962 26 -204769656618173101 94962 34 -5640917015825 94962 36 15759351806527 94962 38 65801160540199 94962 44 8843698451287 94962 54 -342885461078208601 94962 60 1934834536427975 94998 5 6252446589427 94998 6 201601425763 94998 8 11119997901103019 95018 12 -966551182734241 95029 2 -18444323129752 95030 14 -112531145493177 95030 18 250960983063471 95030 8 8796058794532691371 95034 10 -10429856163577 95034 7 -66687009100649 95038 2 22445483457563 95040 120 3985218399508992 95040 128 17614424941056 95040 133 -147600681463296 95040 15 -336152340306432 95040 157 336152340306432 95040 194 -12450086678016 95040 200 -7460706092544 95040 56 -3985218399508992 95040 89 -17614424941056 95040 90 147600681463296 95040 9 24029449072128 95046 10 -524651703157 95046 2 933816170827 95046 8 -1660732897366549 95050 2 -6756275888361125 95060 19 -109726656712064 95060 3 3682597226315392 95081 2 15157005603067287 95082 7 -326152297405 95082 9 20206984623103 95095 3 -173812113879832 95095 9 6899473676584 95106 13 38952211352527 95106 24 70629333458255 95120 3 16800589512928 95130 19 -870845186056023261 95130 41 -2977205549393468889 95130 4 -5628284470341 95130 9 -6060946600197 95139 9 -8268172655415993 95142 4 -962322984737 95145 3 1258942513544 95154 2 -5511588467149 95160 17 1586185509332384 95160 18 -4259386628704 95160 19 58709227898816 95160 8 -17906529831776 95166 13 386266781989791 95166 3 -10726527682917 95170 5 -101969004473 95186 3 -18756616846969 95190 15 10601782996859 95190 17 93503951756099 95190 18 -228099176389 95190 23 -5654962099621 95190 26 13149210724732423 95190 29 -54431018793779273 95190 32 -9978995760641 95190 34 837465600841399 95200 23 3849902056944000 95200 7 -3849902056944000 95202 15 -199152284091921 95202 1 5377111670481867 95214 6 -1037473163245 95215 1 12694183728867 95220 21 -32045006935294848 95221 1 2386832531112 95225 4 -690054571498625 95238 16 2702278453779 95238 23 -537795809853381 95238 25 -12544423767981 95238 36 731653620380883 95238 39 -11924844767181 95238 40 -26283525864597 95238 45 33407904230911215 95238 47 991950954206679 95238 5 -1237329786330045 95238 54 -374498324407017 95238 62 -20371891859073 95238 68 -132833867090049 95238 69 -28408889322081 95238 7 -26782675763580333 95238 74 1397756166747903 95238 9 -20208127772813876397 95247 4 -77783898237624 95265 4 4065709093704072 95265 5 -458211445857 95270 4 8253798930523 95274 14 143444608791039 95280 7 996866539225408 95285 2 -460328108292506269 95285 5 1982851064639 95290 5 2561763497311 95304 13 3571106879809243072 95304 8 -520645411839808 95304 9 -1047189537133120 95319 15 -8917290977400 95323 1 5806639415079 95325 26 -7113879380125 95340 4 842638384916582176 95343 1 -8561127478616 95370 11 -213782210230648013 95370 13 -37460399219770013 95370 17 123539095446211 95370 18 -1043457141106050101 95370 23 17854696012051 95370 38 -43513578308701 95370 48 -373188513574817 95370 55 -121736666388617 95370 57 95330119557064663 95370 64 -235433529151832681 95370 69 -2214672453806180201 95370 70 90573289909759 95370 74 -41768199226169 95370 76 -450778028456377 95370 8 -25432547469173 95370 84 -47920522929337 95370 86 -314542751083031377 95370 9 -107336743627733 95370 93 1693447053183791 95370 97 -39374801475173641 95390 2 -1801209393968069773 95400 24 -28459602633232584000 95410 17 6231486456271 95410 3 -2998987663293 95418 10 702657185093199 95418 1 -26024340188637 95421 1 25428576435976 95430 13 -3444247726057 95430 16 243586719858239 95430 6 1186787543219 95430 7 -4216978327697 95438 1 6373844495672275 95445 13 1356241961067048 95445 20 -50231183743224 95450 8 -4626629048661625 95468 1 -209870157736160 95472 19 -75072377029824 95475 16 -194949015625 95475 8 3335139150042728375 95480 17 36593192758816 95480 7 -133858601528896 95484 7 7391659872032 95490 10 -1909222163248293 95494 5 -1999254560796361 95502 2 -421801903852957 95502 5 22457832749623 95502 9 339961154771663 95506 10 7406639893876463 95506 4 -487873971457181 95530 2 -208359688690053 95542 1 24723279335755 95546 1 1615549527955863 95550 100 -49970261149409125 95550 112 560425685946875 95550 115 726972703863875 95550 119 176902131021875 95550 122 -2065830201182125 95550 127 -28298523400525 95550 129 585715163813675 95550 133 1209291961731875 95550 136 40467715802675 95550 141 362286359421875 95550 143 7652473304482475 95550 14 -456760761561125 95550 146 -470649987128125 95550 149 -3139643612379925 95550 15 -249351637425309125 95550 155 -3537315425065625 95550 158 745679470375 95550 163 956559163060309375 95550 164 671500927948375 95550 174 -26465707777985 95550 180 -46593329701625 95550 182 25673222305903375 95550 188 289640345656375 95550 193 4413244906732375 95550 197 73214395476709375 95550 21 12344270704073875 95550 215 6359933554699375 95550 218 -124861753110460625 95550 219 5058464475334375 95550 228 -3318297142992265 95550 231 -327774173190625 95550 246 23338491905123336375 95550 252 -2788802224665625 95550 256 -230324818286292625 95550 269 -2181457209261885625 95550 273 41777239618559375 95550 277 420111016994375 95550 289 -25112537648511315625 95550 292 357335421104375 95550 33 175449303071875 95550 40 46373600042875 95550 41 102701511773875 95550 54 -414787142874033125 95550 63 -200900301188090525 95550 66 -134123113998125 95550 67 334217916948475 95550 7 -17451657674095085 95550 85 465287482338875 95550 88 -2035556822585125 95550 95 50879468437595 95550 97 -998894024883685 95550 99 11168416530033875 95568 15 -2772418370774464 95570 1 -175403194477813 95585 3 2235013220411 95586 1 149575291517611 95586 2 306523807369795 95590 3 505617011116038107 95598 3 573363312854571 95598 5 -21031161989445 95598 7 -970487667367533 95598 8 -991539629973 95600 4 15245774920000 95610 3 -38153891577509 95630 4 -4233174014593 95634 6 7551655953939 95642 5 412258121343 95646 1 -471161318165 95654 24 -27711706002201 95655 4 117698885907371 95658 1 8333641283419 95658 3 98831769404167 95676 8 -9555016853600 95680 20 119165272118784 95680 45 -119165272118784 95680 49 -315256610304 95680 7 -5858105110272 95682 4 -1411596368225 95690 3 -5959692304633293337 95700 16 -658606570467200 95700 24 -82325821308400000 95700 7 -1708210318652000 95718 13 2152170340559 95718 1 666488020770307 95718 7 -3285429279288085 95730 9 87457103074151 95739 4 63500116668004808 95760 110 -1333776684270528 95760 122 93333616006464 95760 132 -98166576798144 95760 140 2905346873715264 95760 144 -111385587880488384 95760 15 162071070390144 95760 29 -3350721679488 95760 32 -22693572809661888 95760 36 -37971078882624 95760 37 8299696428864 95760 49 164377198780992 95760 6 -4375918900533888 95760 74 -141379917822144 95760 76 145638439649856 95760 82 -7696640288448 95760 83 -91451338967232 95760 86 465429000393792 95760 99 -486259440799265802432 95766 6 7214858605907 95770 3 15405356883879 95776 2 -194491095040 95778 10 -12591076896987705 95778 3 163016275773555 95778 7 18248148062663103 95779 2 -38185201038456 95784 1 2917828955534161024 95794 3 3383447522579 95795 1 82344504032847 95810 13 2961667177299 95810 4 843776820053803 95810 9 -614035495128349 95817 7 -51497435416888 95830 15 96578153274527 95830 16 -2718097174926377 95830 3 -65412291130490562677 95830 7 -137679776201545774181 95830 8 -223343229799579861 95850 56 38460190071375 95856 3 -12384018010304 95858 3 762804268724501252955 95862 6 -123213695886325 95865 3 -287837015510717 95865 5 -30885602021009 95874 14 1037782724520053575 95880 10 17299894488256 95885 3 123664438209361384 95886 14 3389482739007 95886 16 -1530653862231369 95886 19 22885546891815 95890 6 5196426205861099 95890 9 1895714580496419 95898 6 -4672844309249 95900 14 185074342020000 95910 4 16397428098403 95910 8 -11950857743309 95914 11 -11273216335906589 95914 12 -7212452731093 95914 13 -40586587364933 95914 17 413174160702103886695 95914 2 3213857850939 95914 4 -71720640518547509 95914 6 -4097463830565741 95920 14 -26215570924992 95920 5 -434767382230976 95922 10 22626778305031695 95922 11 -32020494827545809 95934 7 -365217714865 95940 6 -709530200387093376 95942 20 -13514657324301 95942 28 74352681608471 95942 8 24006916383929955 95942 9 -4135436442386326189 95952 13 -37135258890688 95952 9 -2074219936192 95970 1 5646994570603 95970 18 504661262239 95970 19 -96816962370772169 95970 2 1613902972627 95970 22 287391670847 95970 25 44875297533527 95970 26 84858851658404285351 95970 6 -39087718171651997 95970 7 -7554731938181 95975 4 288714739541013000 95976 14 -2507256244625472 95976 16 -74929597521984 95984 6 -6357607711470784 95990 1 -513440647041853 96024 1 10878961608928 96030 19 802531156939839 96048 25 -1400760375793344 96054 11 -81285062931141575212909 96054 1 -29319455399597 96054 15 -80550039754045 96054 24 114980445719 96063 1 387818087074113455 96064 22 514226895122944 96064 7 -514226895122944 96074 10 -50788876923291244969 96075 22 1609819825341580875 96075 40 11134008126183375 96075 47 1367322348393000 96075 57 -34256262335625 96078 3 -12228120571301 96086 1 -2985616703144485 96090 12 6714945488791 96096 22 -302650724174336 96096 47 -388166831724160 96096 50 -4152447359488 96096 53 -704921870080 96096 55 302650724174336 96096 7 388166831724160 96114 5 -4393474820585 96118 3 -18333228561568741 96135 9 1002107954879 96138 15 -2096153330517110277 96138 51 212919560862687 96138 62 -386978203236681 96150 25 -18581225738163625 96150 6 126719033295475 96162 14 296519330781343 96162 6 -2328296503700449781 96162 7 241338444245243 96180 4 17286347358496 96186 10 518273093296279 96186 11 -7199913466441 96193 2 -129356405068149 96195 13 515881164495752 96195 5 -52095345620813 96195 6 -9500012243117 96200 24 2529025811144000 96210 3 64176633273987 96214 1 130258839783707 96222 11 -1393793346553405433 96222 16 -1688025013947145 96234 1 3963395295982891 96237 11 -28798696855725624 96240 12 -7420529961152 96240 31 41609431209536 96254 8 109306448149129695 96255 1 -2412331829613 96258 3 -11885926812461 96278 19 1342226873699711 96278 4 -21752232621085 96278 7 -3660770584745945 96278 8 -957686005808433 96285 14 -125591054134168 96285 18 -2511202039192 96285 20 -1566134256039409 96294 8 -987911500969 96294 9 1564312086287 96306 5 202405140279539 96320 21 1259333070868317376 96320 25 -1259333070868317376 96327 4 -14275901644920 96330 13 -56844627814871117 96330 25 -17929162294077853 96330 57 -100696634640017 96330 58 -89165425832873 96330 61 -5976000750528809 96330 63 46057908233732239 96330 69 -62391998291129 96330 70 -25873749574361 96330 77 108677988243282887 96330 82 3624265761663599 96330 84 -8160747516649 96339 1 -4940501995621 96348 6 221078054444192 96354 17 1811678687381331 96354 26 -8815196232585 96360 12 678954438726272 96378 2 -3233519212717 96387 11 -34453357223044393 96387 12 4388522673041930312 96390 15 241491377795067 96390 21 358839549337779 96390 27 -13290353679177 96390 31 -5509319995521 96390 3 545175900165483 96390 36 -14719749304468041 96390 39 2956593744491967 96390 9 -109503472018221 96393 3 -25912494154457 96408 4 -10266653789280 96410 6 -21017392712829 96410 8 -45278930993401 96418 3 -1189701627484537 96426 6 -160128929184597 96432 31 71744719761451072 96432 38 151042439453248 96432 39 -7828864241557184 96432 57 -29580897416758912 96432 75 1024023628480832 96432 77 2232395908608320 96441 2 13580409549151 96448 24 7090788321792 96448 4 -7090788321792 96450 12 -137237807603125 96450 14 85192478574875 96450 19 -334557165503125 96450 21 1195327755681875 96450 26 9562622045455 96450 36 -1097902460825 96458 1 -2535054972713 96480 30 -62642185259904 96481 2 -27088452236601 96492 8 -9293778672525280 96495 7 -1495532253561688 96502 1 303293114422579 96520 6 63746018842464 96530 12 7051628450447 96530 13 1586919149263 96530 9 -43681479499350188461 96558 20 -81681259793309 96558 2 246981736340515 96558 23 137252598848387 96558 24 -62123958786637 96558 27 -1992144018997 96558 32 403803343893851 96558 38 40334020490421251 96558 4 -419353704228437 96558 47 738939826771399 96558 48 -31682015046737 96558 52 31329492767551 96558 53 558159780328049647 96558 59 -23986265194529 96558 65 -155832106792769 96558 74 1737109224595151 96558 77 25410506123519 96558 79 -57833820378433 96558 9 207412534141175539 96570 13 4430397046743 96570 21 117527078376927 96570 22 3523285450120239 96570 25 18165525401511 96574 7 111364416775511 96594 4 -178948020008665 96599 1 70943993883 96600 11 -144561802904000 96600 15 126326731672000 96600 42 234484076296000 96600 56 -43420011256000 96600 67 -454717851400000 96600 8 37845004810024000 96612 3 14957540258752 96614 1 -62064222110981 96614 4 -396109227614941 96615 5 -25795870188733656 96621 2 -15321135205854584 96624 16 130378361212512 96624 35 -5340564294336 96628 4 118311095786688 96642 10 -24971694929973 96642 11 -958728634154947629 96642 12 421991582699331 96642 15 211222477216899 96642 26 -23982306364412397 96642 40 35508705537882303 96642 58 45799531202151 96645 6 716212917476299 96646 2 -24896357805430777861 96646 7 -4503536035461 96648 9 45163676853440 96657 12 -645326292827800 96670 2 61795359322019 96675 6 -360060152167000 96678 23 -10568794535145 96678 24 -1086904204857 96678 26 -29652461375430105 96679 2 -21621984397893 96684 2 4025554780960 96693 2 32049181278123400 96702 3 646802970227 96702 9 -47170377004033 96710 10 18085792070979 96710 14 -4485932052593548708593 96710 7 2526111529211411 96715 1 -248906811641752 96720 29 -15508338708935168 96720 2 -981410015606912 96720 31 39161876928832 96720 38 156026474956288 96720 40 376276568437707328 96720 58 18179366581034145856 96720 59 100457091263296 96720 72 -21166430183967232 96720 86 7409378200284224 96720 89 13685145072704 96730 4 -40059173883673 96735 2 -223066826776 96746 2 -1148103516836853 96746 3 231028040244142747 96774 13 -29710183188047041 96774 4 -13688907283421 96774 5 437064588885203 96774 8 21963939938596783 96782 1 -115769358391581 96782 11 2976855195692951 96782 5 1174081101859 96786 16 42094638681547239 96786 2 -6981829551549 96786 3 -42078655920357 96790 1 13352221428499 96792 7 -76488865924384 96798 4 -19383987914981 96801 1 -2548601402149 96807 7 -560938638226168 96810 20 26107219886959 96810 28 -593046357553 96822 17 4775690813784687 96822 6 -128943651972186549 96824 2 -8908320298528 96830 4 -2071844887681 96833 2 -7361587235705525 96846 6 3918852071263 96850 1 4720073029875 96855 3 544811329905083 96861 1 218540205363331 96866 2 -518690514854637 96885 13 755698613136552 96885 15 4225666503407787 96894 1 -22607015132925 96894 2 -3231495180318285 96894 4 2713241074347 96900 18 -72168777707120000 96900 30 -577350221656960 96912 10 -61489726554816 96915 4 -653759646821 96915 9 -599530225897 96921 12 112573318879791 96921 6 15570791697384 96922 15 -66457224060661 96922 16 144047348283447 96930 15 -401637925953 96930 23 -221231233474137 96930 2 8193749387931 96934 2 1484359135695 96938 3 -8485276515353 96943 1 -120173696272440 96945 2 7987856956883 96950 6 124887361385375 96960 107 11348385887744 96960 11 -1419154068879872 96960 14 25662584625296896 96960 16 -1764542859776 96960 21 -11348385887744 96960 3 -31329684680192 96960 35 11071361498624 96960 62 -11071361498624 96960 83 31329684680192 96960 98 -25662584625296896 96965 3 -758770324776568 96975 10 148022431317000 96975 18 3678103293978375 96976 2 11567401251923520 96976 4 275890487912000 96985 5 170297291649736 96990 10 308603554453763 96990 1 -56536265905973 96990 3 83764944843181651 96990 6 1912407613337251 96999 1 866881399735 97005 2 -7269889818808 97006 11 -142274221965161 97006 17 109450009300463 97006 9 29629942766981999 97014 21 -24036806604610745642521 97014 6 31432394266955 97020 1 -256209190570368 97020 14 -19622352308832 97020 42 99859214744352 97020 45 -685622336178528 97020 68 48736548008064 97020 69 -8482007998364544 97020 70 1797979861270656 97020 77 84992585936668704 97026 2 -2146149323333 97026 6 14689302952859 97027 1 17311438918006379 97050 18 27585355416875 97050 21 -267032048665625 97050 7 3833139221875 97070 2 13436984052459 97080 2 -7506212997952 97090 14 17176706854271 97090 3 37464247427919579 97104 18 979549504936640 97104 42 6306098486522752 97104 54 1944280713581632 97104 56 894869667687232 97104 74 936872354533184 97110 13 3196857699027 97110 15 -35181744807717 97110 24 9262628167659651 97110 37 5484241457811 97110 44 -172230963166521 97110 47 5984478444303 97114 1 53585364471283 97123 2 -40844849104513 97128 7 -34982776645344 97146 18 -3445152792201 97146 5 -1301771949747093 97149 3 378379256713147 97150 15 -10302175103625 97150 8 -95579400807125 97158 3 -38339968476457 97167 6 131564293144424 97170 10 1740631919219 97170 14 2568450612943 97170 5 -712198039261357 97173 1 18463996904751 97175 22 -561556546305625 97175 4 169096380087375 97180 1 14243695425152 97185 10 159112537946063 97185 13 -11292837457393 97185 9 -50648023100024 97196 1 -32381307296128 97215 2 141977461635928639 97215 6 -367105292153441 97218 8 -1967736136434885 97218 9 -9725423581881 97230 11 -320830346382589 97230 13 452233365608359 97251 6 -457074860248 97254 10 -7906849124409 97260 4 -2029967183998304 97266 8 -28503531980873 97270 1 -4509661772641393 97290 1 6069837838491 97290 16 478548716499 97290 18 -8270297712473589 97290 28 3868184200527 97290 30 158101025568687 97290 38 -11740571073441 97290 8 49552453259307 97295 6 -6252349202136 97314 16 -173735135818937 97314 2 -9493232601797 97320 2 5978466276544 97328 10 -202276844906688 97337 1 15859946145167 97341 1 8593979949608680 97342 7 -438130727749 97350 17 264518248796875 97350 22 -31689629983775125 97350 24 -6489039377125 97350 29 -14246261234849125 97350 41 -2217720318916625 97350 42 -24660306337625 97350 49 -96967998553625 97350 58 -12507230258815625 97350 66 -4218281421625 97350 75 12115630196201375 97365 1 -634349063096 97370 12 -57843571236697 97370 2 9414781604227 97370 4 698927180130451 97382 1 -13074016309965 97395 2 38612812228552 97405 1 -43747209495352 97410 26 -169491318594193 97410 28 5194655140358447 97410 30 -36812872623817 97410 3 393039718255747 97422 2 -4370039055413 97435 2 17775045431272 97440 13 2352213686463488 97440 14 -2729056121293312 97440 2 -2352213686463488 97440 40 2729056121293312 97440 54 -876004210432 97442 1 86663509629571 97450 3 34156435652875 97455 2 23186549254782959 97461 2 -31186035622665 97461 7 -5202395273880 97468 3 -42767297750464064 97470 30 1943682170111523 97470 37 -940789454639661 97470 43 -343623515300433 97470 48 18765469454394087 97470 7 -12864777870717 97470 77 -52479418593011121 97480 1 -55889701413696 97482 4 68421572624791819 97482 7 -4699330231861 97482 9 -134908654357 97485 2 -211900591659608 97485 4 111299166626131 97488 7 -44682408663552 97493 1 7752332556459 97495 5 -196390016571096 97510 11 -12558776889869 97510 18 1408845430783 97510 3 -180925875263357 97512 3 150493602666592 97515 11 -16857179087481 97525 1 -4508691572125 97526 28 -42326233240344273 97526 29 -5483063086281 97527 1 -3766243931288 97530 9 77814399826511 97542 5 83608625385891 97566 9 -374423969557 97575 13 1895827157000 97578 14 -1584481028337 97600 42 55218732480000 97606 1 42335877008115 97614 16 -2219719856073669 97614 23 359006695240995 97614 28 15667092170919 97614 38 68265568563183 97630 4 -4460257486457044453 97632 3 73618359492672 97650 100 -4188964002002865 97650 104 22504912617375 97650 108 -5468769671625 97650 111 -630033054682298625 97650 1 1690234515493875 97650 125 8361077050884375 97650 28 -1178831581228125 97650 3 -273680248429125 97650 42 -78147807524911125 97650 51 -523620500250358125 97650 52 66888616407075 97650 8 -497671186087125 97650 91 29378930369106375 97650 92 842958937803375 97653 1 2386324832907304 97671 2 -4713361201513 97680 13 -79974777022912 97680 2 146314007300957248 97680 28 -14085980133140672 97680 40 16218334382464 97680 53 3551327146058048 97680 57 17287880973632 97680 62 1185310228211072 97682 7 -70695303027706045 97682 9 997114589857035 97692 2 -70862031059840 97695 7 320203805048811 97698 6 -48904968169049763853 97720 6 -86152161276701568 97728 16 -137761176677586057728 97728 22 -11485445538304 97728 42 707431238144 97728 49 137761176677586057728 97730 11 -4864792380201 97730 7 -870708542969576753 97734 5 9334356711499 97768 4 2183625003355840 97773 4 2116353834152 97774 1 50778108620171 97774 2 171946745281013787 97776 40 521831125051200 97776 43 4396051382697792 97785 6 77165069452776 97785 9 28704596192451 97790 1 3457488752803 97790 2 1877592305763 97790 22 503646331383 97790 24 -915154211219417 97790 5 -16104219240307437 97797 4 -1242798731749 97818 10 -102196739020517 97818 11 47155650523435 97818 16 205002831649715 97818 17 561517388531 97818 20 -18864768791989 97818 32 -73817826769 97818 3 -317689396409573 97818 7 3348094650643 97825 12 -1570590575921583000 97825 1 -4649257943000 97826 4 772696990863 97834 2 2193385574915 97846 1 -16574403225421 97850 15 -463669315159625 97860 5 -61119264738176 97860 9 4858602165152 97878 10 5833181244023 97881 10 -16494707158264 97890 12 8886242476279 97915 2 124058670111883 97920 19 -10261870126272 97933 4 -1377921713624 97935 2 -10111105699217 97944 8 -6258723344854336 97954 1 6341092045039 97974 5 476705124881064207 97974 7 -74565847316876095734921 97974 8 29937007190295 97984 7 72603949257728 97984 9 -72603949257728 97986 4 -161777769709933 97989 1 8195992583472163 97990 1 2072488784219 98010 1 108181927734507 98010 35 -41367711675413277 98010 52 4691977520967 98022 13 -217690110264113 98022 15 -24670748825153 98022 19 -1058235219637145 98022 7 -105261679597213 98030 2 24583367402983 98042 3 -1056579773484537 98049 10 7358767352776 98049 14 -2524057202002168 98049 8 -3472255531465784 98050 14 -192184090233625 98050 19 -1224223730016625 98050 3 -3894446594125 98050 7 -153027966252078125 98050 8 -7780912913125 98064 2 -7030067993280 98070 10 -9023313887173333 98070 13 -58837754306773 98070 18 -15518600623432621 98070 2 9579182232187 98070 30 -7610065457329 98088 7 139855158208 98107 1 -398210257587384 98112 11 7536504055836160 98112 18 -130377655058401792 98112 40 130377655058401792 98112 42 2633001218560 98112 49 -7536504055836160 98154 26 -463159215947592837 98154 29 18066731362875 98154 32 1629993619804707891 98154 37 6039603284931 98154 47 -16971633360585 98154 48 4890042758007 98154 50 12773210083781934879 98154 51 29059109198631 98154 57 1974544904088567 98154 7 458234100735795 98160 1 35893425037888 98160 34 -984739082752 98160 37 -16123006407604672 98160 41 4723661011199552 98163 1 17219213290416168 98164 1 -78391778421600 98175 17 -7127685935000 98175 22 -24724174206935125 98175 2 -40073108040125 98175 31 716625363147875 98175 36 1793366111375 98175 38 -4319300270125 98175 46 46183098725000 98175 6 -35174650320125 98190 10 195185530800716139 98195 1 1442595816827 98210 10 89364790397287 98210 4 172277855622251 98226 12 6567887334663 98230 10 127050770194687 98230 11 -1196743915834417 98230 14 144562540319 98230 2 -29624840305829 98235 4 -182581244072217 98241 4 10602132091091191 98256 10 -7455525458624 98256 17 54980786252096 98262 14 48733121277171 98262 21 -8882533251081 98270 1 1725091554397419 98270 2 -1640219173101 98271 3 -14330796115257 98274 9 -192602827160585 98280 21 -13779318513024 98280 5 2493132403928256 98294 21 -7408597074567409 98294 2 -76831353588717 98294 4 -50767748147796085 98301 1 284629334372114248 98301 5 -1618483908926989 98306 4 -138157155927030421 98310 11 7309389621510162271 98310 12 -1837804002209 98310 15 37927162089647 98310 6 -669180550069 98325 14 -26179786490625 98325 24 -6954655531611030291000 98325 39 40693945401000 98325 44 -53746634803383000 98325 52 58936975059375 98325 53 -151345705415625 98335 5 3861301586536 98340 11 -2483896084529536 98343 10 -1111231906923096 98345 7 -778302706401 98346 3 24242665350625734691 98346 4 1344511441099 98346 5 37537057215827 98350 16 -36163984865625 98350 18 159525187239375 98352 4 -134838662920065216 98355 2 1172919398536 98358 13 -179098430120389 98358 15 -73829436616117 98358 19 -307359386718085 98358 6 148484296126387 98358 7 93003543885187 98370 10 -248159198647881 98371 11 1976681167579 98382 1 -977492983877 98385 3 2510003137648427 98394 17 -1452679174698245 98394 20 829924807285187 98394 2 -1960613593504469 98394 26 965699419569062867 98394 28 -79370380502101 98394 30 50495027901551099 98394 31 422539606744595 98394 41 -289264596508153 98394 8 -186809361866662733 98397 12 -53753173180056 98397 19 14917888790429256 98397 20 -1470756341161944 98397 9 1451335675861512 98400 10 19493487424000 98400 11 -375823406312000 98400 25 -223256956600000 98400 28 -19493487424000 98400 32 375823406312000 98400 51 223256956600000 98406 5 828070693731 98406 9 131327562604239 98412 1 16415374777984 98418 2 21810677649947 98420 1 -1458354184057728 98420 3 13396528458944 98425 2 1320630825509000 98430 11 2776968090863 98430 2 -284987715683265557 98430 4 -96350477313709 98434 2 66102727231496658555 98436 4 336819641539137472 98450 10 1368067259375 98450 5 -126636310631125 98462 1 282593495809143 98469 2 -54129148625880 98469 5 1461487012898760 98475 18 19522382261685891875 98475 3 156179058093487135 98478 16 1907403756502887 98478 5 -70644583574181 98484 2 76446529390496800 98484 3 -23095009639078496 98490 13 -10607949319543541 98490 16 3638526616603434563 98490 23 1186888843105091 98490 2 6478083641665726363 98490 26 -744393917708749 98490 46 8585198806247 98490 52 -78121028925289 98490 8 -3460317326837 98505 3 -657908746173 98525 7 -70005718225209367000 98527 9 66734174934440 98530 6 -3700786965489 98538 3 -3933174048385697 98550 10 -389708941267125 98550 42 31107160039462875 98550 52 -23327182855243125 98550 58 -186617462841945 98550 63 10522141414212375 98550 74 -72434151230625 98550 78 863969735379375 98550 81 302489262084375 98550 84 29726058567375 98550 96 -1152117038498625 98553 1 -3363557299640 98553 14 128227325308840603 98553 22 17299981256111 98553 25 -879511224293337695977 98568 5 -55589588016861888 98571 4 -2639627109538561 98574 11 -12742278399145 98580 12 -7946247221632 98580 21 506796350624 98580 6 -201396524856704 98592 17 1529613076072960 98592 27 -1529613076072960 98595 4 -81492581671416 98600 11 8119175400000 98610 12 56326410201734677567 98610 17 -12301160578849 98637 13 232302553217000 98640 39 -951771508687296 98640 42 1219236059294784 98646 2 139915406869795 98658 13 1490315502743271 98658 3 -315164467269 98658 4 -55196870471973 98670 15 227993845059323 98670 19 5966883126071243 98670 23 4065825034675331 98670 28 131185412131571 98670 32 -26788670410553 98670 38 -31335459514289 98670 40 23575701612871 98670 44 17885218292911 98670 49 -4541713353783217 98670 50 -4816935309810313 98670 6 -31477139909788373 98686 8 3359193935404664763 98700 22 1553592788000 98700 24 19014736292000 98700 31 -608945804272000 98700 37 80032965776000 98700 4 -7046617292000 98700 9 740236043476000 98730 9 -11581990249761 98736 24 -231844907001664 98736 27 458462752117568 98736 41 -29236500542389184 98736 5 1176382206930304 98736 55 36980318647360 98736 59 2611350498509632 98736 74 -49220804119636160 98736 79 7195131049654592 98742 1 696121520662135 98745 4 485972577223811 98760 2 2635329497536 98769 4 1328725989064 98770 12 -41946180960349 98770 18 92780900243950967 98770 19 1699835718629505871 98770 4 -32724862518756213 98774 1 16924196772107 98775 16 16069732425000 98778 3 -366249551448133 98778 7 -134775872815321 98786 2 -579761749304140869 98790 13 -7828613331151193 98790 19 1169265197646584927 98790 23 -19437890758272721 98800 30 128488048200000 98800 37 51188446030600000 98800 56 3985246933122664000 98800 72 1748797640000 98800 77 409507568244800 98802 17 8536649862904088679 98808 11 4127089763456 98808 3 45847320111489664 98808 5 115133292224 98810 5 -99056126773153629 98814 10 -24496627055689 98814 3 -8070229509157 98814 6 540286157280871 98820 4 183934696864620672 98820 8 -6812396180171136 98826 15 2772515102781887 98826 20 -89512254075797281 98826 3 -378306470933 98826 6 -270936460592461 98838 22 -3118340489390469 98838 31 22060359019949751 98838 33 -79192127463723848457 98838 35 24683797925479143 98838 8 25447783518419643 98841 1 -788734233080 98868 3 -85693258459073600 98868 5 -7961000895665504 98872 2 527824014038848 98879 1 7881809043146248 98880 14 -1131590347610624 98880 15 -1119510043136 98880 29 915469922184704 98880 36 -915469922184704 98880 49 1131590347610624 98890 7 1748034135783 98895 4 2681205301381384 98898 8 154458812411 98900 11 -239963811272000 98900 6 109270683064000 98910 13 379484234507043 98910 35 -2231661521364057 98910 38 -3149552991033 98925 2 589593420697375 98934 5 171013941827 98938 1 1065246878683 98938 2 -571522918075829 98940 1 -580905925070048 98942 1 134596905127587 98946 8 -51697670368725 98952 15 -4827037003512704 98952 17 -633776849963200 98952 23 923277278804768 98952 8 164985438118976 98970 1 15460250911556380507 98980 4 -323695600964064 98994 9 -401495194602881 99002 4 -5348647323937 99008 75 1360188584782171136 99008 76 -59102096503504384 99008 8 -1360188584782171136 99008 9 59102096503504384 99015 10 311131301313181544 99015 11 -10146397054249 99015 1 -597462244358993 99045 10 23037639974062344 99054 2 -5249550589605 99056 1 185065240023872 99057 2 32139248865256 99060 4 19887478326208 99066 10 -873401408945 99066 6 -5387155569845 99078 12 575206081380343 99088 6 13184156383712 99090 2 -1732199446976373 99093 3 -11014998992792 99093 7 -348454797490936 99093 9 7948600360424 99099 14 18062553911893128 99099 33 -5698312154699373 99099 35 -4611767435191125 99099 42 5489837205031080 99105 3 -55935879400601 99110 2 -5147028748989 99120 39 -11532405480128 99120 71 -5564512879922368 99130 7 -27905006145753 99146 3 28872175614443 99170 8 215858107472023 99174 2 -175241196701 99177 2 -1304055107837 99180 20 -2678243821262208 99180 23 138266616151584 99180 7 5092163349520032 99190 1 -189670746020237 99190 12 -312135915806261 99190 15 -1161616821255888633 99190 18 513405132759 99190 20 -1491865839801 99190 2 63468798481243 99190 9 24730729728011 99195 3 -60646165550488 99201 1 -62548413045848 99210 1 3825715557589147 99216 22 -59815502419392 99216 34 137372690698560 99234 6 -14406729594093 99238 6 125026580367971 99242 2 -14352012097957 99242 8 -44050723527852549793 99246 15 -599487679281205 99246 26 -3320611194041 99246 31 3464388248831 99246 6 590156298955 99261 1 -6688663144632 99264 11 4415441089406464 99264 27 -7301729829376 99264 47 -4415441089406464 99270 26 -8070023539089 99270 5 -786204511464573 99270 7 -68545135013157 99275 1 -277633133609950125 99280 23 998853135591744 99294 15 -2171820481849 99294 2 4088801532761083 99295 2 -99296568792 99309 1 13122959201155 99324 8 1670754907075104 99325 1 -1523455844239125 99330 11 2123535548208691 99330 12 -8045059662989 99330 13 -1491371791181 99330 16 -5253265250549 99330 20 -13842956518453 99330 22 82912861256723 99330 32 9389277919979 99330 33 -284663252784709 99330 35 -1184690099629 99330 36 1461757366208411 99330 46 -6001995302414317457 99330 51 -1862561608433 99330 52 10215429070447 99330 54 113472047533951 99330 65 2699088183863 99330 71 4716672277359167 99330 83 -19636750834849 99330 9 -297684334435546997 99345 3 -600376295861 99345 5 574703512954055731 99345 9 1287038386952 99353 1 45797966706483 99360 17 -1730234216383488 99360 19 1217771613972288 99360 24 -64082748754944 99360 25 45102652369344 99360 29 1730234216383488 99360 32 -1217771613972288 99360 39 -45102652369344 99365 1 3148951991023 99372 14 -3009931687389536 99372 17 -674568028202397056 99372 26 -91128071293007840 99372 49 4790932674268832 99384 2 -95965881858368 99385 1 60614965683 99390 2 435609658963 99396 3 492356771865216 99405 15 6195974847276699 99405 3 -421268029454232 99405 6 197261380698003 99405 8 450263131851627 99405 9 -13170470880109977 99408 20 24366721112371072 99416 9 531784547206848 99420 4 907608782141056 99424 2 -11928306336629760 99424 3 11928306336629760 99426 10 -13558205478169 99426 9 -9606362236073 99430 3 -71290778217857 99430 4 -11000692073737 99440 4 -18345676862016 99450 11 -28324581643125 99450 13 -336198571309125 99450 15 -8378622811125 99450 25 975168322936180875 99450 38 29387115943875 99450 48 217561041196875 99450 61 764763704364375 99450 63 1385328909375 99450 64 6891952395375 99450 70 3279875261097375 99450 78 598314792945375 99458 6 -10598770965348881 99462 10 -612099410568173 99462 23 2701624793699359 99462 27 -1195667435105 99462 30 -10082830602977 99462 4 -613738905957485 99462 5 -3109215823508069 99462 7 1591433356124755 99484 12 2973710093248 99484 7 -36719179474816 99484 8 250549274810304 99484 9 -5431606302016 99498 9 9569712765334231 99501 2 3910903099912 99510 22 -5826693927674681369 99510 3 -218959531346573 99510 4 -30680484377669 99510 5 162509271409847398771 99528 11 -436501690440128 99528 17 -166015871518805056 99528 2 78153853710304 99528 28 6279009793538912 99534 1 -97355238485797 99536 7 1458530787052864 99540 13 3104095577740518528 99540 25 -7610913084384 99540 7 -399733238812032 99546 2 -22935451226885 99550 1 4933374702875 99550 4 -264587107628125 99561 4 24759159647111 99568 5 -68456929705920 99586 3 41262339775555 99590 1 3378571201352323 99590 4 -5632436721349 99594 11 -130220322819390657 99600 57 -458406401912000 99600 60 141885339400000 99600 68 -28951058584000 99615 11 429467829704 99630 14 -2412189858444957 99630 28 147415267816623 99630 29 -3209545893537 99630 36 362055200381703 99630 47 89340365127591 99634 1 -2219402961549 99636 2 -850049520397696 99645 8 3063921800239 99654 3 78036140287 99654 6 -156157384528009 99660 8 -34493729034592 99666 14 -2033265635431821 99666 34 -950477269963473 99674 11 39009600342927 99678 2 7884495337483 99682 4 -37654467296938765569 99693 6 -46280899637217 99696 8 -82852143873472 99702 4 29692646795187 99702 9 489934821443175 99708 1 390054470843008 99710 13 82306966730651 99710 16 -5750880419349 99710 25 -1822694829401953 99710 29 -30530354411089 99710 32 -2492221350174049 99710 9 347926996722851 99714 4 -20503581752897 99715 14 -54737776162349 99715 8 -2735314736643579853 99720 5 -45094174490304 99726 5 -7116607896193 99729 1 275244316094259 99759 2 575320930190155 99760 11 9654742700352 99760 15 1775417514848064 99762 7 -2288736959833 99774 10 -148505525410005 99774 5 15240668724675 99790 2 1039749357450267 99792 13 -21697129814688 99792 26 585822504996576 99792 58 -64936016834095296 99792 59 1241656128 99792 60 -10911401535168 99792 65 -198843136182720 99792 67 2405037660522048 99810 10 -16196412821748777 99814 3 591088484142415 99820 2 -10627282076032 99820 8 2805096002176 99822 1 -339106357515437 99822 4 10609008656240627 99826 1 -207879524993141 99828 1 -8214214128057216 99834 14 49021864042879855 99858 12 -4163157306917 99858 18 -2283866181233 99858 22 -130175684029889 99858 23 -2816386257041 99858 27 229296265046567 99858 28 1001556913376303 99858 35 3788673350975 99858 36 71658364767263 99862 1 -812023372205045 99866 2 1490393999115 99870 1 1864870796467 99870 9 36977167423 99876 4 231771004731008 99880 3 104885327653056 99900 4 -1437266420604000 99915 2 140365581248303 99918 12 6750891785285955 99918 13 -155824540461045 99918 22 -29147374500906087873 99918 25 9921699837403907463 99918 27 3252785877580959 99930 7 1040225844332647 99946 12 10159543110079 99960 1 616634676316288 99960 22 900329298226757056 99960 30 -184997686629952 99960 34 -88074674454592 99960 4 14322524743072 99960 58 -181189222680032 99960 69 -104851761311550176 99960 78 596575332013840928 99960 79 6271533264735872 99960 96 -44206450803424 99970 4 -5757758504649 99974 8 -117105901932529 99975 9 63823287696875 99990 26 -7820006447529 99994 11 59375237009021271 99994 3 -38527667770301 100010 5 750868807102382871 100010 9 391520113403831 100011 3 10097668369864 100026 2 -3201288549508989 100048 5 585828851879232 100050 12 -101328152184125 100050 29 101980285242875 100050 4 -131061045501125 100050 45 117084769719691375 100050 46 925411626184375 100050 59 -47701945313483703625 100050 65 -636268541559625 100062 12 -3683750806377 100062 14 6704190364167 100062 3 -181013139832509 100068 4 364412357224064 100092 3 -80382416808160 100095 1 96701764436803 100098 6 -142280269045209 100110 10 -2509688295361 100110 12 2743152112151 100122 10 -4548949707689 100122 1 15883423958395 100122 13 -962587765301057 100122 18 -7996037940507241 100122 5 -15442831875565 100130 9 -85864572952497 100149 1 -5615882468792 100170 17 25527145445451 100170 31 -4155554425401 100170 34 -2423983405346217 100170 4 89777163160971 100188 35 -122149132760160 100188 40 -9935930661291360 100200 2 -15000486812000 100200 27 -235014472844000 100200 36 61716816080000 100212 6 -116788591870784 100230 14 279816320328407 100240 13 -186227045444601792 100240 25 -325308463457984 100240 28 3697372208069504 100254 18 239889900694283 100254 24 55126330055728883 100254 25 1635218245619 100254 3 21607798083067 100254 52 171206061618458503 100254 56 -1054485863308297 100254 60 -58723679135131266529 100254 71 -335896525041553 100254 73 373684799987639 100275 11 102733294929875 100282 10 -764618355244225 100282 9 -21452952445777 100284 2 -318948651064160 100287 3 -376869806017704225 100290 1 -402842303533 100310 2 22642643633026383 100320 21 421401370112 100320 29 3910506708800259584 100320 40 -275207681212928 100320 46 -3910506708800259584 100338 10 -703780182675629389 100350 19 -72859232953125 100350 23 4936344108622875 100350 2 -56706672412125 100350 27 -43864214044951125 100350 30 -38195863453125 100350 49 -344505768185732625 100350 6 195981694684875 100350 9 12759472895767875 100362 1 -9022050074429 100366 5 84583499562703 100368 46 -120573839335104 100370 3 -1569974514993 100386 15 1600123011418035 100386 18 -1853204826971277 100386 35 14666749955858403 100386 43 68637215813751 100386 48 38094190629183 100386 54 -543212961328089 100389 3 383203872702584072 100398 11 -8244103429529 100410 11 -2668612516614937 100415 2 -1686237126187753 100416 17 -18116291036672 100425 8 2434886525609000 100430 14 -691345959919461 100430 28 2764541263364639 100430 34 1037316834602191 100440 16 58491272822976 100440 4 -15421198955328 100450 17 503109723221875 100450 39 266012527232375 100450 53 194751944489375 100450 54 454328803667375 100450 57 -30281137385625 100450 60 -1380533080520825 100450 7 -172566635065103125 100452 1 1130564907775648 100452 2 5535371311264 100455 7 14417644630139 100464 11 -248492980525600 100464 2 -67587872590832768 100464 32 33931721887552 100464 33 410796044220736 100464 42 -12004913717189056 100464 45 -10444335329728 100464 50 2556062144000 100470 12 911606050927 100470 13 -50705195660873 100470 18 6105877526757743 100470 2 2311321212811 100485 10 -73961662929237 100510 3 -86879649878607133 100518 2 -1533810101293925 100555 5 -61352949998717 100560 3 -53465045747662554848 100562 5 9769593418327 100566 4 -21425445712557 100575 17 -12265193998125 100584 1 -41967648154944 100590 12 -3145493894633 100590 14 -258020465417 100590 21 3925344580986063383 100590 24 -1275740954900497 100590 26 23210034118487 100590 4 302919141037771 100590 5 2937642838523 100590 7 -24821830892053 100590 8 1920583807883 100608 28 -567179713691648 100608 42 567179713691648 100608 7 70897464211456 100626 3 -86167585211761 100630 6 -5829206555917 100634 1 489741478733691 100646 14 142534224091791 100650 19 -378406617653125 100650 20 -1352281781801125 100650 28 69173320632875 100650 2 -949336575678125 100650 35 2783867710191875 100650 36 8644203952843375 100650 44 448141484283151375 100653 4 1554815035370087 100656 13 371210943659328 100659 2 3882715076872 100659 5 -18651724362136 100668 1 -89955018288224 100674 10 -680760438525 100674 11 -6943659111549 100674 12 491680706785227 100674 21 4076035452151011 100674 26 991189548854064027 100674 29 2059904200887 100674 30 10850913605295 100674 33 1329890758911 100674 36 -37023159120417 100674 37 -920794986558638073 100674 4 -1092118127714109 100674 41 19549895716791 100674 42 -11678626525455513 100674 8 -2227707265989645 100674 9 -984830939973 100686 5 -286258465551833 100695 18 -3067655867919181 100700 7 -1982413516204000 100702 2 -130247684042869 100716 5 76749901271072 100719 8 64163304429039 100724 1 -278866490868576 100725 3 4486328569000 100734 2 125508854295467 100740 8 168661163865248 100758 8 -20556617250457 100782 5 -25179464799045 100793 16 39414572324049384 100800 169 -123514059600000 100800 173 1373865762240000 100800 267 -26905348800000 100800 289 42041712096000 100800 321 2243928133152000 100800 360 -2243928133152000 100800 407 -1373865762240000 100810 3 -82566602714709 100815 10 25843877022952 100815 4 2883841208587 100815 6 1179649699912 100815 8 -68156305635608 100819 1 -13892787292301 100833 2 -14804118868589 100848 7 1293879107824480 100860 7 58648757381305984 100870 2 -46159540599538470077 100878 3 -1071575575903781 100880 16 32375757054016 100881 1 -433767545496 100890 13 -3353858224101 100902 10 -611243490385 100902 4 -201188310845129 100905 1 101410001356168 100905 15 -331724784065473 100912 32 -3104007518342592 100914 6 -148018870164077 100920 20 -359209618779578176 100920 2 664378921882260928 100920 26 825394715210368 100920 32 -14728345515584 100925 2 -15164029823059000 100926 13 -1648707767155665 100926 7 -1013596745589 100926 9 61063250635395 100947 1 -297197144 100947 14 -10663768151121251095768 100947 2 323695 100947 3 31217635 100947 4 1109630152 100947 5 784479592 100947 8 -118167288697025 100950 6 19682516571875 100966 1 -5411821397725 100970 4 -364272872378993 100998 16 -37659627671193 100998 7 -3629064487221 100998 9 -556298297801892909 101010 11 -60730336329389 101010 18 -710242474213 101010 20 -5258877046703744437 101010 21 38865775171330619 101010 31 21114057610648423 101010 34 166222802173303 101010 35 9064246635221023 101010 48 -230442355257696217 101010 50 -22052983877497 101016 8 20293670696132160 101018 3 -535916904150357 101024 13 -1089872559936 101024 8 1089872559936 101040 11 -96420783448060352 101040 24 -156230088838336 101050 12 -516805928393625 101050 4 -12949507324125 101050 6 108679500970875 101080 23 2223962060571936 101085 3 -21857357102664041 101090 3 -30439784152909 101094 11 -768564041185961 101094 12 5213759363010199 101094 21 -23892548164057 101094 5 -110481750261030077 101094 7 -361913793171461 101106 10 -5376933078698853 101106 31 55421722784151 101106 9 -837339292989 101108 2 -6423586852320 101122 3 -738683055792552933 101124 15 7994722712605632 101127 2 -17213118096149 101127 3 -671280073777 101136 22 77893883378423668211264 101136 52 -9334645776806336 101136 73 1594716342099776 101136 9 -227095869907940723648 101150 20 -3877933493880125 101150 2 -111442409911125 101150 33 -1527479498368125 101150 52 -5133950563738625 101150 56 615453167523375 101150 70 24312129287134375 101150 8 -224713845587125 101175 10 -56545019601625 101178 17 702976192428483 101178 25 -4382996038850673 101178 3 162333186624099 101178 32 47474063282295 101178 40 -5231196065745 101178 42 -38976703946361 101178 5 -11847087741285 101184 2 -57829137180416 101184 27 -18187252272640 101184 30 57829137180416 101184 7 18187252272640 101192 5 -14241824623438560 101195 1 -9398859785272 101200 24 -25886711888000 101200 36 230159528200000 101200 39 34560239660000 101200 42 13683939952960 101200 47 416685363048000 101200 66 1710492494120000 101205 6 11997418157928 101218 4 14327037777689047 101232 24 4355506963008 101232 8 176520504712595328 101234 2 -145711235609541 101238 3 -630313433372413 101244 1 145034115715360 101244 7 -804054896679240064 101255 17 146336508540424 101270 5 36342059056263 101278 1 70358582260855 101283 15 3157316549135 101283 23 -57155880221272 101283 8 -1082959576353305 101296 12 57295990999872 101296 7 26504016657984 101298 3 -387337502011393 101310 15 353038254368383 101310 17 14228842446919 101310 19 -423762597742841 101310 6 -958084111421 101346 3 -211043601928333 101350 3 147611383165475 101350 4 18451422895684375 101354 2 688047704459 101360 21 68708339981632 101360 29 14111148146752 101360 30 -734514171913152 101360 44 -477026138297024 101364 3 -21771358101568 101370 19 -265115254813610617 101374 2 -23189633136909 101374 3 -2644319871607149 101388 2 226191577303998496 101394 15 1813148251407 101394 18 818528079303 101400 43 -1142173011772000 101403 1 1216702536378408 101403 6 3558458368584 101430 106 -298322337733497 101430 115 22577252065077087 101430 121 1609488817226734311 101430 123 -871513653593961 101430 128 -2648942916921 101430 129 -318238669300041 101430 131 16902503851758399 101430 13 14080746852081819 101430 139 726877174732191 101430 140 -127039668792561 101430 19 22991442754707 101430 21 -115879933490013 101430 22 -3448112426779797 101430 26 182986446013584003 101430 35 16625584937121363 101430 46 -354875378854941 101430 53 -866842030493901 101430 57 -533488180797621 101430 69 6962281987059 101430 71 -2852817830431821 101430 7 -442231760026917 101430 78 -521509142669697 101430 84 11940257520726759 101430 96 -149505380737713 101436 3 170093201402528 101439 15 -171832803981912 101454 3 30626700426683 101465 3 -180173442843549 101475 13 -391516935692760 101475 19 1812578405985000 101475 25 -48939616961595000 101475 43 712218714169280040 101475 48 359588060181000 101475 58 -94497654375000 101475 60 89027339271160005000 101478 10 2616492537719 101478 11 -1959617172241 101508 4 299910145694624 101520 44 -5611573232816544 101530 7 16146201496859 101530 9 549940549339 101550 20 -5899503849079625 101550 31 -148391729898625 101550 8 -14016161178125 101552 6 -7764753375936 101556 11 230485392728352 101556 15 819258010344864 101556 7 194608442311200 101558 1 312278579 101558 3 123520895920835 101558 3 1930016523491 101559 3 1141139502856 101565 6 -28089228676248 101568 26 -2827563611507200 101568 59 2827563611507200 101570 1 721411934243995350070947 101570 6 6850804908001400711 101575 3 -1219291883253125 101575 6 -9754335066025 101577 11 449191112349448 101592 15 1265671787578560 101592 2 -175794652342656 101592 9 9381489800832 101598 2 -60334804600684613 101598 3 -11057476834025 101616 13 286323970112576 101622 1 416426931133795 101626 17 -215855179609321 101626 30 -2958435905481 101626 7 -11853290417889277 101640 27 75680683255232 101640 29 1231239223795328 101640 37 15263775666656 101640 44 3460225858838848 101640 50 1256961681642304 101640 56 -6097887630812384 101640 58 -98915519976707456 101640 66 337376467153088 101640 67 -2072500696288 101661 12 -1233235467417304 101661 3 710988932913139 101661 7 -17491971621601 101670 2 4249539517267 101674 2 395573075040699 101680 20 1172814329358656 101680 21 -15101923900096 101680 25 -22088657357504 101680 28 -34499880213696 101680 29 129467084422464 101682 12 -363404381733765 101682 23 -93861763010217 101694 2 208624259927323 101695 3 -98943454863288 101697 2 -3324980023359769 101700 16 -13549352775984000 101706 6 25039293129071 101710 11 23151603559967 101710 9 2811481199225623 101712 5 -40211346557888 101724 16 -153504158860864 101724 9 236686873876768 101726 1 7358631616683 101730 13 3768189074407 101738 11 172048349548179 101742 1 -1715118177869 101745 18 -55883913406497 101745 25 344179741717503 101745 29 4971673056456 101745 31 559935359903079 101761 6 129591237339080 101766 2 22067125478803 101775 10 112187492950600 101775 16 14023436618825000 101787 4 13860239327299 101790 17 15530115534939 101790 21 1118725679325443571 101790 36 -30433842738441 101790 38 -41434284419460873 101790 45 3265183721890719 101794 6 -5782837394249 101798 4 -4198056986772217 101803 2 -8802120172717 101816 5 554772584384 101824 10 -176348485407744 101824 2 176348485407744 101840 10 958477513460032 101850 14 -303528156678125 101850 16 -2582144701848125 101850 24 -11839342892439565 101850 29 654763135578875 101850 33 318001402104875 101850 37 37748200596875 101850 42 2906622186875 101850 59 5886143667472375 101850 70 -1479917861554945625 101850 75 -20657157614785 101850 85 -2608290357625 101850 86 -2428225253425 101878 2 -590049979019577 101878 5 8548977843559 101880 17 102872748454848 101882 4 83558479824523 101885 6 -8660671343385272 101889 10 -143711088478497 101889 8 216264126760200 101898 4 -12855933426933 101904 18 393665081646592 101920 15 56982067278976 101920 33 -54547341565248 101920 42 -56982067278976 101926 6 2764272718686151 101934 13 24464305823679 101934 16 3693015358983 101934 3 -119127633011757 101934 7 11541765828447 101935 4 -2909149560974744 101952 2 -143043029457408 101952 31 3862161795350016 101952 47 -3862161795350016 101952 53 -5315696119296 101970 1 -643170423087837 101970 31 -1262938616937 101970 38 23821126781031 101970 51 -4866975526346361 101970 53 25378760746791 101970 56 23698798230519 101970 60 -20659537844251281 101970 8 34099342657299 101976 4 -66900033361216 101982 7 11436233517775 101985 1 2578503344968 101990 11 1294996319921331 101990 12 2046859196372047 101990 2 600435497768723 101992 1 -127384462836000 102009 1 869441853752488 102010 6 -4033997284394321 102018 11 -160443131620933 102018 22 -9131826896489969 102018 2 974474981244163 102030 1 -251580164813 102046 2 25465112168931 102046 3 -455988350533213 102050 19 107643763434375 102054 1 -23520706540505621 102068 1 1811722839797888 102075 6 1066965445000 102076 3 856918456844320 102078 13 4492530408807 102078 2 9352286200955763 102078 7 557113356788859 102090 16 109428004207 102090 22 -82170406716697 102090 9 -386890853239333 102102 11 19999937065555 102102 17 -140523321090781 102102 20 -17380130451445 102102 2 -174659273333 102102 22 -5607277747525 102102 23 -17935205655244301605 102102 34 -12312500006897 102102 46 -3277115082305 102102 47 907925417335 102102 48 -3781138510241 102102 51 14730064644023 102102 5 -5432330437253 102102 57 -8664654243673 102102 8 10445165961931 102120 16 -1913554122723424 102120 17 4725273270592 102120 22 16891553836576 102120 29 -3393432891712 102120 35 -2342101136669056 102130 2 10984518883603 102131 1 6731552900744 102138 1 -31180535591205293 102138 6 2280167041715 102144 1 -1494117769472 102144 28 -11952504264448 102144 7 11952504264448 102145 1 -21069272853368 102150 20 485903653875 102150 3 -60298146694125 102150 41 -97234830158625 102168 11 6470851368384 102168 16 -174712986946368 102180 1 3146230997632 102180 17 -14580801394912 102180 3 -10812446757728 102186 19 -319439656926657 102186 7 -4919694172749 102200 17 295312960088000 102207 3 2136873605460623 102228 1 259319264738752 102238 1 -1309322980418581 102240 14 -33237854928452736 102240 19 18358069196736 102240 20 71422597587456 102240 45 33237854928452736 102242 4 253210430159 102243 2 -22635839028536 102254 2 -8143566764381 102258 13 -76468393200213 102258 27 -27174714928425 102258 6 -1628667756618800877 102261 1 -20203427171672 102270 11 1975851448327 102270 15 -8579800402433 102270 22 -9036369599489 102270 23 2754921630014567 102270 25 357236438836546583 102290 2 -314708754669741 102300 18 36893109860000 102300 9 -162666259964000 102306 14 -1014834429625767209 102306 18 133456210588223 102306 20 5872735954295 102310 3 130854896011 102310 4 -119635861903741 102310 9 41018686941023 102312 2 599389031957184 102312 28 451054217513088 102312 40 3557912410398528 102327 1 -1779254848792 102333 4 665013480328 102336 14 -3632770458368 102336 22 -27921880008262144 102336 25 77995311421760 102336 39 27921880008262144 102336 41 -77995311421760 102336 5 44052785873920 102336 57 -44052785873920 102350 10 55044560404395 102350 11 454730398431875 102350 21 3637843187455 102350 22 -899857497237625 102350 28 6880570050549375 102354 1 -111031347902453 102358 1 1270221354099 102365 1 -63984570301944 102366 33 -512504423590401 102366 43 36520012239975 102366 7 -14096692352544813 102366 8 309917395371093939 102370 3 1619238711871 102378 1 -494284389080021 102379 2 154025196840 102390 3 -186376366791757 102410 14 3620699123472179 102410 21 979740693953091 102410 30 -2117807791650901 102410 45 1593408339896247 102410 57 -89495886977441 102410 61 -2418586065671041 102410 6 -1241899799350957397 102410 71 -4645505364129 102414 4 -17248194453540869 102420 3 34956336233088 102426 2 39899518017796819 102426 6 301414368983167 102446 3 3394530083512079 102450 13 899595357875 102450 9 -1518279905125 102459 9 680302609143976 102462 4 -26874212034869 102466 3 -2152369127845 102466 5 33394383992143 102480 16 2148893009569664 102480 17 1735803748736 102480 18 -317648584870336 102480 28 2403098357248 102480 35 -5556739658912 102480 37 30526953724995904 102480 51 13743147565429568 102480 52 -530113665481408 102480 57 9155061744704 102480 61 -13960752182455744 102480 66 156073664476736 102480 8 3197052612185536 102486 2 247728396167 102498 4 -13738652073701 102510 10 4549873543191 102510 12 -9038583388423881 102510 1 334762347719403 102510 2 -122846585666157 102510 27 -200895685549209 102510 31 269503119771471 102534 7 -10920276505 102544 13 -11307441255616 102544 14 -1678883667904 102550 19 -686953291625 102550 25 -116923173090625 102570 2 49836186067283 102570 3 29792797674947 102578 10 -271076190149393 102582 13 -162101778610725 102582 7 -415854387235701 102602 4 -7520184328538076777 102606 1 -4240829977685 102608 5 301756404191616 102630 14 38890316660105694743 102630 6 -18693053840557 102645 3 12634190700219 102650 2 -50484774242125 102660 10 129525459755552 102660 13 224955518840864 102660 14 1008965247256736 102660 16 181607243697032530976 102660 5 93430275459616 102660 8 -86999932577152 102663 7 7959047004279 102672 11 22163319855072 102672 35 26531320564279872 102672 48 41082372217152 102672 52 -7171480908513216 102672 56 206314589782080 102672 57 -60010556460480 102672 62 -117868831017408 102675 12 696560048065000 102675 3 257481203761000 102678 13 -1189227507931112705 102678 7 7054695052379 102684 4 -5269250578816 102690 11 243035994870747 102690 16 -553265805429 102690 23 5694163047063 102690 25 150050498190543 102690 28 6735036694527 102690 32 2780454017234846531727 102690 37 -2235080657385801 102690 4 -5557425858909 102704 21 5893437261376 102705 2 -7803491429451437 102705 5 -24077517434369 102711 2 -28581492941749 102714 10 651988088219575 102714 13 -84588663753556649 102714 14 -1962241103249 102714 20 -3874886924676985 102714 5 -37343232034381 102714 6 1722024142667 102714 8 -595723927301893 102717 3 -72701676526104 102718 10 -411191838089621 102718 14 -16595412594635321 102718 9 3793822159427 102720 11 18648003277504 102720 28 -18648003277504 102725 4 -1011907996091000 102726 12 -36815906360418921 102726 2 -74478362756608250253 102734 2 -4188213796473 102753 14 146701393418664 102765 16 445788502209071 102765 17 24654982752431 102765 1 -93700654886717 102765 9 439710308682319 102790 2 -33835928766317 102795 1 -378647202448574648 102795 5 13050385413977843 102810 11 -49022316940141 102810 15 -29843049568553 102810 18 1221160395007 102810 28 8523509344734652343 102810 32 -155574748180801 102810 4 5769987066523 102810 8 11788512836419 102828 3 77352123629728 102830 11 3804525333279 102830 8 161644869586143 102834 2 -185900063860989 102837 4 -421444639736 102848 3 4795072036352 102850 24 3029939055124795 102850 35 1147957939321875 102850 44 -554159479988125 102850 62 211099563592787375 102850 64 -22652329093546625 102850 78 -140772365655625 102850 82 -2400735177465625 102850 85 378742381890599375 102858 7 -7038630508837465 102860 2 -17150834079584 102879 15 -3093116809584717 102879 21 10704076641243 102879 2 -52597931183828757 102879 4 1948071525326991 102921 1 -141652968759224 102921 2 -980166233969 102930 1 12035355225615307 102930 14 -111986380781 102930 15 -281636002171781 102930 16 7809062344291 102930 17 13076231561011 102930 24 -584404503229 102930 34 115178548155983 102930 36 21226160919959 102930 8 -569415723029 102942 12 -14075225551701 102942 16 -327428253011061 102942 17 2889106406276427 102942 20 -2682878769887373 102942 34 19146633216255 102942 37 -2293351834356896697 102942 39 300195057129183 102942 43 -16499207351868921 102942 44 -12538273489087977 102942 47 18182743460055 102955 1 -30505854569176 102960 103 11245213910592 102960 111 8827708058074944 102960 114 3501787304889216 102960 116 -486966923545536 102960 117 582491797349184 102960 16 -319845297420576 102960 31 -208820986739136 102960 52 163277093639232 102960 68 -19001888259264 102960 6 8635823030355552 102960 74 1516819980161088 102960 80 104528371295808 102960 91 -459398303356425408 102960 93 -141587047291392 102960 97 -5414317379529408 102966 19 12862047831513175 102966 24 486370110828063455 102966 8 11237780960950139 102966 9 70101216756323 102971 2 104129678875112 102975 7 -207034374815000 102982 3 366088506011 102985 3 49312562704424 103005 10 -2476341224277381 103005 17 66861213055489287 103005 9 59916281578056 103010 5 48876834023191 103014 4 -12475146974985 103020 9 -70887884555872 103025 1 37317980056375 103026 1 45671095083979 103026 15 2408000378209343 103026 9 1212393851230519 103047 6 -11294865106840 103050 34 -137016018500625 103054 2 -1809317319893 103056 12 26979902316352 103056 21 -6123210672320 103056 22 -57939637234112 103056 26 -3597672680128 103065 1 -2843085972401 103071 4 -375059785140377677 103075 17 -1581717635000 103089 3 1981505655431 103090 14 -2398856963161343113 103090 9 -5270288748065470819261 103094 1 -323068260235437 103095 3 327681983356488 103103 6 -348658060024 103104 20 91420647611904 103104 46 -91420647611904 103119 3 -359023856047381 103155 12 -114686006496121 103170 4 -10053614168353 103182 6 152493374520235 103190 6 -530252895565809 103194 23 7645008241395 103194 41 -13978215493893 103194 69 377411818335111 103200 36 -48696823360000 103202 2 9929872315672449463 103212 12 -118828800468864 103212 5 7304958006912 103224 7 1276355558011040 103227 1 -1626336363736 103230 10 3497026999203 103230 12 1991650662818091 103230 14 -282177636909021 103230 25 -13724278887393 103230 3 23321858585427 103230 4 6759778415067 103230 9 28614164051763 103246 14 -2644393335541569 103246 16 -1698824718125497 103246 21 16659408052223 103270 5 -5931560984134681 103275 6 58211363559375 103275 8 -1571706816103125 103281 2 -14808323343160 103290 13 -2406319956902753 103290 18 -3798602981953012153 103306 8 -254823736609 103320 20 -36739188376416 103320 25 8355212006688 103320 5 -4714492920192 103320 6 -67233647891808 103323 7 38749771445389064 103327 2 52013964471577704 103330 1 -610895600973 103334 15 31822473685211 103335 2 19844620613169832 103335 3 -1224987543776717 103335 8 -671285041881688 103341 17 -98061579417592 103341 23 227881486420343 103341 6 -78163349842177649 103344 15 -1031638502080 103350 17 -898015458782125 103350 23 -8539148153125 103350 24 -7818454478125 103350 28 66542501248746875 103350 40 532340009989975 103350 49 692642016245375 103350 4 -99486890217125 103350 50 -4538222774358625 103350 51 134742940121375 103350 52 -61803562868619625 103350 55 -157836902294229625 103350 6 254338022708875 103356 9 -17669879240544 103360 48 -22179313617408 103378 4 321910881126975 103386 2 -11110181254181 103390 28 -8016049976842593 103390 8 132894070315363 103395 3 -163313919924208856 103395 7 -226195512551128 103400 23 -1716859271664000 103418 1 -27475702051013 103422 1 -8384272536437 103422 2 7411141382059 103422 5 -2502189362053 103422 7 -6468524119197521 103425 12 371495141363375 103425 17 -1943884520425 103425 3 -242985565053125 103425 5 -155936602615625 103425 8 46436892670421875 103435 2 -114213416384952 103440 32 -76249472125888 103440 43 69747736537664 103445 4 -6691138647373 103446 20 20294626380111 103446 3 918719318691 103455 1 -205531598502648 103455 13 11637033879621843 103455 4 -111684744966168 103470 1 5887457729364691 103482 7 -167688094844313 103488 137 -767559589217792 103488 226 410366981975552 103488 232 62092800514304 103488 24 -410366981975552 103488 35 -62092800514304 103488 71 73567098708992 103488 98 767559589217792 103494 4 -1744347179081017 103494 6 406286688278303 103506 2 -2678942998473821 103522 1 17344983682855 103530 13 1456555982018003 103530 1 -3849316908317 103530 15 -15943936357621 103530 19 5070052972979 103530 21 1622299016771 103530 22 -1228380019021 103530 23 -10639693815661 103530 26 -147483453587232421 103530 29 -8089120284888257 103530 30 -339384802553 103530 31 1661384777023 103530 37 905018428999 103530 43 -3288549891331153 103530 46 -48822679966033 103530 48 187948025115551 103530 51 -32746176262801 103530 52 24407834591951 103536 10 -8249562659520 103550 12 3763169142317875 103550 14 10250041400875 103550 4 389980358342875 103550 8 215284106302875 103558 4 -19607610346605 103566 10 -438509215577969 103566 2 116294894475355 103576 4 7120291251803573888 103581 10 -346247943027192 103581 9 64787627469672 103590 7 -706898965099869 103600 30 -14962442048000 103600 33 10331043157244872000 103600 48 -2282469400000 103614 6 -135567204350005 103614 7 26685825676871887 103620 11 -2231456387828608 103620 7 31761123854464 103635 1 -182115657308088 103635 15 -2248226692691995197 103635 23 181238542765623 103635 5 4917122747318376 103637 1 -745094194424 103650 28 -6201649242128125 103650 34 -75032196259625 103650 39 -49613193937025 103650 4 -92790660753125 103675 10 130858982333000 103675 12 1082026411757875 103675 1 -24061815539000 103675 19 6957576917000 103675 37 1980902925000 103689 1 -20096387933400 103702 5 55972803340511 103722 4 -1047309120073 103730 10 -863083440905381 103730 12 3022615671531103 103730 6 88945916372891 103733 2 -74634745537016 103740 12 -3055579353314272 103740 4 34974403813504 103740 6 -43191363744830351744 103740 7 -2938432913632 103768 9 -56146749791040 103770 3 80913190569867 103774 3 11104783493353115571 103774 4 10685227073435 103776 4 -10306623320576 103776 5 10306623320576 103782 23 -3311919256397185 103785 14 -2974322701873 103785 19 306994557752747 103785 7 -422551279054593944 103800 30 455768141840000 103806 6 -2548167689303721 103806 8 3213970930371807 103824 23 78426817250211648 103824 24 -2904696935193024 103824 41 7663282520558400 103824 44 38280825046080 103824 45 24424841018880 103824 54 -33418903285440 103824 57 -579884113692864 103831 2 1336793686854003 103845 13 13823745590411 103845 16 62763083669159 103845 2 -3260862371054933 103850 12 232945614137375 103850 6 1211704845875 103857 1 -1455121993112 103860 16 230049686406816 103866 6 -1147534802978369273 103870 6 -5028751667061 103870 8 -983638820737 103878 13 31490454987063 103878 20 4557193692903 103878 24 -12792800803274937 103878 25 -487132417582137 103878 26 474486318269538831 103880 10 -157570673345344 103887 1 -135511394286456 103910 9 28661341868624879 103914 6 -12844201252689 103914 9 28624826340639 103920 28 -433455995584 103920 7 376297946120304512 103920 9 -3538013763407552 103930 1 612503186923 103930 4 26720792683768387 103935 12 -2659195175114296 103935 13 2002905856882619 103938 2 -54065901371869 103944 2 -1540778525393984 103944 5 -53771675258944 103950 107 1399428326145375 103950 116 -90870003815625 103950 143 -969362513204625 103950 150 -1635659753540625 103950 162 8310151209375 103950 166 -20427132017183625 103950 170 100218792810375 103950 179 -189098119214348625 103950 186 -87421831358625 103950 191 -63905233955625 103950 2 -566946415378125 103950 31 35902315303875 103950 36 7003634044975875 103950 41 -9569395738125 103950 4 -2705907405880125 103950 64 -51830678746125 103950 71 -4016369483434125 103950 74 -6743092627125 103960 1 -606724480268992 103974 12 69908310183635 103974 15 24524632855 103974 5 -9823462287029 103974 6 1361539507180715 103984 3 111213549577792 103986 13 6398070820493507487 103986 14 123442395054471 103986 16 960905607840711 103986 6 8286978532275 103994 3 4904626993950735 104005 7 18062822936541896 104006 10 -23944319659945 104006 14 70582253072378067495 104006 7 7060289290322759 104010 8 -417057627041 104013 8 377126808663240 104016 14 -15546346693568 104025 11 -2389203079337125 104025 14 -3181793059000 104030 6 -3769698763153 104040 34 -20229456725296704 104040 42 -1553307467504289984 104040 60 3854901112734528 104058 3 37252599678891 104058 4 484141303132371 104060 16 16330886693753984 104076 25 -7131952174243680 104082 15 239852449994571559 104090 5 -14093663058937477 104104 18 161863859705095808 104104 4 -89075659284352 104112 27 -5778699065856 104115 2 -1798498960793 104118 13 57345143753267 104118 7 -1914622392005 104121 2 -319592964285 104130 11 3734305838307 104130 15 384991841462643 104130 42 -14547800750913 104142 10 1132406422778663 104145 2 431123723596099 104146 1 435806297011 104160 20 7093375947008 104160 9 -10507234369472 104174 12 655446529865771 104174 21 28208367833751 104174 2 -93275036189957069 104174 5 -22450813771278221 104175 12 121823706105000 104178 8 659429584271 104181 10 -15700000412888 104181 7 20896700549553928 104182 6 1479897818587999 104190 10 -2647603059769 104190 6 -2234390860952873 104214 1 2906487720019 104226 9 -2250035392229 104238 12 949421238677847 104244 1 8264632767616 104253 5 58772799656429219 104256 20 -828757303183872 104256 52 828757303183872 104270 4 112449485105660071 104280 17 13467001662742976 104280 5 -3802970737787968 104286 16 -2471123598374033 104286 24 16703185038916823 104286 25 -19068222336409 104286 4 828210454651 104286 5 441247233838627 104304 14 -750715558336 104304 16 -45930784273353856 104310 21 5796588840579 104310 23 -43296546904912269 104310 31 -7396422308958501 104310 32 14227398487726011 104310 41 -9290242952557353 104310 55 -98767431903609 104312 5 -307519442201152 104325 16 422428556629000 104325 17 343850309408575 104325 22 155835795025000 104325 29 34288510749875 104325 31 42981288676071875 104325 3 -278833878180125 104325 33 -67159330939000 104325 8 -2196610559567000 104346 15 -267205829667597 104346 28 143286698507499 104346 35 -38996330884857 104346 44 -904652479840233753 104346 53 10251297201375 104346 8 -109232373207429 104361 3 -19158845071672 104370 10 -54945083227517 104370 11 13541552063440544899 104370 12 -14410235318381 104370 13 -27016985386349 104370 21 50387859544771 104370 23 67535803000365931 104370 26 -7667039910419358749 104370 32 -46613929308877 104370 35 490204792159523 104370 39 -899940546253 104370 42 -39479743625191093 104370 48 -2134635401066581 104370 57 62826260969143 104370 59 -1540627569121193 104370 63 -3053608744870660697 104370 69 -224890995732641 104370 76 -873011216665889 104370 77 -47147426644654889 104370 78 -697566066634241 104370 80 161676054348319 104370 89 16171567339116626927 104370 94 -1175054319649 104377 1 -2224201659093233 104390 14 122331581926559 104390 6 -476088978468501 104400 102 117528597756000 104400 13 -82995259284000 104400 156 5330104541640000 104400 161 38645137800000 104400 47 -254432928600000 104400 74 -21967855128000 104414 5 -624189555423662869 104415 3 -308748644081 104418 5 4194478474443 104430 10 -3791760884090173 104430 1 -105081718239917 104430 13 -5042160574874533 104430 17 211715779480183 104430 23 -9850774887902560049 104430 26 -14815376248177 104430 27 116245510704287 104430 6 47900642957299 104430 7 -653440094361701 104442 19 475869603591395 104442 2 -9878083699445 104445 10 -61166588519448 104450 1 -19953851894678125 104450 14 -4170359794625 104450 16 -159630815157425 104454 14 996444677367 104466 2 -99373308543665 104468 7 -30839740317801856 104475 1 12751181173741375 104481 3 715124536789320 104487 1 51852267612712 104489 4 -182803058488 104490 13 -2151997692727137021 104490 24 79703618249153223 104493 3 -31745334516940216 104496 14 65757300729184 104505 10 929136183527816 104525 1 5988051089000 104538 11 86930597750095 104538 23 40176214211519 104538 27 -5293469976542915329 104538 3 -56656367311445 104550 21 -19108439966125 104550 26 -2282582276228125 104550 36 55297764895375 104550 38 8522810959375 104550 5 -280449131211125 104550 64 -3006344580625 104550 7 -8722065924125 104562 8 15882868958895 104566 12 823002399109387 104566 19 14742736854643 104566 23 -2892487038041321 104566 26 -34203204764585297 104574 4 8549422679915 104580 16 -6019346888064 104580 17 -8623441451635691904 104580 26 11186374032573984 104580 7 -33170304512736 104594 10 12455456727295 104594 7 -3004321674260465 104598 30 -907541950977 104610 12 -236288727973 104610 13 -89029374403380949 104610 20 23211089689591 104610 27 -3364721316289 104610 7 2336961876499 104622 13 -360712322081 104622 15 -677079007327745 104622 5 -116310793462109 104632 7 218799686237248 104640 15 -9599345639936 104650 1 -2308174778125 104650 13 -420196326310125 104650 20 -3847657933278125 104650 22 -32666316363859625 104650 23 -2341284270916625 104650 36 -30781263466225 104650 7 743483649021875 104654 3 38028060517599 104685 7 -494254868442616 104686 3 -168332341955664889 104690 10 -95653671770940461 104690 16 1447458996851891 104690 25 -100123832640033 104690 26 -50820849919737 104690 34 656088534676880621999 104709 6 -34336562036437 104710 12 703979906879503 104710 15 -1564470868882731777 104710 16 -59722734296889 104710 5 -4230399359009981141 104710 8 -71768827446821 104710 9 1731333595463 104715 1 19279144036872 104715 7 -52169094669528 104715 9 15631811176392 104718 6 2768315281363943 104720 20 375618691458368 104720 32 -2601424638995904 104734 3 -14174532274393 104742 10 -622181600492468013 104742 16 -8334179668470501 104742 22 -248887354173309 104742 25 -12249174995485893 104742 2 9219316858759107 104742 34 -341456179954041 104742 42 -1090707835319937 104742 49 -17110611491191929 104742 55 -388335271398738273 104742 59 13270642232337673479 104742 60 1682770680996759 104742 65 -2909512437112161 104742 66 1011431015773119 104742 67 -5925505388296257 104742 69 91379060464815 104748 3 11153231235712 104748 7 3801999654919808 104754 8 83944755346951 104766 1 18688369100995 104775 4 5916958946875 104784 20 22486738957120 104784 25 -24302459197376 104784 28 9031098238391872 104784 29 -5143877533376 104784 34 -149848309207072 104788 1 -9010805382229600 104790 13 57517496302951 104790 17 -6608987780977 104790 20 -805337449561 104799 1 -2260154809720 104805 8 -73250431210521 104808 7 534470634600544 104810 2 -401586503653 104811 15 -1969890940375876504 104811 2 -1564106345144 104811 9 5743122275148328 104826 6 45542255832869723 104830 1 99752956422067 104832 13 -257134735946304 104832 57 -2057077887570432 104832 67 257134735946304 104832 74 2057077887570432 104838 3 12362333380939 104850 10 -16930635049125 104850 11 112273800478875 104850 13 1116839842875 104850 15 19574548230967875 104850 24 13883986803733875 104850 32 -3453648553125 104850 52 -7687747304951625 104850 68 -11770840535625 104860 5 -56445310936448 104874 6 -252041373155403917 104874 8 56883402653923 104880 30 -1019195445160448 104880 33 2118053986007874112 104880 37 -2843323966592 104880 41 -15753142305728 104880 57 -22160046026373056 104880 65 -155868185398667968 104880 69 -124236460601348032 104880 70 -194444996241088 104880 77 145132443838016 104880 85 -131880875266105463296 104880 92 246379647508437824 104882 2 -594884400434477 104882 5 -167481311551381 104890 9 -3066161806558261 104896 13 2023209059328 104907 16 -886417791456824 104907 28 -495261082392472 104907 3 -42616689807032 104907 38 -2043673252038253 104907 5 56722814133159592 104910 17 -38001993964940537 104910 21 -916513271441 104910 23 2590430493383 104910 4 4868814141371539 104918 2 -818830933355277 104922 22 -101883567129129 104922 3 7311938901435 104940 32 207330163912224 104940 36 2048139242534304 104940 37 -642265956553824 104940 41 -28646193266784 104962 7 -94804764660447060097 104975 10 -117024021791000 105009 3 55825096650120712 105014 3 673234671676693888763 105018 3 11709040938139 105040 5 -1605411062568864 105050 10 -16773858214301125 105051 1 -103941417308696 105066 21 -5699333062305 105066 5 42777297818091 105070 10 -851478701413789 105070 12 3450898041490943 105070 18 -828612659386161 105070 5 -3361846867021 105070 7 -115981475457429 105072 16 170849727765568 105072 27 -9618428663488 105072 32 -16256076907456 105072 6 -84154052779741376 105090 1 -5885586310373 105105 10 28104373391752 105105 12 -109195882559477 105105 17 -1399704255763098488 105105 27 53820780599656 105105 29 -68929351567748504 105105 34 1074475467875971 105105 37 14181278505499 105105 44 380989445543 105105 50 1074716933552423 105105 65 42327536577704 105105 67 179454054035816 105105 70 480098559726742781384 105105 8 53635909143444607 105110 4 -18697989126789 105111 1 -5004224926488 105117 1 -46165064046482510045 105117 2 77768 105120 28 16840225845504 105144 1 -15153468082784 105150 26 -3877084905352345 105150 5 634684607252875 105150 7 -484635613169043125 105162 1 -27503663788493 105165 5 -2051940368664 105178 2 -1205852442713 105182 5 46591128247051891 105185 1 17400402353179 105196 15 26931989967317280 105196 17 -181157653483571584 105210 12 18204629383296819 105210 9 1383619554603 105222 11 18525650013359 105222 1 -2535228274754573 105222 5 292729317452983 105222 9 -45148769485145 105225 16 772988794148375 105225 9 96623599268546875 105226 2 -8838993465153 105230 5 560395270099472399 105237 1 -84901422312225 105248 3 270718213151034368 105248 7 -270718213151034368 105264 11 -380952364718016 105264 22 75482408193081408 105264 28 -2038025021213198016 105264 43 -940936243815360 105270 11 1907682701419 105270 13 -8475253450829 105270 22 129059008820351027 105270 26 458384108835851 105270 32 -1690708644257633 105270 37 133480684172143 105270 43 48392089900759 105270 47 2198975731594832663 105270 50 8448044422103 105270 55 -610109248860517681 105270 62 2019524712581519 105270 7 -765364335744437 105294 2 6469021585088371 105294 7 1198500071383 105298 1 20953839017679219 105298 3 6310449372763 105303 2 266388574872131 105315 11 200750392233224 105315 13 198354502152584 105315 6 -24852265310761496 105324 4 11694357909440 105326 6 -165265923463425 105330 11 510473994363791 105336 33 -9304889384236608 105336 37 483139137600288 105336 41 216427044921984 105336 8 344625532749504 105339 4 141656631654331 105339 6 -1874059399601 105339 7 -241703678504881 105339 8 8202975149591 105350 19 5186661441401755 105350 21 -1058250654125 105350 34 -2593085110901298125 105350 36 118253459681875 105350 41 121556449242394075 105350 57 15194556155299259375 105350 58 238333750526375 105350 60 48331818427375 105350 69 -20744680887210385 105350 88 648332680175219375 105360 30 27884444147072 105360 8 -673140123712 105366 13 -15576480507932137 105378 5 158612872124251 105378 8 -789503732105453 105393 1 496134678044296 105393 19 147612493695671 105393 22 -2161954087669432 105400 16 15224307048000 105400 20 -11279042856000 105408 12 -755057394475776 105408 1 -91055024957952 105408 25 755057394475776 105408 26 -27965088684288 105408 39 91055024957952 105426 17 13530662780248359 105432 5 -5158855784322368 105435 9 15005867382567 105450 13 6228252512792875 105450 15 -96537219813125 105450 20 -443621121678125 105450 30 -5402263745125 105450 45 -16133482327625 105450 48 6650409653113375 105450 5 407981862746875 105450 69 3263854901975 105450 8 -83738609028125 105462 4 -4637252179629 105480 11 -453542479239744 105490 15 361846495079 105490 3 -13155323645773 105522 5 -5700940453241 105522 8 -141911445181461451921 105525 12 26657530058025000 105525 2 430314648525000 105525 32 -22151850115613625 105525 37 -2370754321453125 105525 44 213260240464200 105530 1 3638570898306851 105534 15 178045405381611 105534 22 186656721198507 105534 33 -3176658718977673305 105534 36 -6026079281769 105534 6 -88677395747869869 105534 8 133312682085003 105536 9 160918232463872 105545 2 1920618611091 105558 1 -123403621250737637 105558 5 -137820815002837 105560 10 -15952053289024 105560 8 -19255357584224 105561 4 -24286727048184 105570 3 31460711655843 105570 40 -244030301053641 105570 43 18052376735871 105570 6 6588818128448307 105609 4 124330593551795 105627 1 250333220744 105630 13 315615491466518627 105630 21 -31771119816358021 105630 27 -9657611788049 105630 4 408132997290523 105630 5 -678840827932133 105633 16 101154048807240 105633 25 -8256872182680 105633 9 10308277265032296 105646 1 1300356392923 105648 14 175993916553280 105648 15 34673471633728 105648 1 -922485090200768 105654 1 -1876478232813267293 105654 6 -583635338713 105659 1 9206997137992 105665 3 -2062995128246872 105678 14 -17746472501713521 105678 1 479154757546265067 105679 5 -64118902126609 105680 9 -5626815747264 105690 5 2787187264430363443 105690 7 7603793003539 105693 10 5381999277256 105700 1 144660196792000 105700 13 -138554551080000 105700 2 -2895789933548000 105700 6 -2293287152444000 105714 5 -104681906549541 105717 3 -4881240581470712 105732 2 218734007091840 105732 7 39388168785024 105735 10 -748366189381 105754 21 -48794825015243505 105765 1 -41598221694328 105774 12 43121436191819 105774 17 -902889913368761 105774 25 -3526763794340257 105774 6 62603726275603 105774 7 8541841982788443979 105774 9 1738620391367483 105781 1 -16457468594581 105792 13 21786246051673600 105792 26 -232319048976640 105792 34 232319048976640 105792 41 -21786246051673600 105795 13 -1812272072185656 105798 15 748955702447 105798 16 -429978292797408697 105798 4 -49216699550789 105816 5 -459868534475840 105819 3 -263387307073528 105825 5 488881954995875 105826 4 14061324324150935 105830 11 -228005901688697 105830 6 18329227966288331 105840 102 8200612193304384 105840 122 -742688607213504 105840 126 -931643163993024 105840 139 -303726377529792 105840 141 -82705481707968 105840 149 4017651769152 105840 153 -23908490359488 105840 176 -56296165689792 105840 188 -108476597767104 105840 195 1453670470679616 105840 202 -753021967594176 105840 3 -4172448272832 105840 50 -302946271193664 105846 11 -19932270827509 105846 17 3509544545047 105846 20 2647643609935 105846 24 7718473448941679 105846 28 -10336544369137 105850 1 -345625675326125 105870 13 1241117463969386819 105870 2 169254059020147 105870 6 81220120468883 105885 5 -14470462153737 105885 6 -8140691858733 105894 5 106397641657899 105903 10 29520483323211 105903 3 -5729782075388181 105906 12 -60428471257817 105906 5 -368676722712493 105910 11 -38935508817138669 105910 19 -218689244266249 105910 2 2926402179947 105910 7 -20582010941045653 105915 5 348190008369931 105920 11 -11216005797376 105920 4 11216005797376 105930 13 241405710849387 105930 28 -729254957751981 105930 29 955798856965549251 105930 3 -12624369972021 105930 31 -7872149436777 105936 4 351422650759744 105944 5 -947372389713280 105945 3 52105562079103 105950 1 -246553605837685125 105950 26 -2093565296013625 105960 5 -18134172472915648 105963 10 -244728254845880 105963 15 -155718749342845 105966 1 -239801286803301 105966 14 90650959175043 105966 18 527798976464691 105966 19 -46145279275605 105966 20 -2887172179123581 105966 25 5163377682966075 105966 29 177254539630587 105966 33 6474634743689127 105966 46 -27426902967266193 105966 50 -2522156535495957681 105966 57 7998393664703583 105966 66 -4372259076585 105976 2 -174855159654976 105994 2 295056495539 106005 6 102747855857445064 106005 7 8233170470792 106020 5 -418252627760134752 106026 4 603292722517063 106032 13 -12734364708468928 106032 37 2609125924802624 106032 9 -239869190681216 106038 12 1704215330089447671 106038 16 -1404992875379697 106038 20 136173868311591 106038 7 18439406662851 106050 11 -5591654603754903125 106050 20 -38121106889125 106050 22 -300893544308125 106050 29 -12214974365858125 106050 35 -182602565176625 106050 36 -97719794926865 106050 46 -49642131507625 106050 49 -410055223299625 106050 50 71669297873375 106050 57 -10571328321625 106050 61 -44733236830039225 106053 3 -44780048340184 106056 10 -141698494968480 106056 2 3825859364148960 106065 1 -7082164193688 106080 13 -5150068208128 106080 20 14585776058368 106080 2 823928451328 106082 1 1545762523035491 106085 4 -12333576853920833 106090 10 3244365471350727 106092 5 8734613773248 106096 7 -10446090450624 106106 13 45379579888215 106106 9 29575437390647 106110 7 -10545656459301 106113 9 982119391154495 106128 16 -59743658546881653888 106128 32 136769718604608 106128 42 -71527677773760 106128 50 39115157594688 106134 11 -168412088905613 106134 12 -226724625906821189 106134 20 661004740253123 106134 23 -395506802207570221 106134 28 -561986278654213 106134 31 -11268063605682037 106134 40 274750372689308047 106134 42 10468083427078879 106134 5 10720742045118931 106134 75 -94239377832432660121 106150 13 -12303279954715625 106150 4 -9998009317125 106150 6 -98426239637725 106150 9 46103381110475 106155 10 -2384215791201 106155 18 -77841522378936 106176 19 36392531310080 106176 25 269705296881152 106176 30 -269705296881152 106176 43 -36392531310080 106182 6 -27244185343036569 106190 15 -526124097407593 106190 22 66761932672234799 106190 26 60329003653351 106194 6 63254138814935 106206 1 -1536293730144725 106224 8 898226503488800 106227 4 -2540140017955128 106227 7 94079259924264 106227 9 38692612525843668456 106246 10 -890101541169 106248 4 -2822337732279393152 106256 7 -71641709378444224 106260 19 62053325213984 106275 11 45834394033000 106275 18 307441623989375 106281 2 -348104521348920 106288 10 1529041479324224832 106288 12 -37778516377960896 106288 20 11993401320256 106296 2 -2975720558912 106314 5 3073737076379 106320 19 138810603908672 106320 9 -1180414265988032 106324 1 21233756046464 106338 10 -1342678070114585 106344 6 12143500402820256 106350 20 -1076178990705862625 106350 32 -5261952687625 106358 11 408391731059759 106358 3 132903440655859 106365 17 -16027626502068673528 106366 8 1050809199103 106368 7 8518943126528 106368 9 -8518943126528 106386 4 1698340256039195 106386 7 -60620862084805 106395 2 -7916986213829 106398 4 686021802732902799 106400 36 -10201864333312000 106400 54 10201864333312000 106403 1 535115886162056 106410 2 5085961114669091 106416 17 -8910618369984 106416 19 -157022964345024 106416 28 2588621463000212544 106425 17 12854834209200375 106425 21 -4200059871000 106425 23 8152845885000 106428 4 -340317808043439968 106456 1 299855936304576 106457 3 1533774599210664 106470 102 -102226703846553 106470 103 -2816261111578473 106470 106 -26459756203257 106470 109 -67059336148402452777 106470 114 -702240820195473 106470 119 -91082997266263353 106470 126 17078712394051503 106470 132 145078305275007 106470 136 8885381680071 106470 13 96397428919779 106470 140 1427115543458319 106470 143 -11001440297260881 106470 146 619076712872363031 106470 148 397065562122879 106470 151 -69135531687972009 106470 152 -317153810792169 106470 155 50609418205792427631 106470 162 10362035647431 106470 165 149275345775751 106470 21 281782755062523 106470 25 -20358022033141533 106470 26 400727129189283 106470 27 -696786922310395293 106470 29 23035693311694323 106470 40 33887442564963 106470 44 6105872294401347 106470 46 32289586036618336803 106470 51 -561886667710173 106470 60 -84141982933749 106470 6 -1826240442077493 106470 64 9410487682623651 106470 66 35519763824230491 106470 68 318737036689190379 106470 75 -30523138893219141 106470 79 -1542823081969454181 106470 81 62711321981139 106470 85 -2602730580834033 106476 4 11747005348544 106506 16 1468308248595 106506 18 203990535870831 106512 11 -819641201081536 106512 23 -12662593224128 106518 9 -694708658425 106530 10 19680942943377390419 106530 33 7937575823715767 106530 40 3894556925620727 106530 41 91311298330679 106530 7 -1128649223413 106530 9 225180463571 106533 10 64311085707753807 106536 3 1527778851904 106542 3 615060812486097171 106542 7 -22780030092077673 106554 10 10851301289492119 106554 3 173536690616659 106560 111 147723488266752 106560 137 7341453126885888 106560 139 -396287228984832 106560 140 -9705860095707648 106560 143 9705860095707648 106560 157 -30802215957696 106560 3 -72912974473728 106560 56 7346411209728 106560 57 396287228984832 106560 59 -7341453126885888 106568 3 45248781961664 106575 63 2455062970913000 106578 5 -18546904505673 106578 6 -84518797634357769 106582 1 28760760108718163 106582 6 212743251841707 106590 14 -9373173923573 106590 17 -2304006818826149 106590 19 1343526161262499 106590 21 6679150308116659 106590 32 70660515683699 106590 35 -798752865473 106590 40 6795087716287 106590 41 -78290800944928793 106590 44 -2109993867530801 106590 58 -38411784212461201 106590 8 -224240292556037 106600 12 1819619213400000 106605 4 -147536544312 106608 12 6699480588352 106626 6 -1861904152369 106641 7 4430539671578343 106650 9 -12046967815411125 106656 27 -90182960952955264 106656 4 90182960952955264 106658 3 2173907540935 106659 5 -8392513079823669 106662 12 -8046035084776609 106662 3 -16899740574893 106680 25 -4009064038624 106680 5 68416751757376 106689 1 -153944129529469 106690 1 -2286473202433 106704 46 79440913145664 106710 13 -4633065512801 106714 5 1483702567919 106722 106 -281863471265145 106722 118 96679170643944735 106722 120 -635661025708401 106722 130 18323249261615991 106722 134 1184730769399023 106722 14 -3580710023849805 106722 161 -8689117308160905 106722 166 -1802716033920417 106722 182 127936226745876087 106722 190 818536965015231 106722 25 7040654635523355 106722 31 -28774487167893621 106722 35 3134840030472843 106722 50 -1444034869017741 106722 62 11565215137162164555 106722 72 1250674742498643 106722 75 53874587808046467 106722 76 9825082426294443 106722 85 1827427366277667 106726 5 -43393573048617 106730 6 13821619990959 106743 10 -6023130685231960 106743 16 -580547215585 106743 5 2084648627944 106770 2 34486150885919 106778 2 1825356258374167 106782 5 -362635679354597 106790 6 6520698350767 106790 7 -1109635599341249 106800 42 462671692480000 106800 49 2602195677224000 106818 10 36432883261567 106818 3 -1216917547885 106818 5 -8295237573893461 106821 14 -3843338936147352 106830 6 -4123397045992977 106860 10 -283682592030176 106860 12 -6727921805276992 106860 14 -2760366574432 106862 6 5554049172895 106862 7 2176248632543 106869 6 53109967642487 106878 12 10424781721860119 106890 13 -5550829784009 106890 2 5439101755384963 106890 5 -190767741059197 106894 6 -14717576841645113 106894 7 58757360638807 106900 1 -380477047439944000 106905 5 -1573969768361 106910 2 40692694066327 106914 1 -12531512172365 106920 32 80561700607104 106925 11 -102726543275000 106925 13 -507446753939000 106925 17 -136942701647480 106925 2 -116782127686125 106925 24 -17117837705935000 106930 13 611094902469651 106930 19 -255221736099401753 106930 26 -51948246712681 106934 1 -126467398693 106934 2 234599852457071 106938 18 23106790015551 106938 21 146731153322727 106950 11 -8353313370125 106950 29 -47109634778125 106950 3 2971815119875 106950 39 -518770320349625 106950 42 3332913241375 106950 48 607112001211375 106950 50 -376877078225 106950 58 14924377154375 106950 62 1919221684337375 106954 1 -308328523117073 106956 2 -33830423295552 106960 18 78466920015168 106974 11 53452308144339 106974 15 -40564383007329 106974 19 4913908291276767 106974 2 1095238341197883 106974 24 -1979715116457 106974 6 -7603141906989 106974 7 -181996603380621 106981 10 -7984007492399352 106992 21 -2793137430398400 106994 2 72595833295339 107010 9 8685967327328547 107030 1 8608948597243 107030 7 36007974073891 107046 6 -38761908842421 107046 9 -64591827189363530109 107058 1 2199548915747 107070 13 1269765823362011 107070 2 -1209386718989 107070 21 29166102288919 107070 24 -25077795583609 107085 13 -38989760126977 107085 14 40556741648687 107085 4 -55685550340277 107094 1 -16649213324957 107100 13 -152632868797548000 107100 27 -37030368348000 107100 29 -8013784830444000 107100 37 539136581796000 107100 39 825892564932000 107100 41 4331993159376000 107100 47 72867805200000 107100 49 457208096400000 107100 53 32691366957600 107100 70 4086420869700000 107100 8 4121087457533796000 107106 1 -31273383928589 107107 3 -70698162461688 107115 2 16476993379466792 107120 12 -5781511863335872 107120 8 -1182179362850208 107126 1 -8669487697813 107139 1 2002185354995 107142 4 239247887311 107146 2 -67924707598684989 107151 1 5565122518600 107151 2 1203036501655 107155 1 -1974986152092152 107157 3 35840536076627 107160 7 758097904672 107166 1 -2907321929549 107184 29 -764693045190208 107184 39 7995812606272 107184 55 -228895400874176 107184 56 -35016155455168 107184 60 10722163879232 107184 65 2457498684949568 107184 69 3086285537600 107198 2 -1436014590964253 107198 5 -35459263623321 107199 5 1030333674312 107202 3 244258731395 107202 8 -1737427488785 107206 3 52491454194267 107217 12 33354007479720 107217 9 629242657919631 107219 13 325731862779112 107219 9 89186022966088 107228 1 -79774792215231808 107254 1 -18543725787807989 107262 2 -6667810744797 107275 5 -14115457511000 107280 26 -6229138676165568 107280 46 -1528064022071232 107280 66 8578567264067136 107289 15 917599811400 107295 2 -177191629777 107295 4 881714738866211 107300 7 -14437293811784000 107304 8 2588543191232 107310 13 3023719910472567187 107310 24 -130186652699789 107310 29 -11821406087197 107310 33 46309961765627 107310 4 -1308100135517 107310 42 21840792847811 107310 43 -93858354875341 107310 44 -8265146574349 107310 57 3168252803863 107310 6 -7491391946799173 107310 70 -17277634176929 107310 78 50409900001727 107310 79 49144876788266063 107310 80 -2482157737297 107310 81 147815839367 107310 84 -396644477608729 107310 85 31546373140079 107313 1 -5360982361666712 107315 6 29348751286872766619 107316 9 14254441156512 107328 33 -1637161863569920 107328 3 4174391921536 107328 48 1637161863569920 107331 4 44116983237032 107338 3 44096831960931 107338 4 54005872285539 107350 14 -1654154307100994625 107358 2 -6524039206925 107358 7 -336695522245424585 107374 2 101563414799203 107380 4 60929515456928 107380 9 116263607622336 107382 1 -34806202196165 107388 2 1473551751897216 107400 18 8045787809744000 107400 22 53335079565200000 107400 3 20118221001835408000 107400 5 426680636521600 107406 12 -129725425264941 107408 29 64719459876309056 107410 13 73845140727028031 107415 21 -38027675166741 107415 4 133685285544 107415 7 -4474049658950808 107426 3 1542652682399451 107430 1 -645143909387445557 107430 7 -727596544027481 107440 10 193104903744 107440 22 26373393353024 107442 7 -561171641433543081 107445 6 904184501428259 107448 24 -143816687692480 107448 28 200542730673250592 107450 13 2751094352046375 107456 2 48327178550505984 107456 3 -48327178550505984 107457 15 -26196213598597 107457 9 35804921023207 107484 15 -953346996147520 107484 7 -736587634317184 107490 4 8274900667267 107499 3 133510814639 107502 8 51323167000135 107532 15 206429265879840 107550 12 -2339705874412125 107550 37 -294222346092311625 107550 47 2349966463869375 107555 4 -1968727774020056 107562 10 5894771896259 107562 1 402896817498547 107562 26 -26981934485689 107562 5 -922645215757 107565 2 -7371045888533 107565 4 182055384161767 107570 2 3886380313811 107578 10 -4234353618834363753 107578 5 617342705763867 107580 4 5556825597088 107586 11 -45083132513340885 107586 24 -518726119193145 107586 5 963123649785451755 107586 7 -40375980819837 107590 5 6120299755067427 107590 7 -15311815099813 107598 3 -160940629268405 107601 1 25688612436904 107604 13 89803637836416 107604 5 -106206491067264 107622 2 -3613579480377 107632 15 72863830684224 107640 12 -6108285024791136 107640 13 8789016314304 107640 20 -30059449439616 107640 31 6358977000576 107640 34 2042579837834784 107646 3 14451694469524747 107660 1 1869882508786711168 107660 2 -603781363072 107670 1 -139289222453237 107675 3 -7130413943000 107679 7 7217760057993558728 107690 10 2774238116640067 107690 14 270088466721931 107690 15 -11420190669349 107690 4 2638304462595923 107690 6 34104447621855963 107690 8 -74723522856642693 107690 9 -180435183340357 107694 4 798726353037435 107694 8 1976724670325031 107695 1 39696696033128 107709 2 -2505723859736 107712 20 -110758531576320 107712 49 -190908006534144 107712 51 -1167654625638912 107712 55 -423780396452352 107712 77 110758531576320 107712 85 190908006534144 107712 89 1167654625638912 107715 7 2832926452424 107760 20 35580240724701536 107760 4 8737021251136 107775 10 220706831025000 107775 6 103398605325000 107778 6 -9768880293137 107790 17 -2821298289841 107790 5 1288709248139 107800 1 252459944632000 107800 3 -246609072584000 107800 65 -452732038640000 107814 10 122855899319819 107814 11 -665394108805 107814 13 1073424431843 107814 18 -19866910526513 107815 1 -264019219331381 107817 1 -17559852680429 107822 13 418151181283501679 107822 15 12618815990036607 107835 13 1801383275514887 107844 4 14049593613877228480 107844 5 -1283012005760 107850 24 -12291489760625 107855 1 -119911666907161432 107855 4 -21201012017549 107872 5 45101180514189824 107872 8 -45101180514189824 107874 4 -5095309975746381 107898 7 23750461203875 107900 8 37292750033508000 107910 21 8199715170663 107910 25 -22946330447728497 107910 35 1150591256548911 107916 11 310398855077985920 107916 8 10464395957919872 107926 4 2005343713619 107926 7 -222436305441433 107932 4 -60036366084992 107937 2 26093853744255 107939 10 -2232099232533208 107939 4 2382024715507835208 107940 13 -14002465562613856 107950 9 256889479387375 107961 5 -2703477227165 107967 1 445115198581480 107967 5 -225296761629712024 107970 11 265087790849411 107970 13 1733493908794420567 107970 21 -418078853842537 107970 22 -3160337076353953 107970 31 -7619248859329 107970 6 384647273606987 107970 8 -1136234288133253 107982 16 -1465960052169621 107982 28 -2682115753276737 107982 7 15639513114169049715 107985 1 2416128598423 107985 3 -20980853560504 107991 4 -66914827312905 107994 2 -7290815383189 107994 4 36573932465350019 107994 5 -12230049335849 107996 4 -103997527712064 108003 1 348647507143363 108006 1 4272907508839 108010 6 -28800187591769 108025 1 52777036177875 108031 4 16155393266088 108031 5 347721844707 108036 3 204612595641005184 108042 8 -575166203929 108054 13 -1078625066181561 108054 8 29122876786902147 108066 21 -3563948128861 108066 2 -1592330544945125 108066 24 -14745839273677 108066 29 3058353270127 108066 30 55623769840927 108066 36 -60927788305 108066 6 11261867281939 108070 3 -1015723655581753 108072 6 -55467692032320 108075 18 -50197799532871000 108075 20 2024369762957000 108075 22 -15372030975625 108080 7 604340743600448 108120 5 -7570836900313408 108135 3 -10954549563597 108135 5 -7712526131352 108147 5 986712623720 108150 10 -31322895336125 108150 14 467767700875 108150 21 -22573613853125 108150 24 6167217174875 108150 26 7842826549347875 108150 31 554346247146875 108150 40 -41947635539125 108150 43 -8163553529125 108150 49 2769156904375 108150 55 7686905350375 108150 63 -990298869638667625 108150 6 906151600619875 108171 4 43274836452744 108174 11 -1143312653989 108174 17 -23457010924325005577 108174 21 -595244597191937 108174 26 8553702843719 108174 3 31221281540276582422987 108174 4 505098026853211 108186 10 324781818563935 108186 15 -64466764636481 108186 16 -102392708225705 108186 5 76669601383835 108192 36 93709784421568 108195 2 926164256671 108225 17 -2012544995981625 108229 1 -272507237124696 108230 3 -379822629458338237 108240 21 130501366211499328 108240 33 -482561375453111744 108240 36 335831446351936 108240 38 11971494789184 108240 8 221532978259936 108241 7 -9470755965718593 108262 3 1166541765556111867 108262 6 4808057079743 108272 3 -735053788635840 108290 14 -2886239826879661 108290 16 19901498568931 108290 2 -1408679000027677 108290 25 133397253997623 108290 6 530462818882443923 108290 9 -7930681913998059013 108300 21 733662894274516000 108300 40 -4773192723388000 108300 43 15047819737424000 108300 68 -23078480729500000 108306 10 -2890913617052253 108306 4 85851837683595 108318 9 178377823487879 108322 1 2278342035755 108325 4 50143942695141000 108330 11 21577531974191 108336 25 35175447960128 108339 14 -3401258721112 108339 7 -12048281823725 108342 11 304060016216943 108342 8 -23898227929029 108344 1 -31389834351212864 108350 32 58681563034375 108360 13 66814129527547968 108360 38 8040136133952 108360 48 344802531576096 108360 8 -604414553277312 108369 1 109367023477779 108400 16 -28414819736000 108410 3 1044312516523 108410 9 -18815720532503473 108414 15 10683745192287 108414 3 -11580016964558949 108414 5 14174288228403 108414 8 470426285551366376847 108416 17 158540375375360 108416 21 141813604928512 108416 38 -17726700616064 108430 2 -16737463860713 108445 8 77406601853384 108446 3 10127051255907 108446 7 -203960056133133 108450 17 -24571079740125 108450 22 -29196778654125 108450 24 -23948162794125 108450 47 -77803845576881625 108450 51 -1912093193309625 108450 54 3460028214375 108465 11 -24927754660633 108471 3 -1881674185204421 108480 10 36127052821504 108480 17 125149545270784 108480 2 19430914442752 108480 26 1968408511718912 108480 36 926406350472448 108480 40 -1968408511718912 108480 54 -19430914442752 108480 58 -926406350472448 108480 66 -36127052821504 108480 74 -125149545270784 108486 12 32893672097979 108486 18 -1611851721165 108486 34 69564362027090427 108486 52 -2576457852855201 108486 70 -22909373902737 108489 9 -7105263915302488 108498 1 1176707991930211 108498 12 -474857069103521 108498 2 -1043260980820435637 108504 8 5201671840757280 108510 6 2646871995023 108510 8 -4713200296129 108528 27 -63978628306138048 108528 37 -838907316418240 108537 11 -57709513938725 108537 1 -166456590852365 108537 16 -68695938476209 108543 1 50223429538759 108546 6 5522537174815 108550 7 14546399273875 108558 12 3383636319887391 108558 4 -23465591452197 108560 1 -15689698944992 108562 3 391119527185695 108570 10 16355187545822299 108570 13 4035897524195011 108570 14 -2174336190629 108570 16 -69277685431887253 108570 17 -45210600702973 108570 20 1745117550107 108570 2 17241676827787 108570 22 -5115663761057893 108570 25 2337696772651547 108570 27 -1795002880357 108570 31 -4574253926915749 108570 34 6215198100371 108570 3 -674725272173 108570 40 8658164989494847 108570 4 -1046738674493 108570 43 40330943912503 108570 46 897016736503 108570 54 105197902186231 108570 60 -4746779583281 108570 63 183567796465591 108570 72 -758417873473 108570 73 -768955492873 108570 77 1493801147118239 108570 83 52839032465008439 108575 9 7711091433000 108576 23 99543617985024 108576 24 -99543617985024 108576 31 -1014162758062532928 108576 32 1014162758062532928 108600 3 479604920824000 108600 39 1223444889004796000 108603 1 -19379963314377 108624 17 23874108516928 108624 44 -1179906490144 108627 1 4270399251731 108630 17 295345641794795343 108638 1 -990756892853 108640 6 -9140090303296 108654 7 -549979309142801 108654 9 -86075755717769 108658 12 -1356281123337657 108680 4 -106405265321792 108693 3 1617828447219703263 108696 6 -7894902695802688 108702 12 -25783237113705 108706 7 3769185639727 108706 8 -35889425025921 108720 33 -77034735744192 108720 42 661668721546752 108738 10 32484903520707 108738 13 -1926789877269837 108738 14 148898169298170531 108744 5 4280084592832 108766 10 1634945552512718095 108780 29 -330400344598912 108780 33 32040528045344 108780 36 -7311196589536 108784 3 -1017082782656 108790 5 -1821229837353 108808 1 -54654860037952 108810 30 -88948742667201 108810 3 3294397876563 108819 2 -8126240069880 108834 15 11754445143199391 108840 2 -5707221847357888 108850 12 -39118985917313625 108855 12 4147259343624 108855 13 117193514847624 108855 1 378692881297992 108855 3 -10224707795045784 108870 8 -22692847102649 108885 10 -3966873487669 108885 1 -26975421710522837 108885 3 171942933554659 108891 1 -158904358200 108891 3 -71660119138173 108891 4 1934823216730671 108900 61 214621826859396000 108900 87 -610729190280000 108906 10 66799678470391 108906 1 -488822592732389 108906 15 -57401707631617 108906 6 17342832776993891 108906 8 -11805702491393 108915 6 -2897330365130110295979448 108927 31 -462071284999128 108927 3 4669412211000243 108934 2 410616333666827 108942 4 11948490539491211 108942 7 -745677184553 108946 5 -1914977370497257 108966 1 44625037928563 108966 3 847694883043 108969 3 95425591001131 108990 16 354850458379227 108990 26 -737026204296789 108990 38 -22134343639617 108990 40 -54359880248673 108990 47 -1650962752713 108990 48 -33528885000633 108990 56 -102649504857129 108990 58 45623348167599 108993 1 -153603698273 109005 3 -1612926020888 109010 3 9908490023207 109020 4 -10239383969382959488 109022 11 21288580569271 109032 17 -57688337343680 109032 3 -5692461497792 109040 10 726739754437952 109040 13 155900282238784 109040 18 -11974489689024 109048 3 -203103571498048 109050 11 -771847640894125 109050 17 -61485637203488125 109050 20 -491885097627905 109050 24 18067719316375 109050 33 4699073434375 109058 2 -71148039971013 109062 14 47072319101234739 109062 26 -848469667217553 109080 9 258697363502016 109089 12 11364142895451 109089 7 2817123717987 109091 7 -15355415465910648 109098 10 -12262720508685 109098 12 -72910881447913665 109098 17 956279131540551 109098 3 444356892431739 109098 4 116391299587875 109098 6 4879997403155235 109115 5 -16615231839864 109150 2 -467739859628125 109158 5 -4267633335209 109174 18 -5353212249801 109174 3 -7246817156917 109179 1 50581034674983 109179 4 2013481629298467 109200 108 4790338855912000 109200 117 -25025887160000 109200 122 -23297819822360000 109200 124 943853429800000 109200 127 -4594938200000 109200 141 -186382558578880 109200 143 -9323897124088000 109200 146 4354704028944296000 109200 149 -15941625400000 109200 162 -379812351736000 109200 163 -13786706296000 109200 174 -87818073400000 109200 176 66674830760000 109200 181 7795170074600000 109200 194 67598621000000 109200 20 85299895864000 109200 25 48535269391792000 109200 47 36434725244000 109200 68 -347363126200000 109200 71 -364302173080000 109200 79 823462606504000 109200 88 2303304154696000 109200 94 54043679656000 109203 1 -170902568485 109225 3 -413024607541732625 109230 18 -19753810999849 109230 4 -3138504803981 109242 24 6872219809199163 109242 44 172426826435247 109242 57 -185549934848377401 109254 7 1480790290879 109261 1 150912600189768 109263 8 -48298108611005 109265 4 2736203339430703 109270 1 127130220019243 109270 17 267042701577519 109270 5 409546444790539 109270 7 -43605665466600349 109270 9 -91595646641089017 109275 13 23676129557000 109275 16 -9007127117425 109275 4 -1819458138600125 109275 9 -1125890889678125 109278 10 -10408027513905 109278 15 -4378384008441 109285 1 18470793963051 109296 19 191138808927744 109296 24 -5681912453568 109296 31 -926759339510976 109320 16 129104762573824064 109320 4 1193245592036032 109326 10 -1589742994183721 109326 5 2998845285227 109330 16 -443826517180977 109330 20 -39815196370201 109330 2 205239073322187 109330 3 -7586120139676957 109335 5 -947980080829981 109344 10 325992702643136 109344 15 -23099674710016 109344 2 23099674710016 109344 22 -325992702643136 109359 6 210148807131 109360 4 -29702820782016 109362 1 -39722418295957 109362 6 416858439659899319 109368 13 2327659907735232 109368 39 1834911228544128 109382 3 -7785631570501 109382 9 1871733476943 109383 1 -112496288926328 109383 6 12425620670862184 109383 9 3870382169600200 109386 13 1049321598625647 109386 18 -40371923815281 109386 4 -116939361810717 109390 3 5471025517207 109395 16 -26223054401322560952 109395 33 -5972315256504 109395 8 9552802087528263 109410 11 -132765686321057 109410 15 313720374558079 109410 18 -35634614219724673 109410 23 -4272120701281 109410 26 -57770484767281 109430 3 860106745727531 109440 15 -78822127601856 109440 48 -9563672495232 109446 10 13534838883395 109446 12 131943168487 109446 15 94071195692279 109446 2 -3246425050949 109470 1 -167385980178557 109470 16 -1101265810987249 109470 2 39115803799963 109470 4 338346719011 109472 1 -19326425360896 109494 40 -360151704606609 109494 43 -82852599001728681 109494 44 14224283380820871 109494 46 -4727431795764033 109494 48 9183338235639 109494 4 8951701083795 109494 50 71986097827071 109494 54 69062512335615 109494 56 -85335543945009 109494 57 -952369164029025 109494 60 -81482931348561 109495 6 -5606470902997016 109504 13 344075322880 109510 9 45563003262431 109520 28 1722767439844224 109530 2 35588248550188227 109536 9 -2896583768576 109542 1 15855239893483 109554 2 -1327273961112557 109554 3 -187106096635270685 109557 11 7433334911293992 109557 13 655762934153223 109564 6 304664937572800 109566 4 -1716968167389 109590 26 -6011705207418409 109590 3 -53529974885213 109616 24 3225634697687104 109620 26 -14288058758016 109626 17 -1289217544813 109626 32 188432998582103 109626 5 -172701339001037 109626 6 113941139821638283 109629 8 589884256755351 109631 1 7343022005288 109648 13 -771626624818439872 109648 25 4479424631403840 109648 5 13873386655808 109650 11 36794315096875 109650 17 -34786189253125 109650 20 11663066103875 109650 24 34767017754639875 109650 31 557763075087875 109650 5 524263094875 109650 56 5816052328936885465375 109650 60 21830620630375 109650 74 -26971525149625 109650 77 -68065411155625 109650 83 -37561598808625 109650 84 -64363830522625 109650 94 -18332267190625 109662 14 6398784721063 109662 7 -219073385141009 109668 8 331487618967584 109681 5 699754528766735 109710 27 33843030191577351 109710 34 -216061727847006592089 109725 12 -7419298097240 109725 13 22706302753000 109725 14 -22774478828967125 109725 19 -200471089540625 109725 23 2996458976331710875 109725 26 -2454831539000 109725 28 -1854065901775625 109725 36 -110257039581625 109725 39 16288761257000 109725 46 -14832527214205 109725 56 -927412262155000 109725 7 1409591200375 109725 8 -3746596294547000 109746 1 -8142081698421 109746 20 -3958413871833 109746 7 -4964853543525 109755 6 2961958685256 109779 4 2302841280111803 109780 5 784132408512 109794 15 3537468181063 109794 18 -339411255968809 109794 5 -14053754268269 109798 2 8639112951466811 109800 43 6725621592000 109802 3 71515494080358859 109802 6 -13979059768314114237 109802 7 -85851679468941 109803 1 71397514588904 109803 3 793996827560 109803 5 -8891364287800 109820 10 312172106311584 109824 12 -5740015323392 109824 13 -45968185785088 109824 30 45968185785088 109825 1 -196320421279000 109830 1 77409121249027 109839 8 -4574264846392 109840 7 35138608310803779648 109854 10 -8958653751465 109854 7 -4738930610121 109854 8 -132389683588017 109858 4 -17423636491261 109862 2 12514237801299 109871 2 94459642586803 109872 53 -391118988784533696 109872 55 2541582545760 109886 1 -26732926052436618181 109889 2 4545526127455 109890 35 -1325417476401 109890 5 -1764014748093 109890 7 26151805104291 109902 11 204700645220111 109902 6 2339034668000623 109914 1 1853027785583731 109914 3 -16463574315901 109928 3 -53851281081408 109938 12 -5858991660025 109938 4 -9147642798061 109950 21 -15798205644625 109950 2 897494820992875 109956 22 4035876414670016 109956 6 193153230942112 109956 8 -497411149326560 109962 6 5754253248819 109962 8 -1008979153413093 109980 1 -3321823867578432 109986 1 -13917677457941 109988 2 5942612039616 109989 10 55312640782004232 109989 1 -11883573021969 109989 19 137338811710056 109990 4 3212770604831 109991 2 1437200810739 110010 3 2312369930971 110010 7 295340211459527743 110010 9 245254410012035863 110019 1 43297642218727 110019 21 998994835943 110019 22 -124059230244937 110019 7 63837282082015 110034 2 -1565807165541 110040 16 -54693729359321536 110040 21 3874887232471072 110055 7 -9969133235831864 110055 8 -3548026749464 110058 2 -29938250334725 110058 8 -17490644246681 110067 4 -526755796093 110070 2 1522451370827259 110070 22 -6849850535649 110070 24 -60567619678641 110070 6 -24331194961677 110082 1 7062339388987 110090 2 -3108169794595213 110090 4 -1190081344573 110100 3 186191197945012000 110110 15 -1100191181949823293 110110 17 -462158250797573 110110 29 3736454788343336851 110110 34 99258723814560211 110110 37 388769656152779 110110 45 1659551135045903 110110 49 826589918820303 110110 50 51269155233967 110110 54 -18735655980833 110110 60 211152566725199 110110 61 203760364637159 110110 65 284606598207933639 110110 66 -74574548320481 110110 71 -25018336380147209 110124 10 1797310801027008 110124 21 2619303775911360 110160 1 15120802666368 110160 32 2761786422914112 110160 41 -20863660888512 110160 56 506957108629824 110160 69 1804987337668416 110160 86 -16291947068352 110166 10 641758676164759 110170 3 10852375488111 110174 1 36869666783103 110175 13 -246128059000 110175 14 -237930407083000 110194 2 -9221907177197 110199 1 -1716240169144 110205 6 26305125475851 110208 12 -1968154385408 110220 12 -35183281738360384 110220 7 -8923387270671584 110230 4 4837179187223 110238 1 -8376426513613 110245 2 16082607725347123 110262 3 -25012429280878547844901 110262 4 16795855122371 110286 10 -4802680222321854141 110286 22 191022664905783 110286 8 2758255959483 110292 6 -9109776738880 110320 12 -8150480139820443328 110320 19 -58290657183424 110320 5 -362152874248416 110330 11 -1940284126601 110330 2 -522653609557 110331 8 8278390081755 110341 3 128667688869672 110352 42 -349960337270720 110352 43 108904037925522752 110352 55 -1298690499392704 110355 1 468391157890867 110370 17 -4228233976169 110370 8 2715690412186939 110381 1 -40845722410891521 110390 13 11049865017407 110390 6 349927353586539 110397 4 15316850476907 110400 111 28089728331200000 110400 151 -28089728331200000 110400 204 -5023230664384000 110400 213 97546815872000 110400 253 -224717826649600 110400 29 5023230664384000 110415 3 -1979811367258904 110418 1 6432671113723 110430 26 -920194160049 110432 11 1928794386975616 110432 4 -1928794386975616 110433 2 -173846792318005 110439 2 19657096635240 110440 3 -233834967390016 110442 5 -74201500819311065 110448 31 133296106637095488 110450 21 -1080759677361625 110450 38 7302488363509375 110453 2 92287080631432 110462 2 4514725442503 110466 14 28450340368515 110466 15 -736449793351317 110466 21 110559495679560732051 110466 29 -107616301401465 110466 35 -35527447008516249 110466 40 221296135154679 110466 8 -20176831611549 110476 1 4491613391040 110484 11 -887290681147776 110490 11 -17350961597101 110490 14 544731441391 110490 23 -130084292234737 110490 3 -2002648638077 110490 6 -2284695306918027701 110490 7 -36988142310989 110490 8 225140312611 110495 4 -2834324799544 110514 3 9831627071531 110517 3 243370217545480 110520 12 -25674145480512 110520 2 23637013451712 110526 16 18998622485063 110526 7 -515709602321797 110528 43 634844808465920 110528 7 -634844808465920 110538 11 19815524571771 110538 12 3736806017641335 110538 19 -535019163437817 110538 7 -100893762476316045 110544 107 -241926689690560 110544 18 -42070515155648 110544 27 -21863457671104 110544 6 7499165981188672 110544 92 -94737113523136 110544 99 -30865641375520 110546 2 -235174708308581397 110550 16 322165093134696875 110550 17 -3723443333984125 110550 3 -110350028853125 110550 43 9862182772393375 110550 46 2577320745077575 110565 13 -48431517215544 110565 1 727672201992 110565 6 1793759896872 110565 8 -19647149453784 110577 3 -7040912740253 110586 4 -98003948545 110602 4 4315010439239 110608 4 -44737734950848 110627 1 -6087961843181 110628 11 367258725487296 110628 9 32290715151041472 110630 11 1310711668014367 110630 18 4377723680511 110630 4 -19876118985917 110636 2 15369387451840 110666 2 -153964165041 110670 10 5382082057339 110670 17 2077748008190863163 110670 19 -13895482152637 110670 29 7577077018463738171 110670 35 -7484742568549 110670 50 5605286056847 110670 57 -5328141152220937 110670 59 215526923035703 110670 6 -4889305075596173 110670 68 -691661662302241 110675 1 108528199438375 110682 11 -13371291758705373 110682 12 8136551654379 110682 1 6265829337993250371 110682 25 -698228934057 110682 26 -17399953469241 110682 29 1634366813369679 110682 30 -232067753259009273 110682 45 12094615752187508324127 110694 5 44402300907674255 110696 1 -7026668561728 110705 1 -18435914259993 110721 6 -107142002488 110722 2 540063271385351 110730 2 -5217442401437 110736 8 295113157669440 110754 6 -161524304780553 110766 1 80877649094258795 110770 11 -505268306565857 110770 4 1317460821939 110775 3 -494600720008625 110800 17 -1383699325752000 110803 2 -7221294836216 110803 3 40621689820027 110814 6 408690541929059 110823 1 134128430080795 110825 8 -6379804597087000 110826 3 -33745821301773 110838 11 21605969887579 110838 19 -52311661910893 110838 35 -9010689285079405 110838 36 -34169409925217 110838 37 -262168388787473 110838 43 4952326539770407 110838 44 -162356019317513 110838 49 801566574759055 110838 50 546506619512959 110850 2 1306145111102875 110850 25 187255603515640375 110850 4 -327350263887125 110864 19 -828516478231748800 110864 22 -377112643710400 110880 11 3847166747336729088 110880 2 -3847166747336729088 110880 59 103873502178091685376 110880 66 -103873502178091685376 110880 91 2787955900372224 110880 96 -2787955900372224 110886 4 -5889243022073 110894 10 8192787161942757275 110894 15 108413510326479 110898 1 -433355371208253 110902 10 -3770057908987569 110902 8 -108897508288207449 110910 9 43507354787566759 110922 11 -1970281589221 110922 1 -2008657293677 110922 5 -9375598938565 110925 25 5827845971889000 110925 34 147819731614875 110925 43 50366917841175 110925 50 6295864730146875 110940 3 -16361451672128 110942 5 -46220228928225 110946 11 -1291558059141461 110946 1 -123200791418429 110946 12 -89015472994088633581 110946 16 -686257103481261013 110946 17 -66990528832235149 110946 28 1400100823506079 110946 38 2214229976109359 110955 3 -19711857444209 110957 1 49813800423643971 110960 10 696423109999168 110970 11 10778105919287223 110970 18 -645369947042481 110970 3 23902590631203 110970 8 -399189108121749 110973 1 -3250873336357 110976 9 46813192704640 110979 17 -168865440140952 110979 18 4057306274007 110979 25 82115516180187 110979 9 1500716990890440 110985 11 -131338177945912 110985 19 -46080075398392 110985 3 -4083450300607832 110985 4 5319066855592 110990 12 -5606840001689 111010 4 -36547752303549 111012 3 -38972062889574492032 111024 38 76490758154304 111034 1 -17335358712973 111035 1 965794038575112 111045 2 -24950830624793 111048 1 -55475028153152 111074 10 37032620024231711 111078 52 28140381315968031 111078 55 80955659933775 111078 67 282552261297471 111078 8 -1042236345035853 111090 11 37310241741844051 111090 12 -29661745586415389 111090 22 -66216992059942093 111090 23 418098465540827 111090 27 -22206323762481853 111090 30 196418525800211 111090 33 391932608055659 111090 40 1138847531046247 111090 41 -1642692781256551793 111090 43 260120286550783 111090 4 -8910582222923333 111090 51 1130461269195943 111090 5 166903320397267 111090 59 -45187811348656409 111090 62 4530092203501759 111090 63 135012146071879 111090 71 108850046763527 111090 72 9744860327327 111090 79 -9146969542873 111090 83 -21842510736416761 111090 85 10663303759012871 111096 2 -334493146541376 111126 1 -909975846205 111130 2 907258376952963 111150 105 -78053010314625 111150 113 54205895334375 111150 116 21595125669159375 111150 126 -25527768777140625 111150 23 -63669950812125 111150 38 1681276049911123875 111150 39 257013907621875 111150 45 154688730955875 111150 46 136974652792875 111150 48 9180246942664875 111150 50 -166949572289977125 111150 65 -204222150217125 111150 72 172761005353275 111150 75 180404309325375 111150 82 10353451087587375 111150 8 -383461151392125 111150 85 -169759331222625 111153 3 22420929719539 111162 5 129337604335 111168 29 266447869825536 111168 59 -266447869825536 111182 2 58252187312515 111186 4 -332390582115957 111186 5 8974545717130839 111188 11 -680670423820512 111192 11 178090613638208 111192 6 -48379846523264 111192 9 9722380131008 111198 5 -105185381741929 111202 11 -525397354126541 111202 15 1473295477197167 111202 30 162121954410858455 111210 17 -693668682093061 111210 2 -6289794846773 111210 27 16789086097271 111210 7 112944683659137931 111210 9 -5813738421749 111216 5 -1925278372016992 111220 2 13380967839392 111228 2 461466399397024 111231 1 -11082989466936 111231 6 1140457199688 111258 7 -5838029358309 111265 4 199699988302919943 111265 9 63493156811771 111274 3 25051475209779 111297 1 -2444800103981 111300 2 678670264000 111300 5 -48670691336000 111330 3 -2828729465757 111330 8 -3462004889829 111342 12 -854804742625 111345 2 -94231767652001 111350 4 -185433031687159125 111350 9 991724299465375 111360 13 -77611028518144 111360 2 -12487224704768 111360 24 12487224704768 111370 11 -183386615316101 111370 14 -3848270106393 111370 20 2189043105539023719 111370 6 -252499356794357 111370 7 -1615857235389109 111370 9 -20219776104221 111384 12 583028387414208 111384 17 4590636473639827584 111384 18 -199469575699327296 111384 20 -820183229695584 111384 28 -2930373922176 111384 34 9108184466016 111384 53 844781592583872 111386 13 -808749957112857 111390 12 -138778342079095767041 111390 5 232114948085971 111408 25 7186877216944192 111408 27 -27213428060864 111408 30 76182269217344 111408 6 -3576825993281984 111410 13 -1792096919028729 111410 14 -15137051607809 111410 2 -32717325407077 111412 2 52417440870064768 111420 6 270318146016384 111426 1 -482529129745733 111426 28 -3241675517633 111426 39 1577486777158439 111426 5 -114725064961493 111426 9 -72585188277245 111430 7 -2129960603399149 111433 2 -949390240149 111435 13 62618817764584 111435 22 -43484974553701 111435 5 -11668304917174209848 111438 15 -17869681419633 111438 22 78074398135071 111440 18 262874949184 111440 20 -33758763897536 111450 11 17426663475875 111450 19 -202049871990625 111474 14 -14546274173807373 111474 21 -3336873587620389 111474 25 167668176840255 111474 9 -4527040774686885 111486 3 67801875557278051 111486 5 -1053291088457533 111490 1 25479666060147 111496 1 -2317578121600064 111504 16 650324583395648 111510 15 238415318951643 111510 2 -14297329705653 111510 21 -72438550019541 111510 25 554494731283179 111510 26 -261930125230101 111510 34 -20536841899377 111510 35 7072113381212727 111510 39 -10556468611137 111510 44 -8830196998209 111510 53 -2946141601270713 111510 58 -16776438562017 111510 65 386027902052631 111510 6 79545823234309251 111540 13 284941729957096576 111540 16 -11513347636544 111540 19 -249802829360864 111540 22 -504840842496224 111540 26 -2606792475698549632 111540 31 -310238151213952 111540 40 -1186523657577856 111540 4 -55126278234935648 111550 1 -63308585475125 111550 8 -2775876788125 111552 1 16406964533277904384 111552 14 -840978527183360 111552 8 43127451831808 111552 89 840978527183360 111552 90 -16406964533277904384 111552 98 -43127451831808 111554 2 1845712514517777611 111554 6 375679323125947 111555 8 5745103729385247 111566 2 1430703540652303 111569 1 -1283379063173 111570 9 -3037926808889 111573 20 -364071852985617 111573 34 33168993705855 111573 34 518266522935 111573 35 -177765417366705 111594 1 -292911634237855949 111600 102 -33648987384000 111600 128 -2496806739082872000 111600 163 -477830905920000 111600 174 107650528200000 111600 181 206115472116360000 111600 43 2356020457704000 111600 68 -146944395864000 111600 72 1716634135944000 111600 80 213226253928000 111605 6 -626912916355601 111606 1 -967897319577461 111606 7 -6566718221183537 111610 4 -18050295062609 111617 1 30510410693089672 111617 2 -357713965424600 111630 11 -92366347406540077 111630 16 -3146199768680993 111630 4 728971316845219 111630 8 -19369154842510933 111633 1 -7537522738328 111635 2 958517806851 111639 3 30357327619426463 111648 4 12558796240384 111650 17 -657765468651154625 111650 23 -115202148720625 111666 5 7549747134073811 111666 9 -15313216776137 111670 3 -1729864950346053 111672 8 -36393389895744 111680 2 -18623080343872 111680 4 18623080343872 111683 4 215467893146440 111690 15 185334368835411 111690 18 -2721071754909 111690 24 44295074544339 111690 26 -771067193028669 111690 32 28491806919807 111690 3 -4842466881021 111690 41 9236804167335667023 111690 43 421391166577767 111690 45 -1230473197437201 111690 48 60070110820429239 111696 17 43145794901312 111720 15 482373335434816 111720 32 288292424952371392 111724 2 2372517900860032 111735 8 803152743871752 111758 4 -1459609761436865 111760 14 -942972212046016 111760 1 8157028912337728 111790 12 81012421356047 111790 4 -478009633170357 111792 31 1592641424000384 111792 35 -177694007739328 111792 6 -191443936928192 111813 2 -24118414204184 111825 15 5668561240875 111825 20 160450316724375 111826 11 -4883383123497 111826 4 -3058722563578453 111826 5 -13929796331469 111826 6 322357261909203 111834 10 -3949901255863593 111834 5 146292639106059 111846 7 -16055811965089 111850 4 -6200499836125 111852 6 185919642150048 111853 10 -44185915696049 111858 2 -2346919272449 111870 12 -292929414083577 111870 13 -94497486486273 111890 3 -11896387950429 111890 4 1183259021743 111909 6 -61348407651649 111910 11 54883183990463 111910 13 -86566809748481 111910 5 96725782993196987 111925 12 12290916617001000 111925 2 -1823383507627000 111925 8 -111800551878125 111930 10 539946212203 111930 19 559828750560227 111930 2 -1931075101493 111930 22 -2697621862622077 111930 23 -102545481957157 111930 25 75654627776027 111930 3 1602190747416043 111930 40 7993313462863 111930 47 4287285307813591 111930 49 -12457720387169 111930 51 -1067402926072153 111930 5 -15327910575557 111930 55 -405552025396153 111930 65 -681066470449 111930 9 -3206881136213 111945 7 -2223502359416 111954 11 -3270852046369 111954 4 -12994939952909 111954 5 7040210979259 111960 6 121284210181824 111969 1 10110420890440047 111969 4 -374460032979261 111969 7 -71994640664088 111978 5 615317675787927 111980 4 25488428162752 112014 12 -99301765232061 112014 24 502865933201415 112014 9 -916780571792904357 112024 1 -260161377183936 112050 19 9750031243603875 112050 37 -29911100225625 112050 43 -361112268281625 112050 51 -45189226940625 112056 4 35645036995520 112056 6 -156836263154752 112064 2 592755052032 112070 4 -18464061489301 112080 5 -502727491663552 112086 1 -280689513318765 112086 5 7578616859606655 112086 9 -32246938066689 112091 1 -76550054204413 112098 12 113606303062895 112098 3 -118324590785533 112110 2 -2516229096271011973 112110 7 13436912733391 112112 13 -346701011094144 112112 22 25270506999930752 112140 9 16303512649248 112158 8 12958329334095 112166 3 -40837185152391609 112167 5 947775943195191 112170 6 -1891136147473 112170 8 -265710702384361 112176 14 -32045194067904 112182 11 -14762958264305 112200 42 60471511192000 112200 51 622904376340000 112200 65 -27203867632000 112200 8 110479170448000 112203 1 25927983461115 112210 10 -12409562788021 112211 2 -278884734795576 112220 1 8287060310774432 112220 2 -3176617173056 112225 8 213488532544375 112230 23 1688038289065971 112230 40 749004264076527 112230 49 4073094576711 112230 8 12371953417310760363 112240 5 411202259309888 112242 16 -3719155229945 112254 15 -1634876459569 112255 9 -150071858081029 112259 2 170132006808008 112274 1 272779400763 112280 15 -3235354352121536 112290 11 -117926400874293973 112290 18 -111091948183909 112290 39 -3806443823921713 112308 4 72931601326132864 112310 5 83046821452127 112320 6 -18528569503488 112326 12 -5093926056289 112326 7 740433153414239 112332 3 11441896122016 112336 12 -14335879386816 112338 15 4562526759211719 112338 19 -4066708509215577 112350 10 -112080136635125 112350 16 1884439871875 112350 21 48018635960471875 112350 28 56980858668875 112350 32 -95440997394722125 112350 40 -420313561589125 112350 44 304963992096875 112350 4 5196275662103875 112350 45 8075594580171875 112350 59 418115244496375 112350 64 2439711936775 112350 67 64604756641375 112350 71 35684447436200375 112350 75 -586187368539625 112350 78 -4395026391036625 112350 85 384149087683775 112350 86 382885007564375 112360 5 52682488368121792 112370 1 -716054070310699213 112378 1 -3941408392389 112378 5 181086471535663 112386 2 3228101279335 112406 16 -53799584426311465 112406 8 104534481942611 112406 9 821555184294019 112410 17 6680159512479 112413 1 20764894854824 112416 2 -7648571353600 112416 5 7648571353600 112421 2 -16703809750584 112422 2 16800836583995 112434 3 -84658610933065 112443 1 -84508845976 112448 17 -114598785752576 112450 3 77244923014875 112455 13 -183538332720792 112455 16 -183553481540457 112455 23 4955944001592339 112455 39 -40328406315288 112455 52 -508482978831576 112455 54 4265143696296 112458 2 -1205508429701 112464 29 1058041566377280 112470 12 69117000689411 112470 23 26915647253252111 112476 6 -4035850880608 112487 2 -1846744919000 112496 2 4335233005376 112508 2 5504226600096 112518 11 62809172937531 112518 22 1225379304578295 112518 39 167596074690687 112518 5 -45384418688085 112520 1 -6869263452992 112525 3 -18388913431960 112525 4 -2298614178995000 112530 11 -1902219343119557 112530 1 170900050874707 112530 17 -1259486713552661 112530 31 -37927884882349 112530 32 150248644793819 112530 47 15907696989532183 112530 49 -2179201014443321 112530 52 252738686586444751 112530 58 -187341906388769 112530 67 15385415600552327 112530 75 -655771134597337 112530 76 -30865735054297 112530 79 -243218967441769 112530 8 18494194657737403 112545 2 1174309508547 112548 4 50605314568480 112554 19 247146546886551 112554 28 -57774824981163225 112554 5 1535683462463475 112554 9 -31683015531765 112560 21 -43202672769376 112560 37 -420064713303488 112560 50 1208738638678153024 112566 2 -12028618141685 112574 14 5348293494530772367 112574 3 17809348967299 112574 5 -6670466531398280197 112574 6 -18663571003490864037 112596 6 421212593456288 112602 11 276921948824983 112614 1 2189404253664883 112614 4 -32528739131261 112615 2 -19236348495117 112623 5 5243219511083 112623 9 -15872121383077 112629 1 -3238070206229 112632 26 950735287292192 112650 5 -1414405151494092125 112654 1 69684104393580923 112659 13 21059605267775 112659 2 -151641083868344 112659 7 -1363295738687300344 112665 1 -1565759810537 112665 15 -2849698581549049 112665 17 4149269129384 112665 2 -58954669053272 112665 5 -1418385869657 112670 6 25719798807 112683 1 5721713706088 112686 8 -7063989645385 112690 2 1047821102587251 112700 15 60910946750276000 112700 7 299339539604000 112710 12 -9923844291331589 112710 20 -966660861267269 112710 23 -48755847003312096757 112710 27 489405505434587 112710 45 -870969060071297 112710 46 37629936012583 112710 50 -10032640627697 112710 5 -1419556139432727893 112710 62 -4774526565265601 112710 77 184875875629820279 112714 8 846860310365008867894583 112728 3 62363921176664416 112734 3 3473421672051 112746 1 -3715484872517 112746 2 4399282179163 112746 3 -7791065158517 112746 5 -217001638402669 112749 11 3221452790191618696 112765 1 -676109570616 112770 2 -305324974359485037 112770 24 -78564534796941381 112770 27 26140371479739 112770 29 -30139427801814381 112770 35 11308332383684631 112770 41 -20826489665241 112770 52 -137239508021337 112770 57 69121413054639 112772 7 -138105865795332160 112775 8 -41743360999287000 112776 6 -21754516287264832 112782 3 -44450484767405 112784 17 626788372786876224 112788 6 -9486834674400 112791 1 -1263119033161 112798 3 -3945430527101 112800 26 -182854250200000 112806 12 7682975289624663 112806 7 -207440332819865901 112830 7 65093110900977079 112838 5 266628135887 112840 1 13903984836288 112860 27 317810356830144 112860 3 -8580879634413888 112866 8 201481270615 112880 18 -3334128993216 112880 5 2981194087794799168 112890 3 -3515395801040533 112905 9 409465184103 112908 2 -14228307058966336 112910 1 975211166187 112917 6 2661923200931 112917 9 -588806257560263128 112938 20 -272936449801 112938 9 -917913889546793 112944 22 -5364019510202816 112944 38 87223188686336 112944 42 2938466553920 112945 2 -9058707210916216 112950 13 139463878210875 112950 14 -2134402039125 112950 16 9611115712875 112950 20 -2036383290811125 112950 9 6344034813291202875 112959 13 8626573394235 112959 15 1714087729505367 112971 1 -22859715108869 112998 3 -412242533821 113007 1 4315311828382411 113010 18 57807772559 113014 7 208119990035287 113018 2 -2673609177005 113022 12 36794272804943499 113022 28 25255450653399 113022 38 -993977006406550713 113025 11 4608688759976375 113030 1 40307254460767 113040 55 -4352315237820864 113040 64 574912213098336 113050 22 911456267947875 113050 24 3958144667875 113050 42 629373007006267056875 113050 46 -31105381009625 113050 48 545579253985375 113050 49 5034984056050136455 113050 55 191095096701375 113050 62 6246152289606375 113050 70 11363866734375 113050 7 391950428813875 113050 79 196927881834375 113050 80 14642331744375 113050 8 57746757228875 113058 2 -552578885685 113100 11 49292800957648000 113100 15 -142689455596000 113102 6 224895007231703 113110 3 29244193714143 113114 2 173544528752371 113126 2 4805016941616507 113126 4 27656868123 113142 1 8527674204199 113150 1 -1180710345232125 113150 9 -32108476713625 113155 1 -3593969931397833 113155 3 -4061798702569 113162 7 183408771467935 113170 2 6278923105579 113186 1 -2140705222309 113187 2 -482242299939640 113210 1 34516581536165219 113216 13 157871760884476416 113216 7 -157871760884476416 113226 1 -2358412330345685 113230 15 3669486435022967 113230 20 139183997319991 113230 3 50941325913906561003 113230 5 1526200781087592883 113232 23 107327082240064 113254 3 681925048263 113256 4 -207979880226624 113274 1 -16407211618125 113274 16 -19270719809613 113274 23 -263572012361925 113274 24 -172996744757733 113274 34 4319057304883215 113274 41 31025693723823 113274 6 -159965085366045 113280 4 6637858997248 113290 4 145911316456353087 113304 3 2040948860032 113310 2 7603335429003 113310 3 -49143094282269 113322 1 -800653981308041933 113322 21 2600729286535 113322 23 -2481383365057 113322 26 -659570337264745 113337 1 105878393322408 113344 19 -46938904441344 113344 35 -20858265473536 113344 39 -1715260879872 113344 60 -7005325837824 113344 81 20858265473536 113344 8 1715260879872 113344 98 46938904441344 113354 10 497922857198631 113360 27 8526055680275264 113360 7 1341990560738368 113360 8 -198801598058432 113364 12 122161245261905088 113367 2 -41422359072617 113370 2 447058520430427 113373 1 225511024418017047 113373 2 -8352260163630261 113386 13 -157796672975837 113386 21 24773048093087 113386 2 -31941891212581 113386 23 -1952424070065 113386 27 -35662818507057 113390 15 7455947261623191 113390 6 24503454580987 113400 23 -64189913633712000 113400 2 718044512184000 113400 72 2377404208656000 113406 3 1665927608664779 113406 4 -890714477033 113425 8 2558303048842137000 113430 9 -127631053197233 113435 3 63463135419432 113436 3 -6632613521280 113442 1 -23139034913357 113442 3 -765698701532744141 113458 3 -64542183338285 113458 8 -709768473065 113460 7 -730277974064224 113470 2 348795401723 113475 10 -46987195961125 113475 4 -19937492567000 113490 13 13658522507163 113490 16 186950887771851 113490 18 -212928589856642661 113490 19 110707025068899 113490 22 -86565687566229 113490 28 -8900903105339337 113490 8 -2663569954917 113498 24 -91854772804300913 113506 1 -39259444407083901 113512 3 -26009157236544 113520 1 7239835626688 113520 20 4242076933184 113520 32 -52804543852736 113520 45 28557449942336 113520 49 243765745004096 113526 16 22994693548875 113526 30 -226678671356985 113526 33 -254389865388345 113526 36 9899708265970515495 113526 37 1004025564693927 113526 5 -656953645216581 113526 7 -1770287596965 113529 5 101613363129143 113535 12 39943996740827559 113535 2 1838276093064483 113535 3 -1479407286697317 113535 6 -536207929391097 113544 11 -203775170000162688 113560 6 172600269418944 113565 6 -1370711089621 113568 36 -513067661696512 113570 10 158738451399503 113570 5 10522587258459 113575 14 -71569709135000 113575 2 -121426996748625 113580 8 19975998667392 113586 14 -513266085953 113594 1 3718565600563 113600 15 41332521752000 113600 22 -679928488768000 113600 63 -230814596800000 113600 6 679928488768000 113619 7 -224579514813929 113620 4 6298714484928 113622 10 33626840862079 113640 1 108914240345413312 113643 4 -338200234986456 113643 7 12344180605992 113645 3 656434863559 113646 11 -13044452502401 113646 15 -12121416843697 113646 19 114319238812678511 113652 18 53937151286976 113652 9 -40707326998743264 113655 5 186192332603 113666 13 -1181822634665 113666 14 -6453384045901073 113674 1 37996153653439 113680 19 -311433853606848 113680 42 106821811787148864 113680 50 526208415133184 113685 10 1548407828843 113685 14 -578937543197043961 113685 15 -39480630309496 113685 16 996878328214679 113685 2 2970429158152 113685 7 -1410705029501 113696 2 28301819964416 113709 1 2389100483528 113715 11 -139568714736408 113715 21 49880898651578427 113715 9 2100251318717448 113729 2 -119195411867973 113730 4 39740561848684243 113730 7 -6898742223373 113745 2 438126336712 113760 11 420962439059712 113760 14 -420962439059712 113766 6 56334136853287 113787 1 -19887707461437 113787 2 536968101458799 113799 3 -2129775861016 113802 1 372466812474827 113802 4 -14322552583769 113802 6 -1258758988319737 113810 4 -604702773298297 113810 9 3003378549055967951 113820 11 29644908758144 113820 15 -6842275830496 113826 5 126907669059011 113828 1 -44858350060928 113839 4 -2301165627713 113850 100 5166195312375 113850 108 -146157523684785 113850 109 125844240522375 113850 111 97098550959375 113850 113 561601955208375 113850 11 588710167549875 113850 117 -507948494531625 113850 118 -608403468950699625 113850 125 6392101591317375 113850 132 85622787750375 113850 146 756530691909975 113850 20 -1874521372267125 113850 21 60876812158875 113850 22 2458837726045875 113850 24 29891432122875 113850 38 -17288266222125 113850 41 -709481693314125 113850 5 204672267148318875 113850 53 -8613705385125 113850 57 175789137535875 113850 66 -18269690460598125 113850 70 94566336488746875 113850 71 362553175546875 113850 79 721614020956875 113850 81 -21804080279625 113850 90 -94716413852625 113850 93 -5526151213004609625 113880 17 -79628431435136 113880 19 4571085342313504 113883 1 1624234517515 113883 5 -67260313445912 113890 2 -84667387326661 113895 2 -14799693060297 113904 11 -29765420574912 113904 21 22196619247104 113904 43 -379384841596608 113904 51 -177348528506304 113910 2 -1064348968373 113910 6 -3762694220509 113918 10 -24886570534281 113925 12 14115882025000 113925 18 267645040019875 113925 20 -275722860919625 113925 46 24677675225000 113925 80 94847222645000 113928 3 2826018798400 113934 5 1084066663967 113946 4 -8407342004165 113950 10 121020844486375 113955 2 1838279128453069627 113958 12 24171746203071 113958 3 -80262590386495644405 113958 4 11181382027587 113970 12 -59950418019877 113970 18 15261197791358647 113970 24 43919139628439 113970 6 1925297202871171 113974 1 -16370575284105 113975 2 7441965269000 113982 20 -20652385775417 113982 21 191849667383143 113982 24 1941383980305847 113982 8 -44292892874021 113984 14 -67075223164416 113985 3 11593703993832 113997 4 -8020724070104 114002 15 -523392690796137 114002 9 296064293496903 114005 7 -15547447227734136 114009 4 -916651714168 114010 3 4032888974083 114014 3 -46810061579213 114019 4 -2144530670680277 114030 20 5953140624411 114030 21 -309873166275861 114030 26 -2672344905021 114030 36 -75375319580217 114030 39 -201245402094057 114030 45 -232081931984337 114030 58 56477977367391 114030 59 107642843722791 114030 62 28986330929751 114030 7 -822121553637 114036 1 -759528995096672 114057 10 -1500664924440549 114057 14 302086795275432 114057 17 -4366042822872 114062 2 87363982361915 114065 3 -39781335082168 114075 22 -441102591702118125 114075 24 16337133026004375 114075 46 115272692247375 114075 47 -3528820733616945 114086 2 -55168796770165 114114 14 1870729709003 114114 16 222305258009251131443 114114 22 -344900722858957 114114 28 1088504636939 114114 32 -1674239653549 114114 33 -17561171061078373 114114 35 906881318407 114114 39 -4191621038739161 114114 47 350521093519199 114114 56 3850626513070511 114114 5 -799697138813 114114 60 9842353904375 114114 64 -586649824489 114114 6 -7583146614486269 114114 8 424241564463163 114126 5 2531014115867 114126 8 -54708298810721 114128 3 -151514565076160 114130 5 -536232826981 114135 6 3209450309864 114142 3 1057850006343102099 114149 1 1902074560840 114150 15 -281900389324625 114150 7 169715418396875 114155 10 613112882696 114160 6 -185524626515904 114170 31 26156460076271 114177 2 435931168247 114192 23 -34864335181616832 114192 25 941337049903654464 114192 36 -8740479939264 114192 53 -15422195945664 114202 9 -6440394631697 114210 11 -832893863209497 114210 18 -83499112885257 114210 4 30847920859611 114210 8 -177963520223061 114215 1 -1468233430494913 114234 1 -3525139339901 114235 8 803356904352744 114240 109 -1957671265024 114240 114 -723174814042624 114240 129 -27632017832896 114240 136 -18995638116608 114240 138 13914293458048768 114240 141 146274828332032 114240 159 61331467889152 114240 171 72223127987968 114240 18 4225987700992 114240 184 27632017832896 114240 19 -26883008946368 114240 206 723174814042624 114240 212 -17067198080512 114240 223 -72223127987968 114240 252 20998934069428736 114240 276 -2445522129715456 114240 29 -1977920502272 114240 38 2445522129715456 114240 44 849016163584 114240 5 -1277953379072 114240 57 -20998934069428736 114240 71 26883008946368 114240 78 -61331467889152 114240 92 -146274828332032 114240 97 -13914293458048768 114243 1 -12329841823145 114246 11 566331185916459 114246 21 -4048515905985 114246 4 139393154746323 114257 2 11467935616968 114257 3 53127083103699123 114258 5 -499733336278045 114264 10 -169296855598944 114266 11 -1278866284201 114266 5 84954792957615 114270 19 2690512616222783 114270 5 974110516288651 114275 2 -5476185518383000 114285 1 735524152848271 114290 9 81530438857675119 114294 14 268760131264943 114294 17 -210747246337 114294 2 3188501571131 114310 11 29505189176343343 114310 4 -7009290349237 114310 8 -22434329431967221 114318 12 -31978516245741 114318 1 -2754180936477 114318 22 74362885284879 114318 26 -157424992703721 114318 5 -2569374391797 114318 6 5830555285323 114325 6 13023010784375 114342 16 36489566011807 114342 2 360949961251 114342 9 -720862559799445 114345 23 50601839009931 114345 69 -61102030585464 114356 1 7889794591392 114366 17 86371028726311 114366 30 -18021003207193 114366 3 -387145382650201133 114366 8 132790866249018988619 114380 2 -635403809691008 114380 3 170063655833728 114380 6 87011836617376 114381 4 -291839331208329 114390 15 -324607387855149 114390 23 -417788784916713 114390 24 363521387943 114390 25 -14554636965153 114390 27 54618926240727 114390 30 -6103048868639793 114390 31 -706669913079657 114390 36 -267743641690737 114390 39 -6371124145353 114390 8 -62167783215092733 114400 14 -763887312937561600 114400 22 -95485914117195200000 114400 36 763887312937561600 114400 6 95485914117195200000 114422 4 -58687093067362677 114425 3 738203471533000 114432 10 -6572209596416 114432 15 -821526199552 114432 25 821526199552 114432 41 6572209596416 114433 2 5845193468648 114444 3 -195665514060672 114450 17 136399465196875 114450 18 727516339586875 114450 23 21060314484875 114450 25 -28292750924807125 114450 30 -214238947088125 114450 52 4789247174183375 114450 68 -108023711587620625 114450 8 -864189692700965 114458 2 -20556063113301 114460 4 -12486120748416 114471 10 -86467559131512 114471 11 5598264246723 114471 15 -106585769596536 114471 16 256919727571143624 114478 13 1897111292272559 114480 8 -197120950385184 114490 6 -850468176695781 114499 2 834622856712 114504 11 355200750709280 114504 15 9839622212895968 114510 12 -51214753702241 114510 16 153723340076087159 114510 2 2903753911627 114520 7 -2166125980544 114543 18 -4694197930974765 114543 20 -10529652629016 114550 12 -5110090168924225 114550 3 -638761271115528125 114552 8 -5131076680337472 114570 16 436058083629603 114570 20 -162619580182509 114570 39 4057697575503 114570 41 2274284208693807 114570 55 404357700990951 114570 9 303453961648227 114576 14 -6852037203085024 114576 26 -11772064051712 114576 42 10285962459377984 114576 45 -64175891451328 114576 54 -741562016896 114576 55 69725443729472 114576 61 52980392196811232 114582 11 -147702848028313409 114582 13 -445475932913609 114582 4 -978710624611198973 114589 7 24178134348156456 114594 2 189239799907 114597 3 -10859643339525 114608 10 -80191846537856 114610 1 8001375480270027 114624 31 -40336463199744 114630 1 13002815290663 114633 1 -23268617145432 114638 9 52697846794959 114639 7 42494718600940040 114660 41 1443548227314816 114663 1 -2763712554733 114672 5 -4082779947968 114675 1 2408379992636725000 114675 15 72984001839400 114675 24 19267039941093800 114675 27 9123000229925000 114675 7 -82430740773733625 114678 16 159079082014179 114678 24 128501316799865352495 114678 4 -4759308029624642685 114681 13 -496482352633 114683 1 35246395323080 114686 6 14343683007255831 114714 4 -948291602461749 114730 13 -14087747364586713 114730 24 100678727844540719 114730 4 -19011481219333 114730 6 -58972057829 114730 7 504045657356291 114741 1 -350109370331541 114744 2 1430447811823808 114760 5 -4635610374805056 114762 1 5992097570659 114762 3 -19898708004289 114770 2 -3480513045461 114774 10 -247966089904117 114774 1 13563605192707 114774 11 -484688940019416109 114774 13 -5045100010165 114774 4 68020011803107 114790 2 -476720641521909 114798 15 132944940170047 114798 16 -138770402770601 114798 29 43333338582863 114798 4 -448499381670845 114807 2 7492801715623 114810 10 300642365187733519 114810 3 371319563539 114810 9 -802383059719313 114814 1 54089619489107 114829 10 -643429247254145 114834 14 79784683665983 114835 4 5487374227242312 114840 13 -38821640874497856 114840 3 22820433994944 114840 35 92069592891649056 114840 4 -479111307587136 114855 10 -31554046058833 114864 9 650996074834496 114870 12 -395681394781 114870 23 -108552169849537 114870 24 23069719824551 114878 2 299313520083 114878 5 -2524093860510441 114886 5 1074608454562039 114900 2 -147918942908000 114900 3 5840453688976000 114906 13 -7833838077217 114912 1 230279486575104 114912 30 -230279486575104 114912 8 7689987113472 114918 5 10646586270611 114921 6 1059612638407767 114924 1 -280090510653824 114930 16 2381910929288811 114930 3 438215549067 114930 8 358587457560603 114933 1 1381103802343 114933 9 105437660355656 114936 4 120177411024320 114948 1 -23035875006246624 114950 21 326550027139875 114950 32 475231364304505875 114950 34 -78192160336125 114950 52 -27284435033625 114950 56 -185587099718625 114950 58 10851383621375 114950 61 -43410723603124625 114950 74 -5650516027077625 114950 77 -1407043840772623625 114954 11 215605936951867 114954 14 -149584093696205 114954 19 -152649823198789 114954 26 14793726024539 114954 28 -352171115039989 114954 30 146768731205075 114954 33 -299053831410901 114954 38 2242712785663 114954 4 1318063034891323 114954 47 26144851567807 114954 50 33680043324991 114954 55 6883047212553118495 114960 19 -119711850077455552 114960 22 -3152756108224 114975 22 579744084375 114975 35 -11123632532025 114975 39 -427024871055000 114975 41 -1390454066503125 114996 11 -1876292499478600288 114996 14 -90053945821792 115008 26 2154840939008 115008 3 -2154840939008 115010 3 -1242596944709 115010 5 -6395084118233 115010 7 -35306815329297 115020 6 -217678575515255694144 115020 9 8062169463527988672 115026 2 7330479293627 115038 15 -4649765948778285 115038 25 946690800831 115045 3 -240267925356696 115050 19 18280774744075 115050 26 -52725898442125 115050 29 -395037799677452125 115050 42 21822269773459375 115050 51 9642368825021375 115050 56 2285096843009375 115056 23 110966399827776 115056 30 22690300188317184 115060 3 118944984946816 115062 5 1675814327462719 115078 1 -63396691549109 115080 13 59449676241783232 115090 4 -24002263022617 115092 7 45588620285568 115110 13 346976350617042207 115110 21 -782881621600761 115122 6 146586983672492827451 115128 16 -490614336383040 115128 6 13246587082342080 115140 7 539432548066592 115150 20 -216918976763125 115150 27 1288141001875 115150 39 -40063904043809625 115150 62 676530774175375 115170 25 -3546914632201 115170 3 -8469285459677 115170 4 44760192085963 115173 3 -444618301176 115175 3 -264503330781625 115178 2 4425938897895447948107 115194 5 -377348509621 115206 5 11470370967370531 115206 6 -231307089690809861 115230 24 5961057649487 115230 28 -35672266024561 115230 29 -260825691688201 115254 13 -2751125309315145 115254 2 101893529974635 115254 21 178637953454559 115258 1 -203379621445117 115258 14 69865315123242951 115275 2 -8668261547000 115275 4 -57055188399407000 115275 8 -254848615775000 115275 9 -30419548235000 115290 11 130292908457961411 115290 18 -41390587866573 115290 19 66272283662283 115290 28 14253806079927 115290 39 -1789351658881641 115290 42 -4825663276220793 115294 2 3964373119 115297 1 -211660432036984 115299 5 95574876034824 115310 3 131986162730339 115311 14 -28879162084650520 115311 5 1257163394163643 115311 9 42403845519496 115320 18 -20796505320136256 115320 9 226529682944192 115326 1 -28265987803509 115326 13 8261449688619 115326 15 1046888437167 115326 19 10802546766711 115326 3 -232561094223429 115326 8 -32621051985957 115346 6 -489207249203337 115350 14 -24015203822125 115350 18 21347884669375 115354 3 -2670859924021 115362 13 708457940055 115368 5 -2817621098137504 115374 3 444016095767803 115388 6 -99075546767744 115395 13 253364775741539 115410 10 -268803549449 115410 7 -56942011289701 115410 9 -323726854049 115416 16 9870258414528 115420 1 1240152082848 115425 1 189337617763875 115425 25 249298690977000 115425 5 -5112115679624625 115434 1 5592612771923067 115434 2 113448944283939 115434 28 -151000544841922809 115440 12 7720494537715172416 115440 31 -40169780106493093568 115440 39 16231375102528 115440 60 1091057291072 115440 61 -311658911989421248 115440 68 19855392388928 115440 79 -38163816220096 115440 82 -2063725847865459136 115491 3 170599257931524311264840 115495 3 1794144040264 115497 8 -9093901343544 115498 2 -6016092628661 115506 13 15370312272543 115506 3 -414044806410189 115514 1 88306871059 115515 13 -18713055309336 115515 5 -3362580007128 115515 9 -3034577328408 115520 5 -76105061923328 115520 63 68138441191936 115536 10 -7637933840032 115542 11 2016219836072043 115542 38 -1574519471697249 115542 43 568877820055839 115542 52 -28231353891400905 115542 54 -195125092279152777 115554 1 100164587640893947 115557 1 249019945192 115557 5 5394166101800 115566 23 -10662627733347025 115566 25 -340308784061137 115570 10 -2085277072033 115570 2 -1196155516981797 115570 3 -19786424608917 115575 3 -13425026561554743125 115575 9 -107400212492437945 115578 2 -97899830629893 115584 22 17312045764096 115584 9 9957951489536 115596 15 8466618999784608 115596 19 -2713601719760256 115596 29 -28059075573504625728 115596 34 -12771540998409024 115600 56 613071534888000 115600 73 -106094662840000 115605 15 8944873389864 115605 9 -68426889878061 115610 1 -51121734824349 115626 2 80214287263693003 115630 8 2546938096703 115634 4 -395977801574537 115638 4 -1421932150405 115638 5 -18523015729777 115650 3 -1676924488351125 115650 46 -11446027941677625 115654 4 -69829397675001 115662 2 222330161359675 115670 1 208146097085579 115680 12 -364226269549312 115680 6 364226269549312 115686 12 64636368038055 115686 13 1262813554287 115686 3 -1745181937027485 115696 5 -27188102271168 115698 8 -351093325193 115710 18 -26495345786797 115710 23 86099633805347 115710 27 2124080047403 115710 2 -72699623837 115710 35 -10803386263069 115710 37 1210443195779 115710 46 -8999035807553 115710 49 16595676449407 115710 50 8935916153527 115710 51 -5163451950761 115710 68 570693966238367 115710 9 16427455190371 115713 9 -46492956757762557912 115719 11 -19305579438664183288 115719 4 4662083582344 115728 10 29538838698560 115731 12 -17718120487534308393285 115731 13 -3011889608433 115731 3 6613462192968 115731 4 -178563479210136 115731 5 1002331347027291 115738 12 -18561979662569 115738 3 2125044170655427 115746 1 -113406985864457 115752 13 -10906579180736 115752 9 -11467978887392 115756 1 -11957857671744 115770 10 5566763745539 115770 11 171051456727 115770 12 6587274136663 115770 16 12278720921684687 115770 7 67816963225591219 115790 3 -94913738094833 115794 5 96726434646771 115800 5 -154194369112000 115800 6 -30541019374936000 115810 2 -163244538233 115818 2 3920462331002443 115824 16 -6902772254841742784 115824 21 -1640123288372364526016 115824 32 -27489134042272 115824 38 -4477981201099264 115830 12 -7857543400461 115830 15 8931058289411571 115830 22 15088564300982427 115830 35 -60480407827269873 115830 39 -558835714851201 115830 4 -19587054540717 115830 6 -1590894569133 115836 8 36136893968000 115842 3 496429922750707 115842 4 356143521914299 115850 14 23306830167375 115850 6 -1102489149226625 115851 15 -177322928696 115855 4 11668080797531 115866 8 753333446871 115874 1 -120377746694701 115878 11 3779065417850603 115878 16 -1820892324817 115878 18 -63594425249641 115881 1 -35432706795209 115906 4 -4131842728805 115910 1 -795129261461 115920 100 3153819960677952 115920 103 3102149959113024 115920 109 4212665108352576 115920 114 -27896047717824 115920 115 -21621911788224 115920 116 -21981705675264 115920 122 -55663643192256 115920 134 -643379578174656 115920 36 8174521038965184 115920 38 -31225349427264 115920 49 50648560479936 115920 54 2627311365986112 115920 57 966531100257792 115920 62 2227919770631232 115920 64 -97307828369856 115920 68 -35797448157696 115920 76 -38357913988512 115920 96 -4387517032076928 115926 11 -540097110564137 115926 14 -219749257300265 115926 3 -384937954351093 115950 37 -2676665769540625 115962 3 -633324689732573 115989 11 -4801303088590168 115989 4 -103609917978200 116022 1 6377801975803 116025 38 -17333517155487625 116025 4 1406704915494325000 116025 45 11253639323954600 116025 47 11677225254605000 116032 42 86636423669824 116032 49 -86636423669824 116039 2 56463590161000 116040 12 -293634796835305792 116046 1 12447843459507 116050 17 -44258182690625 116058 3 -19770338428948997 116058 8 -22433267912521141 116058 9 -11189004585930325 116060 3 397802323428992 116070 11 -4201847416693 116070 23 22723936883911727 116070 9 46578549149371 116090 7 -1211635420137 116090 8 33972471264447 116094 6 -12235653491689 116095 11 -1869849876761 116095 8 -12382899193944 116109 6 -1455829362285957 116112 17 58151121681597760 116112 24 198562074691670848 116112 27 -24601636854208 116112 38 1416167279097344 116130 16 -2955949688470292549 116130 19 385589898102619 116130 22 138802433919221611 116130 26 -239440627000477 116130 43 -9009736693655509 116130 48 -16253462014433 116130 49 97384793048263 116130 58 -14127704397737 116130 59 -11283865361657 116130 6 8124680424763 116130 70 -5324202620566361 116130 77 1780478933201927 116130 8 25076138181283 116130 84 3870365819048351 116130 90 7536021326351 116130 9 -27651147318885797 116142 3 57755476870759 116144 13 -2809595109824 116144 18 -2211692672725696 116150 12 -1618444600848125 116150 1 -79806651040125 116150 19 566214385792375 116150 20 -190242158827625 116150 24 -1276820115625 116160 117 760501849209344 116160 125 1730068570064384 116160 141 40201432682752 116160 144 508733219222272 116160 154 125657215982848 116160 161 -11775801745664 116160 183 -84484249302464 116160 185 -1730068570064384 116160 209 -10836642522838528 116160 222 -275959017731584 116160 231 400608621822464 116160 24 10836642522838528 116160 30 1234255508992 116160 35 275959017731584 116160 48 -400608621822464 116160 59 -760501849209344 116160 85 -508733219222272 116160 94 -125657215982848 116178 12 -17697559386002581477 116178 20 79669861620607 116178 28 6144686818555103 116178 31 45813071907791063 116178 3 25226798329891 116178 33 -380413434911329 116190 2 6831966287043 116190 6 -23765552068941 116193 3 1798259978411 116214 5 17712936142075 116220 2 247327969312 116229 5 -19794796014961 116230 2 5012257027445299 116232 5 -3480680134504160 116242 12 -3738396704678245 116242 15 51776318794631383 116242 17 2753641066767263 116242 18 -70368589806409 116256 10 -237258758725120 116256 8 237258758725120 116266 1 3510774218591 116270 13 515093121899 116270 22 -8443240253209 116270 4 10277326825163 116270 8 734468051265299 116280 13 29570905783872 116280 48 -38857817029824 116288 28 -20760664821544448 116288 3 20760664821544448 116288 4 573054797312 116288 7 -9725197888000 116298 15 1878521570379 116298 25 -25087747976379297 116298 26 -8101475665871769 116298 28 -95768858299113 116298 3 253449428804555859 116298 37 102209419347683103 116298 38 -28426528279521 116298 40 -310118943716548065 116310 4 -115185421349 116310 7 139141527508567 116325 20 -5053175307000 116325 24 1829667069000 116325 3 -3184647526125 116331 1 231432448498696 116334 13 36413008739343 116337 2 1744145403112 116337 5 271321149361384 116350 20 -3565746858025 116350 2 -445718357253125 116350 8 -13863893663125 116358 11 1272128169583 116358 1 -131334900323686325 116365 2 77740955998227 116370 3 -296476230405213 116370 8 10980601126119 116380 3 -2519708988330368 116382 15 -30217923041993 116382 20 -6451349053465 116382 5 -7538813688365 116382 6 -3724778264535413 116389 2 90187580613339 116400 11 277635127600000 116400 16 -1631532425104000 116400 38 432005735872000 116400 52 39479573800000 116400 62 11288301992000 116402 14 3807934364619 116402 21 -587850680930293 116402 23 36067813656553899 116402 31 -18461380362434801 116402 5 -1295680478732541 116406 10 -16444111097925 116413 2 57701506111784 116415 12 70107046456242024 116415 13 645230835019971 116415 19 -13194469777464 116424 30 33123298009536 116424 42 42247492443072 116424 5 -1140682295962944 116445 1 -885705144745688 116450 15 357568447016375 116450 3 -23862250082125 116466 10 4812223501259 116466 17 -68861333716505 116466 4 -122658070773797 116467 1 -247617863589636593 116470 2 7568524599931 116487 10 371261737332135 116490 1 -4248719053063986509 116490 3 11039229607699 116490 4 43317674011 116490 9 -581121370209817 116501 2 11609163410795 116508 7 363605736051827648 116520 3 37336978527411392 116525 2 -13246154263000 116529 2 10847686336264 116534 1 2100277704007 116545 1 3006769819457672 116550 100 64684468434375 116550 102 22334595888375 116550 103 95786082716535 116550 110 1199553531312375 116550 124 233944117545375 116550 128 4358408831962680375 116550 147 -33066257990625 116550 152 103010659554375 116550 31 -52675430878125 116550 37 -959821374421125 116550 47 -1257874646257125 116550 48 -9261264178125 116550 49 -3845147500125 116550 52 8396332637722875 116550 56 -11997172990125 116550 73 11973260339566875 116550 87 -208779943415625 116550 92 577537222314375 116560 13 -28820128279739328 116560 22 86327969749056 116560 23 -6542331515567361216 116562 2 7477432941115 116592 14 -1703897729957312 116600 9 -20904472700000 116610 14 -4420643769723057461 116610 22 66575794573171 116610 23 -351607516874549 116610 26 2682671085107 116610 42 172438090150807 116610 43 1761695963528527 116610 44 -2012127341703713 116610 45 4515261242167 116610 49 -772481714573384153 116610 5 554714830188883 116610 69 -378660996585001 116610 7 12381406325587 116610 72 -58705787956773529 116622 15 -15799728048397713 116622 29 -3210423751413657 116622 4 426592657306738251 116630 2 -915572438117 116630 3 -969124873085973 116630 6 -2059345102033 116634 8 363163436119 116638 1 24186336065819 116644 7 34801745846912 116650 10 -800419921630249625 116654 5 5498022972167 116655 1 -1128957345368 116655 11 1735815129772067 116655 14 533312885433857192 116655 20 -2940554315224 116655 7 -8377443023669 116670 4 -151906609817 116688 22 4890918936896 116688 23 38960822532258368 116688 25 -1979851531833280 116688 2 -66746406979520 116688 6 -6159979114912 116702 1 54763180249123 116702 2 -2074962404222037 116706 5 9104386015668707839 116710 7 -10075924421281 116718 2 -2240568246077 116725 12 -3755591554625 116725 16 -48304583515000 116725 6 -743267040472125 116746 5 -26926621671321 116754 2 -2790459376613 116762 1 1196966127577843 116766 8 -367047067681917 116790 10 -61291717408038257 116790 13 2447454510791 116793 3 -70024368524472 116795 6 -4128126165449 116802 12 -30170153134269 116802 16 -438269388633 116802 19 814594134625263 116805 9 6606574787528 116820 21 1444403185124544 116820 23 -101152481478624 116820 5 -1376877929170752 116831 2 363472005385800 116841 3 -673207660981817 116841 5 61277012021384 116842 1 31562297064395 116844 5 584302158651425696 116850 11 31005402021503875 116850 23 257165975103875 116850 26 3758509940721875 116850 35 29282428195953875 116850 49 72881375870398375 116850 54 30068079525775 116850 58 -3682597090625 116850 66 -133349937315625 116865 11 -124049533678749 116865 12 50781860232264 116865 29 -126905521911021 116865 3 3349337409326223 116865 35 218236668290991 116865 4 -1371110226271128 116874 4 -17708096729329173 116880 3 -3596928089536 116880 7 8334207901504 116883 11 2858227234056 116886 10 -3231954406243801909 116886 12 1912197229811 116886 17 134818905054779 116886 26 380370020329783 116886 43 1383115338750167 116886 46 -621686983643209 116886 6 11234537563843 116915 2 3696926555656 116922 3 -1789596441125 116922 6 408783970671227 116926 7 1339255540871 116928 106 82983379834368 116928 111 575774911609344 116928 122 52947810331458048 116928 28 -575774911609344 116928 37 -52947810331458048 116928 80 -135922464585216 116928 8 -13979919112704 116946 1 6329996258787 116957 1 -91962501398424 116958 1 -27805985995501 116960 1 3335326925248 116960 3 13515365722325248 116960 5 -13515365722325248 116970 14 259078452614443727 116970 16 -1268509449003049 116970 7 22729584851 116994 11 -17466327549613 116994 17 -63679277013425 116994 19 -8574068126953 116994 20 -49663150241810617 116994 27 722939274575 116994 28 47831518673927 116994 9 -9719671890018900781 116998 4 86225270029219 117002 1 1937469962097423 117015 6 924079761512 117018 2 -251902234897173 117021 3 46896059561896 117030 21 -106087593023873 117030 22 3592284572554619743 117030 7 2498291706619 117040 2 -63533238573888 117040 28 41219153454592 117040 40 -395159471328448 117040 43 -451281365023168 117054 3 66263485503195 117054 4 224459042706891 117061 2 28209299462568 117070 5 -7681706509283001 117075 15 -270713130782349403000 117075 7 193695198481000 117078 16 -154692467535997 117078 20 -55801424054494117 117078 29 15364099410607 117078 32 -230277493818701425 117078 34 -5476403429353 117090 15 -18067689656649 117090 4 828601467576147 117096 23 25494561162944 117096 5 28552326731200 117102 4 46068259550779 117105 6 -4213066172536 117110 10 4322750696663427 117110 14 5920083278459 117110 35 22747105287431 117110 36 91180648270999 117114 4 -2315605176958157 117114 8 -1514841163525 117117 12 117124002112104 117117 26 -103364341138513377 117117 28 -125420860718712 117117 36 -275549630999010264 117117 39 -98691148606401 117117 48 -3266810881277112 117117 7 -1638691149764565 117117 9 60692264806095 117118 2 -341476695326133 117120 14 -15247680269824 117120 25 15247680269824 117130 1 22804591633641667 117130 12 -3147509675394577 117130 5 -230920880741 117130 7 5015072920899348887939 117132 2 2950876671377726767744 117150 13 238891399631875 117150 18 -12327064630553125 117150 21 76536571641875 117150 31 -1323933593168125 117150 38 -10591468745345 117150 40 -306868419715625 117150 41 687588304375 117150 42 -98616517044425 117150 5 1832490089875 117152 2 -25724490300928 117152 5 25724490300928 117180 16 -1283136756005952 117195 5 -20567223327509 117208 9 -412222095103111552 117215 3 3619795112072 117215 6 931434762376 117216 18 -798914903379840 117216 28 798914903379840 117222 12 -2433602915281 117222 5 26187463205119 117230 1 831574928043 117234 14 201411503010223839 117234 2 -7459685296674957 117249 11 -252178005306772765 117249 12 -65113669574173 117249 23 -11013354229240 117249 29 189465067848815 117249 30 86666294203224263 117249 31 142385871025871 117249 4 -157769417321153 117249 5 -4768329488120 117260 3 769919987009687482656 117261 1 29943102443400 117270 18 4247436260079 117273 2 -339343865660541617 117286 3 -19204070383485 117298 1 3908794874931 117300 24 -5106384457228000 117300 30 -18325446602428000 117300 3 -107507971952000 117300 36 -667807763500000 117300 7 50706613795672000 117312 29 393543381317120 117312 35 -13923992613376 117312 51 6732815550976 117312 54 -393543381317120 117312 55 13923992613376 117312 67 5474063465216 117330 6 7551363949307 117334 6 41041681107155 117334 8 2990872678779 117342 2 176200048358379 117342 8 -4757401305676233 117350 2 1358773801108875 117350 5 7459962421015995875 117351 1 -33897179116464984 117351 2 915223836144554568 117351 6 -29453544897912 117358 1 542542917707 117366 6 4561713175087 117370 3 -54717947115733 117390 23 -1155779014573 117390 2 -487875252437 117390 28 -69574644088669 117390 29 4089063101170139 117390 35 466450412527 117390 36 -636209509697 117390 41 -692606153976281 117390 4 -37927784654580038093 117390 44 -746962347041 117390 51 -2865946206241 117390 56 -103470694970275428769 117390 6 -5255940418915733 117390 7 3380177245411 117390 9 -524453018669 117392 5 7548243078528 117402 4 41780778310495 117410 2 -199642543533197 117410 5 -292209250869 117414 12 551059507735335 117420 5 -2163655834257248 117424 12 8545053170528 117425 10 2840342625000 117425 6 24982865795861000 117438 4 -151614456810101 117438 5 314986103740675 117450 10 -15379990894125 117450 20 522231484802380875 117450 32 -138061659868660125 117450 3 -264200505931125 117450 39 -19341906844532625 117450 46 9785203923375 117450 53 415259754141375 117450 55 5113394809950375 117450 66 -6308231369625 117453 12 -4503919539694904 117453 13 -838960514744597 117453 17 -2496542240433304 117453 7 13699880031943 117474 3 -19344391835042917 117475 4 -627364514434625 117480 26 -224527608466496 117486 4 -469264173285105 117495 13 3517853978619 117495 15 -2884697438475096 117495 4 11926999375551 117502 13 257314709507751 117507 1 17985557841967 117507 4 6253798034600 117520 13 -4350486200256 117530 5 -194625424097 117530 8 130630838946047 117537 2 4740784120871 117546 12 1246112993389087 117570 6 -1207560656813329 117586 1 -296301327237 117586 6 -38210656902489 117600 135 -39855469472000 117600 203 12551970712400000 117600 29 229704402307744000 117600 40 -12551970712400000 117600 44 100415765699200 117600 83 -229704402307744000 117606 13 -93630756385 117624 29 -361509195724352 117624 46 32109680803616 117624 49 -111589946243776 117624 52 -168427072186048 117624 54 -21978018058432384 117630 23 -13608490246209 117634 1 -33634770608638341 117645 17 1321129801691 117645 3 4149133839725032 117645 6 801116799247 117648 20 66164011679808 117648 30 11065538419776 117648 58 323188863817536 117650 4 6653684023875 117660 3 60128547482656 117660 6 52005809619872 117665 1 40804618582467 117670 12 -18564506594857 117670 1 -427611647565773 117670 16 -10594933725249 117670 2 -730327591313333 117670 4 92811906991097883 117686 2 63565465182083 117686 7 -341282437196977 117705 12 -233800491448 117705 17 98618208344279 117705 3 -265053005430234776 117714 1 7588442913499 117720 16 -359413434762624 117720 7 -237476637635904 117720 8 13311608694912 117730 2 18499761156779 117733 7 -703749077384760 117738 13 -2478299725031193 117738 6 -2930345562228996069 117740 6 20565594613376 117744 16 27468870997888 117744 24 66422563651648 117744 37 310725386202811904 117747 19 -1671791511727512 117747 32 -64042318566804312 117747 4 2371937724696456 117761 1 4754334457935 117762 2 2020209709123 117762 8 3285370733577247 117768 1 17899009726432960 117775 1 4238953428375 117793 1 -51228912393229077 117795 2 1685951097607 117798 4 1616134408923275 117798 5 6794656943959 117798 7 -778988415819041 117806 4 4716556167987 117810 101 5342142477519 117810 106 -7388787138921 117810 110 -5698144898585721 117810 112 8652702284706591 117810 115 249838302357279 117810 116 -67367608281 117810 119 107751435304029831 117810 121 158464135458999 117810 126 3755666611947879 117810 18 -29821067125389 117810 23 4440917504927169603 117810 24 24297727084947 117810 28 -463406222662893 117810 3 -103282438785614090769213 117810 39 -5527661224581 117810 41 -18127860626138728149 117810 45 461725492131 117810 46 27418037924126331 117810 49 21413440872814059 117810 54 3424981660338699 117810 56 9232314218091 117810 6 -1423197256797 117810 70 3825275510578299658119 117810 74 84434961519 117810 7 -822810517173 117810 84 -1391808750626097 117810 88 -155048095586817 117810 90 -3740168308617 117810 9 -3720180618909 117810 95 25177882170760983 117832 2 44973331592896 117840 12 19463481127232 117840 16 57228888896 117840 19 16043066789696 117840 5 -27296291955392 117840 7 -26244044973803456 117850 5 -165945895661125 117854 11 978699597183 117854 1 -7893763138692541 117855 1 -8148003764913 117855 2 18553214977803 117872 3 198058227932224 117873 7 15495639134499 117906 1 7607010749867 117906 2 53299532946419 117910 5 -35244287789049 117918 13 11785223159847 117918 5 -1380787963029 117918 8 72147356389683 117920 12 -2348390946304 117925 4 30513915968749875 117936 13 6070927977445248 117936 14 -41069676172608 117936 17 -224849184349824 117936 72 -2540316136896 117950 2 100953969605875 117952 12 -5197360376466944 117952 9 5197360376466944 117962 1 22690318840371 117975 21 13632259833973000 117975 37 -13690562369671000 117975 50 -1082709759476125 117975 52 521300378483336375 117978 11 -11231925962998861 117978 1 -161035856618032493 117978 19 -12347233679751209 117978 20 -355848876583633 117978 3 165955389330326203 117978 5 -686987148973011445 117990 14 -41971603095353200869 117990 27 1554503818346414847 117999 3 14315293496018187 118002 12 6886779291072920087 118005 2 4745735483464 118014 13 398489793983 118014 4 -14938106564269 118020 7 7394001574688 118026 20 1975274427668463 118026 27 -4964368866417 118030 4 -97984433213433 118030 7 -124710887201049 118038 2 -1416985493129 118041 10 71199740596607 118041 12 240564425876243 118047 4 43213414585384 118059 1 495402646303 118062 5 19952330628987 118080 143 -649422846107136 118080 145 649422846107136 118080 169 183806555249664 118080 26 53417201407488 118080 50 1570444678656 118080 76 -183806555249664 118090 11 -223166814138349389 118090 13 1642063431028139 118090 19 875708926407 118090 2 650632111190523 118090 27 -734267022769 118090 28 15288287092911 118090 32 272664220499193090519 118090 35 5252191874279 118096 25 -46721943928000 118104 1 53792020187200 118104 17 -11686024486592 118104 22 -7638381711584 118104 3 641916098734151872 118110 12 773230870187819 118110 13 7732916362691 118110 7 -164141703613 118118 5 46999404802115270415 118140 1 1566969598362996352 118140 2 -61361286616448 118140 6 2832694662194782336 118142 2 -3579791304617 118150 11 9267480411875 118150 23 -9937539266625 118150 5 175590614796875 118160 8 24796561225024 118170 15 -3777796985949 118170 3 709925526857763 118185 1 -5342317875775853 118188 10 33882983323529760 118188 13 -98784207940320 118188 14 -1254925308278880 118188 26 44934470111774880 118203 7 4466955798461384 118215 10 -7108992877176 118215 6 387540059288427 118218 1 -7338747311045 118218 4 -638066436229 118218 5 -6335838948493 118230 10 2301858053531 118230 4 -19647823910164253 118254 2 -432112802355161 118275 3 -3708618372486647000 118275 4 -894490483679000 118279 2 1067589961543603 118286 22 -46632100761505 118286 33 17283202733223 118289 1 -18030386556792 118290 1 7644203115787 118290 3 -1264617613263493 118293 3 93818470687208 118295 2 -2155208250318488 118300 18 -11783132311600000 118300 26 468829474100000 118300 3 179662533956100000 118300 31 -94265058492800 118300 38 1437300271648800 118306 4 -899587155336301 118306 6 1431423510255 118320 30 2710396148032 118320 32 35067880180288 118320 35 792012011699008 118320 39 29525405825322208 118320 49 4916859324728896 118320 51 4519809792064 118320 56 -20908146907072 118320 68 75713644856741696 118326 13 -1187935544734472377 118326 14 1223099298071 118326 8 -4398465605644189 118338 22 -1429040192221169 118338 2 285288965104627 118340 2 566212784416928 118349 7 38343317460776 118350 28 19928098354872375 118350 33 -31889717114625 118354 16 1381145809979223 118354 21 -30398336288181376505 118354 3 -4436064893812186277 118354 4 367886686620619 118365 3 11136324215852207 118370 12 -750744451201772341 118370 1 -44294752100072053 118370 15 3596941625059 118370 2 -2094296620919957 118378 5 -62235848465621 118378 6 4099366739697039 118382 5 689639203359 118398 11 -8135255525757697 118410 9 8253313349831 118416 4 209610486330688 118422 19 13243148652481191 118422 2 -490486987128933 118425 5 -18860101687000 118426 4 2118014454686059 118430 5 -2331651924289 118440 55 -43824827452608 118443 1 49159014506659 118446 13 11320556955839 118446 7 -191456898284662093 118446 8 -125406327275861417 118450 2 18883545595875 118470 17 90594783907127 118482 10 -2628349880243885 118482 13 977644598180635 118482 19 32330544147243811 118482 22 -94258146201877 118482 23 46734150584555 118482 41 16937580277331 118482 43 615641976979379 118482 45 -1528042467326725 118482 46 -144635615042668309 118482 51 71822813382492823 118482 56 16265050637815 118482 57 278485371730279 118482 58 -48950451942497 118482 6 -2769189038411453 118482 70 -209395957383361 118482 71 -6462850164337 118482 72 23884206133319 118488 3 -5815647379520 118490 18 -13826157490889 118510 5 -83901681443917 118524 4 -1518618126034304 118530 26 1100391696999 118538 1 20968230473091 118560 15 3819644150878673792 118560 23 -3819644150878673792 118566 11 -445415867217 118570 1 17890173856467 118570 1 279534880467 118575 19 -37835690485865625 118575 22 -302685523886925 118579 2 -7643491175638773 118580 30 -33798641831615584 118590 14 -253852214058109 118590 19 -1343729105297 118590 2 22243552444301347 118590 27 1626734571767 118590 4 -2863667646468557 118590 6 12449577296971 118592 24 -101777587844608 118599 1 -278199286288858072 118602 3 -900027993496581 118606 4 -1095068079793 118608 20 -617967441426880 118629 9 -34146183535128 118641 3 -104857122523429 118650 103 -1538784780625 118650 14 -27443926620125 118650 19 -1952029728125 118650 36 -28239811120765 118650 39 7125789273875 118650 4 -183921342444125 118650 43 56617246680875 118650 47 21619264539111875 118650 51 -1618001768125 118650 54 201231629203375 118650 58 172954116312895 118650 63 -6732159106625 118650 73 -3529976390095625 118650 75 11154835984375 118650 80 -42067187592625 118650 82 8148491116732676375 118650 89 -445378280334625 118650 8 -9915542280125 118658 2 -849446609129 118665 2 -6713850345624 118668 1 7919430857050816 118674 3 7681471052139 118677 2 -415446472879407800 118686 1 -11827224394037 118686 5 9317397024082115 118690 8 31915374877567 118694 1 35590303295531 118698 9 -11818660141393489 118710 10 -24753623396337 118720 11 -332782152704 118728 16 74880964439384256 118728 4 -543099034565568 118734 13 473357173015 118734 21 -322113989665 118734 25 -58754218566546649 118734 6 -8152226247359573 118755 20 -11552992091922429 118755 23 -25369282011501 118770 15 -6062119853269769 118800 105 -2306260647864000 118800 124 883514903400000 118800 158 -194532604344000 118800 162 -116573532696000 118800 174 -375460141752000 118800 216 -5560513693200000 118800 87 62269037492328000 118800 98 275225389704000 118810 12 -3310338486907097 118810 16 134692976068039 118810 2 -744209675341093 118818 31 -28035466303341061305 118818 35 15716685683439 118818 38 2184135928583895 118818 4 -8739727593309 118818 8 -203950193431221 118818 9 -1375491227445 118830 14 -6144534774829 118830 2 -2736133567465517 118830 5 -6768122884651103741 118845 10 -133226604040941 118845 5 2545602121275507 118850 7 -872994506494625 118854 1 46217792375163 118860 9 -3767883099616 118866 3 -1384431276149 118866 4 7700133351547 118866 5 -520693325045 118866 8 -11857687940912399389 118866 9 27416597506543 118872 2 -9806667998221387584 118902 10 7019868308233355 118902 1 -485130478242437 118902 18 5464812581508947759 118902 8 1035708758947115 118926 15 -71329516292385 118926 4 -259379653242573 118944 23 -352013810688 118950 13 2076331448996875 118950 19 65016609702875 118950 25 -7719839084125 118950 28 333078457821875 118950 31 -1320241162625 118950 37 13122781519375 118950 4 7963799359115222875 118950 48 -235210290018625 118950 51 16610651591975 118958 11 36822726503135660807 118965 12 120652697260691 118976 16 114312072592659968 118976 84 -114312072592659968 118980 11 63012352369824 118986 4 -6085009043441 118987 3 -3339399320599384 118990 5 -6354292546017 118992 13 13551570366008382784 119022 4 116832138691303 119025 61 -25743718040833125 119025 63 734986120741875 119035 2 -133608687585976 119040 11 94340847100672 119040 46 -94340847100672 119040 53 -3952211700736 119040 60 761922636805376 119046 2 55802970927899 119050 1 2536497574875 119054 4 608502557639475 119056 17 -17404088385298112 119056 18 -4189073123503808 119064 20 224825314583584 119064 24 28881340492748480 119070 19 82119171419019 119070 23 -520948326626469 119070 58 -234563987490777 119070 59 -2217217628313513 119070 69 1110883056759 119070 72 26942566791394359 119070 88 1821284535383271 119070 9 -976054151772693 119088 18 2778808838822208 119110 1 -1112629852627533 119112 8 -202480090602560 119119 11 -3404867611881176 119119 7 18305721708435 119130 19 44299463105239379 119130 25 296609411951407 119130 30 -19808434145393 119130 35 50932609766119 119130 37 127159021446679 119130 38 -7667297503777 119130 43 -7507530679218239161 119130 49 -3952572895865449 119130 5 -7510064558813 119130 7 1094551782944779 119142 10 41144022385191 119145 8 1660225175061128 119154 3 2850785707643 119160 10 -105608447320896 119190 11 9501031222379 119190 15 -1044588892409 119190 18 23230977659207 119190 19 -1518812958097 119190 21 -1199096133168961 119190 8 -3029704585541 119196 14 228268471426848 119217 6 -590678259441893 119238 15 555424255707278887 119238 3 587202004507915 119238 4 -160996835861 119255 1 -4269962251512 119262 11 21664859066891 119262 12 640198017950239 119262 18 -122983579070873 119262 21 -6032355945641 119275 6 106439756129000 119280 18 -7949602926784 119280 20 12601432629805888 119280 22 -130158099896768 119280 30 9401816358208 119280 32 -1430584706317314752 119280 47 -10252143809216 119280 53 14755629430592 119280 57 -398299316817088 119280 59 -8697642786496 119280 62 91466783376704 119280 66 -602544942784 119288 4 165067997668447680 119301 11 467170596647505512 119301 4 -44203342128317 119310 15 -146612101468697 119310 21 -5268258461249 119310 5 -303398654903317 119314 4 1851910237906183 119322 21 -13585009454073 119325 3 -3840886034891000 119340 1 13077628371072 119350 11 2265578787123996875 119350 18 63419465311875 119350 20 -365740436628125 119350 31 4251457668375 119350 3 -42549184430045 119350 36 4688238180375 119350 40 -27322037377078625 119350 50 18124630296991975 119350 5 -11215762723837125 119350 54 -5318648053755625 119350 56 -2925923493025 119350 7 -5186496602125 119360 2 -89152726071808 119361 2 9262706846203 119370 11 -53211594690341 119370 18 3510453212558171 119370 25 -3571563192913 119377 1 14704625809736 119378 1 -861522822973 119382 9 61823079765923219 119430 7 512513541501039 119442 2 21634763923465523 119454 1 4808697611131 119455 5 338578470606205051496 119460 4 73535729832064 119462 6 3317750311734747 119462 8 1504305156896171 119472 2 -24458125957568 119472 7 -57466862554240 119474 13 -89253579403313 119490 3 -79406375424497533 119496 2 -167322962336276800 119504 11 153563129862976 119504 24 2750831366464 119504 26 -3709511011872 119504 29 -6381939081438656 119504 35 -539706036252608 119510 15 3059637990216751 119511 16 -5805397552185 119511 22 238599542940003 119515 3 2454568075656 119525 3 -712581230414159000 119536 9 1818450432101952 119538 5 -30223846144031157 119550 6 319733590375 119550 8 59365812352375 119550 9 -33988368136625 119560 22 -7765036221824 119568 17 -248868831680 119570 1 -47939662660213 119570 3 132811377460407 119574 14 -10576850591133 119574 17 -165287010228117575589 119574 2 -5958749728989 119574 26 5059716181983 119574 27 -8211181220597025 119574 28 -34309508859227601 119574 33 645064374089907351 119574 7 849177337738059 119583 10 -1256444117619480 119583 2 46534967319240 119586 6 -2513640608367857 119595 17 415255840411112 119595 2 114739580676232 119595 3 45948647368883827 119595 7 11762347146283 119596 1 1563500900064672 119600 20 27334692189800000 119600 24 -1861957376856000 119600 56 -56451588120000 119606 3 28633667915591 119616 13 -7095596086144 119616 22 10046978564608 119616 7 7095596086144 119616 9 -10046978564608 119630 1 92915853749587 119634 2 7774971352379 119642 3 3131260319303 119646 11 -1377307899105309 119646 23 -19303221526229133 119646 32 -15735747027717 119646 34 1335630904609707 119646 39 -920182344417 119646 45 5721290235805023 119646 65 710272211069616903 119646 67 315700136480367 119646 71 3489567372985027844439 119646 74 432207451413927 119646 75 3941827234107183 119646 78 17690991263237151 119646 82 74303097844599 119650 8 -5195597090625 119655 3 -81053932927032 119658 12 1543672955296024147 119658 1 -224290558118501 119658 28 -529479823666536282421 119658 33 11197664734067 119658 35 407094598219256171 119658 41 1013534469547019 119658 42 -10059333892237 119658 50 78616134258515 119658 51 -42262627491973 119658 56 577318505824207 119658 62 -310484853316169 119658 68 4065558323471911 119694 2 -1706264107777 119700 28 -14302621334700000 119700 35 -454097817900000 119700 44 -114420970677600 119700 46 439464870900000 119700 53 1456448374800000 119709 2 22364174395324503 119712 7 21641193501184 119712 8 -21641193501184 119730 3 -18598222031741 119730 8 -8291115966514337 119735 2 -420947519981752 119760 7 -1256832683755712 119765 2 -283161892888 119770 8 -8371081343269 119784 8 -1287725926976 119805 3 -5736555902168 119826 14 -394832684385 119847 4 897166243345229675 119850 13 -16065749799125 119850 23 8027083320875 119850 37 -127035411105728125 119850 38 -1015581249983125 119850 4 -2617408597194125 119850 57 -1016283288845825 119850 59 30220131919375 119850 61 -106396657514889625 119850 73 -3186600998145625 119850 75 -50955370755625 119850 8 -25492807985165 119856 12 -3830937011648 119856 16 -231754412371904 119856 17 5765102505629056 119856 21 28120563714880 119856 24 2354228365815296 119856 34 39679315265600 119884 4 2604688726919328 119886 21 -288980616761 119886 22 -846037687651649 119886 23 1739342823681943 119886 27 513890367630323111 119886 9 28516079832862211 119889 9 137946675025431 119890 4 42170161288931 119901 2 -7225241019256 119906 1 -10652456398301 119906 3 1978768708839 119910 5 -1462253562701 119910 8 2565287042769830051 119922 13 -3894295990897 119922 2 -666751363887725 119922 3 -1241856431987372261 119925 17 -3076835351378625 119925 22 -32904272006055000 119925 25 4085017622217000 119925 31 -133989441107625 119925 37 130597225509375 119925 7 -765635153607000 119941 1 608653135411523 119944 2 158422054353120 119952 111 -27057046142476224 119952 136 4674090157853760 119952 138 42443545886784 119952 145 78883516450368 119952 148 11886989229327744 119952 155 -36928109489568192 119952 165 597626452116288 119952 175 3664967166391104 119952 22 90351782349696 119952 30 -601824033058752 119952 37 1846449819910080 119952 90 107662126791744 119952 94 -204985873075886784 119955 3 -1995257438648 119966 10 -556150538734614081 119966 3 -797998848373 119966 9 6496189473383 119970 10 251637267120291 119970 24 -42835087297629 119970 27 14269786099371 119970 29 89058789163251 119970 35 -9319898782233 119970 43 448817386690143 119970 46 12414134607437367 119970 53 50121423477511551 119970 8 17735239991259 119973 8 -1751471958104 119985 2 2200229242652251 120010 1 790824366747 120015 2 -229505261112 120032 9 93104613528256 120042 14 -316088538332373 120042 29 -1741630242249 120042 30 11694039025527 120048 10 -387969237433792 120054 10 -19885610845405 120054 17 -8637470006653 120054 28 -919621592554969 120060 11 101189162853504 120065 4 -4316877839969 120078 20 6472994415327 120080 3 4210299366962624 120090 17 -33422548383809 120090 3 10000579867703587 120094 5 3657974695831 120098 3 -18044398236797 120099 1 -27773849097635480 120099 16 -34207100812136728 120099 19 80973320984360 120099 20 636812926379 120099 21 9983734335827 120099 24 -9326854894168 120099 2 73553818049803 120099 5 -185255893536497 120120 13 51623929544032 120120 19 -12267541384064 120120 21 -829887482263904 120120 24 -6541269066450208 120120 32 -14897237202784 120120 40 -529307997716672 120120 69 -72813866303872 120120 78 -206522678400042304 120120 81 13574795532416 120120 8 -223194154800254912 120120 82 -624234757360096 120127 3 -665071822093589 120134 2 -10806233786461 120144 5 19953732433472 120150 24 182736802780875 120150 33 18919467933298875 120150 41 -72434128631625 120150 68 -700721034566625 120155 2 587685495369736 120162 1 -278168875165 120174 2 478127078768160091 120175 5 890594060213375 120186 5 -56419072547360301 120190 7 22757691413323 120197 5 3079899952136 120198 11 -46278170045289161 120198 16 -80936847419761 120198 2 -840110535341 120198 4 73380949836715 120208 13 -718897472344000 120218 1 -45894572438149 120225 13 -2085878994625 120230 2 -19882557298117 120230 5 89856253023731 120240 21 308612427146208 120240 32 -50763126134304 120240 46 -150354100861344 120240 64 -192151108764864 120246 4 -24670351827541 120260 3 183426461215264 120270 1 12029956800787 120270 16 -1950652009833106069 120270 27 4601126013911 120270 28 -4616954698681 120270 9 2140118714665485811 120274 16 19117036794295 120274 2 -25444775973206645 120302 4 -2206622267641 120321 4 3512858113498469679 120328 4 -960811541907776 120330 17 225335341555731 120330 22 -31644048837897 120330 23 -252418816731537 120330 31 -28991290516497 120330 34 274434031485207 120330 35 33103231881399 120330 4 16271327637963 120330 43 -232882701976186804809 120330 6 854389318623219 120330 8 16437733826499 120336 10 196392502022464 120336 12 -76199693745088 120336 14 860696438004800 120350 1 -1303825374667125 120350 8 98313009101875 120360 6 -12987775853216 120365 6 3066996149375059 120396 1 492221222609536 120400 35 -3870727629100480 120400 40 967773563410240 120400 46 2835135842388200000 120400 51 22681086739105600 120400 55 -483840953637560000 120400 57 120971695426280000 120402 1 7850111290875 120414 10 -95026981682249 120414 15 -2017794156404473 120414 6 -1211627421928405 120414 7 -3414303073817 120428 5 -734553492504544 120428 7 92892426501664 120435 6 1569853607048 120450 16 -408584318148125 120450 20 139712367716875 120450 28 315895122995973875 120450 30 -185351877671725 120450 35 83496778264183375 120450 36 -23168984708965625 120450 5 33830614521595 120450 57 -3268674545185 120450 60 814701762614375 120450 66 4228826815199375 120450 6 6517614100915 120456 12 -217979790062112 120456 6 -1067146274020896 120462 10 -4405098849769 120466 1 -2239578636677 120466 4 -3125810688129 120467 1 6849922587400 120470 3 -2872497595717 120474 5 -86224764186333 120474 7 2328068633030991 120497 6 -101577735362584 120498 12 2495880923759 120498 5 6068708278219 120498 8 14749613945891 120498 9 -6609357052957 120510 12 -2439075317344821 120510 14 -36558552939401349 120510 24 -659328306057 120510 25 -280895864561073 120510 26 23960179409967 120510 34 31708562361905079 120510 7 27304400085507 120516 12 -310517097216832 120516 13 258758627481728 120516 5 1591702293553856 120522 3 1102719003656073211 120522 6 -531034937003537 120528 20 -354028069897920 120540 21 -24061653286496 120540 22 15719141525723776 120540 24 -45828400949632 120540 28 -10082431709193088 120546 17 -216551812312809 120546 3 103858148462643 120546 4 -843814187906085 120549 4 3375859423247 120550 7 -17821235408625 120554 4 -32246753505553 120558 12 -352893787057 120560 10 -2701262305728 120574 3 -990015285901285 120574 5 -220676694146119117 120574 9 42923307398247 120575 11 65518390421875 120582 14 -94800692466840429 120582 21 3511136758031127 120600 27 -351193262673600 120600 42 -48241377900000 120600 55 -43899157834200000 120603 3 2868785064046376 120610 10 1813798089783 120610 8 -3624403162617 120612 2 -1507880524082048 120615 2 2377521382373767 120615 3 -2401449526493 120630 5 24737105887363 120633 3 130438002374711 120640 34 -9317281430016 120640 44 -159255956025856 120640 81 817968116224 120640 83 159255956025856 120648 11 -1144926606268864 120666 10 349931506392091 120666 1 -134246662448093 120666 18 32236226317829339 120666 24 4489696291067 120666 27 -711094305436957 120666 31 -88129055674673 120666 37 26001314237431 120666 44 600319454658391 120666 50 -34421290543103113 120666 52 -33826590388513 120666 56 353458761673823 120666 59 -1946373180017617 120666 60 63866645180351 120666 7 1318901841884485027 120670 2 -127326674467621 120670 6 22502585600767 120675 4 1020857344561000 120678 2 3328892985619 120694 3 27449784414013375 120694 5 -715469276735137 120705 11 -35558200217656 120705 2 3621928721625352 120705 8 -4816597484152 120705 9 1718274388904 120712 1 7228706485145184 120714 12 -48892837775941 120714 1 -322862597189117 120714 23 7936567287623 120714 7 -6788291414525 120714 8 47195788293235 120720 17 -15639830352064 120720 8 36741016828736 120720 9 -165314508325892288 120726 12 8016689901087 120726 4 -37292640713181 120726 6 -2015704808208693 120768 31 -346935038523904 120768 54 -596560784763968 120768 62 346935038523904 120768 64 -10174828115456 120768 80 596560784763968 120774 4 -904783329053 120780 23 106065093270816 120780 27 243142883780611153536 120780 29 -24829427550816 120780 8 1463033943072 120785 11 -257194838106136 120792 12 -116304804963712 120792 1 385980944999840 120792 3 -29753363836288 120802 2 -123265917523997 120813 3 -6209055720668312 120816 22 -1702586587946688 120822 13 -783127430857 120827 1 291740890464136 120830 7 -86070753934937 120834 13 27303522135317883 120834 15 -1627610259222549 120834 40 -135668896634313 120834 46 34771782190383 120855 11 -793554786424 120870 12 323091168451371 120870 22 -25617072307977 120870 25 11126275320807 120870 28 365173024821183 120870 29 -2441437098777 120870 34 867714529239 120870 36 -4400354449793241 120870 39 38145735013311 120870 5 -12296544019317 120888 3 439580509872192 120888 5 -163104227607957696 120890 14 2518996383269824499 120890 15 -111333314975149 120890 25 9324185948839 120890 4 -555188159720053117 120891 1 1865732192776 120900 17 654832730512000 120912 12 1859885029785664 120912 14 15670956235328 120930 10 186820019753204049659 120930 12 -134096232502261 120930 2 1346189392390843 120930 4 11807283312883 120930 7 -1970117736821 120934 4 21532651798915 120934 5 2407164970347 120950 7 156824350131375 120960 56 -8887639915008 120974 4 195007482800423 120978 40 454762529988183 120978 6 862926546177675 120990 14 -185203124671481 120990 1 -975502900135493 120990 2 15240293444951587 120990 22 94708811579471 121002 11 -437280947289521 121002 13 46409693461615 121002 14 -2789247375540737 121002 19 -13987831799249785 121011 3 62249908941811 121020 1 -3101008756274512698752 121025 2 53144121237875 121026 5 -6729021184213 121030 11 -10203081605829 121030 20 170867462257634219 121030 25 9812599884531703 121030 26 -160079129700227297 121030 31 -57134186069121 121030 33 -3365721760394374129 121030 34 466703002041479 121030 36 -77133518987329 121040 15 16482070354752 121050 13 -27424689669253125 121050 32 -219397517354025 121065 5 -4089490817362264 121072 22 9365994854208 121072 2 32888275463744 121086 12 30739428569907 121086 19 65225666247616503 121086 21 5101422394409559 121086 2 -2415765416578389 121086 23 -120069500751801 121086 26 -111011694488505 121086 27 -303499762041825 121086 35 219589798025583 121086 36 -2190873114443612817 121086 39 -479534128023105 121086 5 23907065775363 121086 8 -57069509610861 121104 22 -1205008148366784 121104 33 -1301111444419776 121104 49 -456544702544832 121104 57 -44683127925029568 121104 7 -29388943730517494976 121110 14 9828101210792167 121114 4 -32507730604637 121128 14 -198703597572928 121143 3 -1878183444088 121152 32 -5621544640000 121152 9 5621544640000 121158 4 -2229421631229 121170 11 -255127267149497 121170 1 7925552970427 121170 6 -146733418189 121175 5 1329683653000 121176 9 -66555541600128 121198 1 1049030769835 121200 35 489526323128000 121200 37 30161999060000 121200 38 -62771267800000 121200 53 -172990023416000 121200 81 22174282326248000 121200 91 -400977884770264000 121210 10 -203950781059229 121210 12 112600346397242167 121210 5 24844381198011 121212 18 -106372331858304 121230 2 53931365426331 121239 3 -3749299971878853 121239 4 138862961921439 121242 13 71249304704260067 121242 20 11329181965783 121242 43 18405844043543 121242 7 52344989442251 121264 11 -1700925289920 121270 12 1272744419111 121270 7 -2034300547097 121272 2 -163864061850176 121275 117 -45431641040625 121275 161 2498144972236200 121275 163 620617878304200 121275 29 14991515439957000 121275 38 116790702525000 121275 67 195849303489000 121275 72 15583052876934375 121275 74 -9528637889799000 121275 77 5054494742325000 121275 89 -23129310085560 121275 9 -43707042099000 121275 94 -381107958903000 121275 95 77577234788025000 121278 9 -40321892208072817 121286 1 17017499165635 121286 2 14059417297385899 121286 3 773040395447 121290 26 -421837860601 121290 5 49786530233419 121296 23 79204778788960 121296 32 23992383848768 121296 40 25154674819327808 121296 50 10759175912512 121296 76 -73797187583919808 121296 81 -2102495833130176 121302 6 -166578082213365 121317 6 710228239488872 121328 3 195685139520 121338 19 -176567699946609 121338 20 -11575593587529 121338 21 -99719209960497 121338 3 6539544442467 121338 6 2692418668933419 121342 3 -34362351450037 121342 8 -10429049387339713 121345 2 169904807848 121352 3 -112020935776128 121360 15 203867488370019392 121360 18 -7238227497408 121360 26 84014485487936 121362 3 2508858242891 121365 2 -955843723531593 121365 4 25807780535353011 121374 11 -590365683401121 121374 5 18581186445147 121380 10 -784823118922592 121380 13 53905244353696 121380 19 -437842504456064 121380 22 11665696258361888 121380 34 61214419788416 121380 35 -1202254865632864 121394 3 -8083871388468510445 121397 1 -11584324864216 121401 6 30364926172776 121410 17 42069664240011 121410 18 260244928961091 121410 20 311855526834903 121410 22 -555830543097 121410 25 2065963777950807 121410 34 21030602875119 121410 39 -81200816517249 121410 42 2215389802257711 121429 3 185395815272520 121440 10 -23763175930600064 121440 17 -61646131540819648 121440 30 -2695624381952 121440 32 61646131540819648 121440 47 3636935294464 121440 63 23763175930600064 121450 10 31115369568375 121450 17 1501073498439775 121450 4 187634187304971875 121458 1 82498730918851 121458 2 2083406608673171 121464 8 -21576590698999680 121470 10 14730426603359 121482 1 30371550815043 121482 13 -820031872006161 121482 17 -1844686583289 121485 5 11612360489192 121486 4 101519778537307 121503 2 2118164087620808 121506 10 -116216399366621 121506 12 -18010465684525 121506 2 -1199827434077 121506 21 3034000358753921983 121506 24 -7666497178646473 121506 6 7790388726259 121520 13 4026326401772416 121520 31 78594107652928 121520 32 -95065884412352 121520 56 119288787081240896 121520 59 -146378619785664 121520 70 508296495047955264 121524 11 -12119329186784 121524 20 14428613070215072 121524 2 580607572974112 121524 8 4723559718460192 121530 6 150076549356479 121550 38 -1126252015791625 121550 41 -3275886122366526734625 121550 46 -116960952182625 121550 5 -1163697913836125 121550 7 1464796474198875 121584 8 1108736492608 121590 18 2174692860339903 121590 19 -85571153191593 121590 28 -1422708918222969 121590 33 -19174457598129 121600 2 -217565498368000 121602 3 -120798682698388625 121605 4 -356555758186232 121611 4 -1686948512571663697 121614 3 -1680877832581 121614 5 16411498590743 121618 2 -6058170241024013 121620 4 -5453777735488 121623 2 -4737351496600 121626 1 -1078460950612437 121638 12 -4696656284197 121638 13 376020620012863 121638 16 2158900138309033151 121638 3 -5938131335237 121638 7 26113904377627355 121638 9 11543804605475 121644 4 101030202984384 121647 6 -9704272229770744 121650 12 -42443744458007125 121650 26 95267560432375 121650 3 357256482566275 121650 37 44657060320784375 121650 43 -193847745615625 121660 12 1393688342304 121660 7 -5542794729856 121674 4 24540956394767 121680 137 -2644223185446336 121680 29 -246709370542752 121680 74 -1631226491234496 121680 96 -4213286079118272 121686 4 3272007612570515 121695 14 -19919800468441 121695 6 10345625681131 121695 7 1139881726385619848 121701 1 23875895403055 121722 2 -527997737501 121722 8 -1810075465551256833061 121730 3 80711084793627 121730 7 -85136006461717 121737 5 -21470914427453 121745 3 -7307792569388024 121752 7 1842952186584000 121758 6 -5058471737285 121770 33 195161851892439 121770 38 8614013643364144671 121770 4 -232578368370831906117 121776 20 -129106514362816 121779 3 1454447654955 121788 5 12590239493664 121790 2 166811923259 121792 16 -23829430845579776 121792 2 -4507046685692416 121792 26 23829430845579776 121792 29 4507046685692416 121800 50 203691710161304000 121800 56 119343087800000 121800 60 -40934202313600 121800 6 -55037573144000 121800 8 -5116775289200000 121806 16 -310100817080745 121814 10 40881353203467 121814 4 791258675250547 121814 7 -586325313708309 121818 2 -32335967381655493 121830 12 -6503017992733 121830 22 -2847272836151809 121830 2 299371041232291 121830 3 39034024352371 121830 4 3254913720955891 121830 5 7290958453579 121830 6 -14000278115429 121835 4 -329003509333176 121842 6 -13971812927406165 121847 4 59868375943112 121866 2 -5586694466633 121878 12 30148678255671 121878 8 -131140006291269 121890 11 119269029858011 121890 15 -54308529205073 121894 1 41747986487331 121899 1 -6521280783289894808 121900 10 -172798361100000 121902 4 32112156971555 121902 7 61928926734440411 121905 5 -39749968874232 121910 4 -102408961797 121914 2 -225552223405917 121914 8 -556736618507193981 121918 1 -1956652583446953 121920 21 32292773719552 121920 32 -32292773719552 121923 14 -7134755683361940792 121926 2 167189993271811 121930 1 -1487427705397 121930 7 -11217499506301113 121946 1 3414829507299 121946 2 -8146718462446893 121950 10 -22400275447125 121950 14 68124026122875 121950 22 101635278946875 121950 42 -3777687043673625 121968 100 -240677727193728 121968 114 340977700996416 121968 138 2157941016846584640 121968 155 23871482541504576 121968 58 -5374401687775296 121968 93 -1621293025429440 121968 96 10052401223658816 121975 3 -18714638223000 121975 4 12396135471875 121976 1 -4346257265557056 121983 1 -19634404316248 121989 4 -261458124889445 121990 2 -7407554501637 121992 1 -383713761476960 121992 7 6846211705352768 122010 12 25932067485499 122010 13 -853699514381 122010 21 3426262470438498700667 122010 30 95552455120451 122010 37 -630332809404390953 122010 41 16227668352007 122010 47 143623590110623 122010 49 56793934882783 122010 54 -9049219871489 122010 59 -3365110164611321 122010 70 -350914447513 122010 71 -19654174481977 122010 76 -146679195141577 122010 83 104889245996087 122010 84 -271582797321073 122010 86 -7015939360129 122010 9 -1241276636789 122010 93 1837704983686271 122010 94 233213236050599 122010 97 5851846489391 122018 31 166552903661183 122018 36 -104013059797745657 122018 9 166268519168379875 122034 7 2280099770807599 122040 10 -10162083127104 122040 2 -11514402411552 122040 5 -3603617246016 122045 5 1479516173819279 122070 15 323598034932407 122070 20 -3821492355121 122070 4 248972242357247131 122078 5 168008332661466751 122082 4 -392571272603825 122094 19 -577673119406772045 122094 24 -108470138893173 122094 25 -68564995572501 122094 28 -10267376178681 122094 39 -21173947056585 122094 46 21395300718769335 122100 12 -2027291797808000 122100 18 -148163778526384000 122100 27 5395244948000 122100 31 -2262600934120000 122122 9 236933117719479 122130 14 5649924238803 122130 24 4351280082288291 122130 27 2196234167355531 122130 35 116611033832794503 122130 4 -3148497913485451581 122130 53 -444886730509810851441 122130 54 13310682055479 122130 8 51394240645587 122146 4 28530369761759 122155 1 34814209540247 122155 7 3748827307059 122160 12 71817149479636288 122160 26 -2356155826624 122166 4 7107879233691 122176 35 -129535151616 122186 5 28663526984671 122205 4 -243597463521209 122206 13 54242958204127 122213 1 252647214191 122220 10 289883746677888 122235 8 -606404694301921 122238 3 -50623504999281 122244 4 -17726998526848 122247 15 -1741835075393786328 122264 3 78097202676864 122265 1 1106784175725288 122265 21 784603249389864 122265 29 -751774167689459049 122265 3 -40992006508344 122265 34 -3767065159896 122265 9 -2885531509368 122280 2 116950292193156256 122283 3 10184284647144 122286 3 -151892264317864157 122292 1 -3240009820166976 122292 7 15321173349961152 122298 6 5317902479719 122300 3 -344862248392000 122304 107 -10073736096256 122304 123 1204324626889216 122304 135 12588843119104 122304 137 26911878257152 122304 138 7336477292032 122304 147 2456324180982784 122304 156 10073736096256 122304 195 190846278457856 122304 196 1870892079354368 122304 201 -1065446233688617984 122304 216 -420665392225792 122304 28 -190846278457856 122304 31 -1870892079354368 122304 39 1065446233688617984 122304 53 420665392225792 122304 57 7161294988288 122304 68 -1204324626889216 122304 84 -26911878257152 122304 87 -7336477292032 122304 98 -2456324180982784 122320 15 -4779709188170688 122320 18 -41293901961152 122320 26 64566879552064 122322 16 -76497057441593 122322 5 120311734777363 122325 6 163816217086600 122346 3 345393546704739 122346 6 501162986619 122353 3 2216446560546344 122382 20 8923365807543 122382 21 -948083202098937 122382 25 1618426931076808191 122395 3 -786840905304 122430 11 8180060476699 122430 12 4277342366411491 122430 13 3846244700899 122430 17 614854849979971 122430 19 -1452343598173 122430 21 129818866131683 122430 24 24769569277907 122430 2 -4586352870268133 122430 28 2758661063302787 122430 42 -899109801922429 122430 43 -104773286357389 122430 44 5809619692619 122430 4 69006175314849667 122430 47 -3540462876469 122430 50 -14793560799949 122430 54 12260337259380967 122430 56 66896513592924583 122430 58 -194365298137697 122430 59 -3386272129474193 122430 60 9549369946927 122430 6 -4033432500242669 122430 67 8933653572218372719 122430 74 152639379269364023 122430 8 2960245499779 122430 83 -122786670978721 122450 11 420154308322875 122450 19 -11338928341353125 122450 30 -90711426730825 122450 3 -447142668535050571125 122458 2 13724896337515 122460 1 693577773476128 122470 1 11423519061147 122475 9 -17216298337625 122478 1 5474915952859 122490 14 -3474763489161 122496 14 598817237805440 122496 20 -3287613487790656 122496 36 3287613487790656 122496 5 -598817237805440 122512 24 -3755397768608889792 122528 4 -1442743319112192 122528 6 1442743319112192 122535 7 -16305297675192 122544 10 -4568160716928 122544 12 1172489426208 122544 21 29353548473568 122549 10 1005390848423528 122549 6 7757578664804808 122550 13 4352506001875 122550 16 -86476193579125 122550 19 145764109779875 122550 27 123198850113875 122550 28 -63912152423125 122550 35 -715852311862625 122550 4 49969061994590875 122550 8 6245522207045875 122556 2 -2408683024119207520 122570 10 13724343261819 122570 13 13215565523272463 122570 19 1780590115431 122570 20 -66332798453249 122570 22 261294663671 122574 6 -2965886855081 122584 4 -1260119244170016 122584 7 -4503057410944 122590 14 -486721338917481 122590 21 -49884565459041 122598 19 23164893357291 122598 50 -150484518941511825 122598 56 28272960122920695 122600 2 -297858060648000 122610 14 455541752879 122610 8 808511451967 122612 1 -22897977178256704 122622 5 383261026341779 122640 16 63991054020032 122640 38 -10629175252256 122640 42 564192636356397376 122640 58 5368015145312 122640 70 -17512929189568 122640 73 9169889546498624 122650 8 -98869703888125 122661 10 49087681025643 122670 24 35090497047737342979 122670 28 7108890877468971 122670 33 197345268297567 122670 34 -222660939172329 122670 3 6011845357652883 122670 39 66392286652319607 122670 40 -1435153175974233 122670 43 65770431569487 122670 49 6881624209143 122670 59 306593333903511 122670 6 -7309084011021 122672 11 3490133872672 122682 13 1011816411657155 122682 17 -36831940091297 122682 7 -16642307744658153613 122694 14 -69844084732565 122694 38 32608877710714019 122694 43 -26197725906008657 122694 45 -1475060685285473 122694 47 2434792130407351 122694 5 -3240708325572184181 122694 53 -4005086870664737 122694 54 -1272385882977209 122694 57 -1217053523462777 122694 63 261034300234279 122694 70 300462038237647 122694 72 -107806549395545 122694 75 595426704753023 122694 76 13508022693600956807 122694 79 -412652930141881 122694 8 -307812517950509 122706 27 10894228831575 122730 18 -48708824145697 122730 7 -13431250790317 122731 1 140868632962952 122733 1 507084973407 122736 14 12065970486743360 122740 15 -12328127922822624 122740 6 -435820980498912 122742 4 -10605564195057 122745 2 -1351120889503448 122757 3 -1354039528312 122759 4 905775075080 122766 1 19869614994907 122766 3 163403192381655995 122766 5 38158193863 122787 3 -23147765749368 122791 3 82893185314019 122796 3 -2919941032320 122808 2 -37172713607485280 122808 4 6613021988000 122815 1 -31905220505752 122815 7 -5353716960152 122820 4 15051802514336 122820 5 6446857003699616 122838 13 451982451621023 122838 9 -732953786849 122843 3 -334062421560 122850 107 -731304634082625 122850 115 -18877434599973825 122850 116 10918126547775 122850 12 1364765818471875 122850 14 -13017308428125 122850 15 10514291416875 122850 18 -2359679324996728125 122850 40 27085356817875 122850 4 -684241592167125 122850 70 26160924891375 122850 81 -283885868255625 122850 83 87395530555434375 122850 94 18474522988512375 122870 3 176033299729059 122871 1 32919948539927 122876 2 169311073605760 122892 16 1698115276254880 122892 19 -178874903521664 122892 29 -6747963709312 122892 5 59571321868576 122910 1 -10866538276613 122910 12 -77405842893761 122925 17 -176243762287000 122925 18 41904901817000 122925 21 726171933941000 122930 3 15716487806983 122934 5 -135603688908543857 122934 7 35159081589647 122946 1 -7593634543373 122946 5 10278293744863 122958 14 -15264577962994415229 122958 17 -6723187673391693 122958 22 -20769637602969 122958 23 164108339180127 122958 28 1015126108042383 122958 31 249006950866359 122958 32 565381213066772271 122958 4 -38141726104341 122958 6 -6078086636301 122962 7 -326096048853 122969 1 9510738452027 122976 26 -415085585190912 122976 29 12940320043008 122976 38 415085585190912 122980 10 -628495693707744 122980 6 -171835944183136 122985 4 -14753753353368 122985 6 -262666515609 122990 6 2985889464632179 123018 17 -30344784816473 123018 21 -2173659398917201 123018 22 -225592700936565241 123018 25 -36865127892025 123018 9 -180901423586897 123024 13 703339969600 123024 15 1225288823104 123024 32 41868757459520 123024 34 -312586334130304 123025 9 15897825669228929000 123030 14 -18008998045497 123030 25 163878066118719 123042 1 6411606625742275 123045 1 1684053719919784 123046 14 564962621982219 123046 16 -8272435391513 123046 19 68634798094351 123046 2 2422530553901588747 123050 15 192342134375 123050 17 159365558387375 123050 5 17471223852875 123060 12 4890206649120416 123074 7 -6744243966631275817 123074 8 -132556563728497 123082 2 1129345411275 123090 14 7669096812143 123099 1 -1674551495377 123114 11 313926366524694515 123114 2 -5703353980829 123114 7 -24105659810307013 123120 40 -184053907634112 123120 46 -494156213445312 123120 59 4969455506121024 123123 11 -757150480241 123123 7 1683836322286796044219 123150 15 -2153792058317014625 123156 9 -218111699458944 123165 13 4530749411495511 123165 14 -236116795379121 123165 18 -241953552928809 123165 20 711475353013851 123170 7 2808650897279 123182 4 29522174275323 123186 12 -11083390366321 123190 1 -21596000247621 123200 140 63061223242240 123200 174 7882652905280000 123200 183 7319557440000 123200 207 -10559347840000 123200 56 34050020544000 123200 95 -7882652905280000 123210 12 -1409281790448069 123210 19 -3458828067189791661 123210 34 39205345722204483 123210 36 -726302002414357197 123210 45 17841225368096451 123210 47 69089256645939 123210 56 -7213400187534657 123210 57 -1863220658558697 123210 60 128104743229251543 123210 68 -307612777982709609 123210 7 11393065851211467 123210 73 -14614527053077713 123210 74 16053472583491383 123210 75 -397554696700337313 123210 94 52314234367672359 123222 4 -18418083533837 123222 7 -8706958968853 123222 9 2038973711830417583 123224 2 3506675653952 123234 14 2141917848669943 123234 17 3571959209975 123240 10 11523805701056 123240 7 4460911183808 123256 3 2041702995520 123270 2 595650613123 123270 29 -3897095840009 123270 30 594991462519 123270 31 37768854959191 123270 3 -363706407315341 123270 37 -17203467661129 123277 1 -2998982082501 123291 8 -1100596762193697 123300 14 118971438585912000 123305 10 766657143043336 123305 7 2835847585024945919 123310 2 95899791846779 123315 2 -13075706573981 123318 1 -6045868495806885 123318 19 163238449386785895 123354 20 5852834995419 123354 21 -262441654110693 123354 23 2351023894323 123354 25 -1797090307965 123354 26 -65530104562107333 123354 31 119696223299715 123354 4 -222316175716893 123354 46 1889757266373495 123354 47 103164441925959 123354 48 421021745106759 123354 54 -325529982345279321 123366 6 -2143857067777 123369 3 -173693763491392792 123369 4 -14859053321648833 123370 13 -38222302920267817 123370 16 -197192854039753 123370 21 -12211467084078353 123370 9 -4925594326886909 123382 5 -8293075162757 123396 1 -34227492227648 123398 2 1450996978435559 123405 5 1025669331656 123410 19 1274054829319 123410 2 -1618507479254077 123420 6 2359706557624768 123420 8 130802297298112 123424 3 -35664177830912 123424 7 35664177830912 123435 14 231721733085363 123440 12 -42768024735277504 123453 3 -24741688927617 123456 23 1021175800064 123465 5 136291330711 123490 3 -880078770946637 123490 5 -1924459865829 123504 14 80535958179776 123504 36 153936824812011008 123510 11 -26839579679801 123522 3 -2279237722469 123530 3 -160008003425629 123540 8 5877226728224 123543 2 9500645532015 123550 17 -98582690965625 123550 2 21695982370875 123570 2 14824100381120344539 123582 1 -1451863585205 123585 17 299327847272 123585 3 -1044784051877537 123590 4 26436503400463 123594 3 2235512449331 123594 7 2455193164879 123594 8 -6434765289433 123596 2 896366816733824 123600 13 17681099181416000 123600 31 -14304217534136000 123600 51 -2967208408000 123600 58 17492344424000 123606 17 40204575365247 123606 21 -6421488920433 123610 3 -887177278313 123615 3 109568135826387 123618 6 53969410841455 123618 8 -223167238417 123624 15 19125392960448 123627 23 2876973713945174123 123630 16 -3301536742453 123630 17 -8520331088450557 123630 22 32704289091802063 123630 24 -3928490945120505473 123630 34 -1024815929129 123630 37 6387682973959 123630 43 -7168030381420849 123630 44 20059256923919 123630 5 16490504727163 123642 3 -2549105556694605 123648 26 -275448126582784 123648 41 -2211340888125440 123648 50 2211340888125440 123648 5 275448126582784 123654 10 -4073380150465 123654 2 -1907637749837 123657 4 1559201693899535 123662 19 34654122671196699 123662 22 56211190944623 123662 26 107757434486647 123662 29 -1921407146392833 123662 31 -1435789572990641 123662 8 1911035921650543171 123669 3 -71038624194936 123675 1 23026007161000 123675 17 -3097617139000 123675 20 588639866253140455361000 123690 12 -450289853953829 123690 23 -113851118263861 123690 25 6277493872259 123690 32 2874635242360853383 123690 37 -16861085761409 123690 38 -154311440602249657 123690 46 -16605117784009 123698 3 -3244722578873 123714 10 -51440059809261 123714 18 17391884300919 123714 24 57399280930791 123720 12 -6067726774336 123726 6 -558297994033 123728 4 12819733662592 123738 5 7157256307674623 123760 23 3713399149888 123760 27 -11161688353306912 123760 3 435260801107472192 123760 40 98978485155907904 123760 47 -1479777383369900224 123765 3 -831961756048855544 123765 4 -102595314809377 123765 6 1494485083592 123774 21 -342335698198865 123774 25 -24492837930337 123786 15 -59392552612339341 123786 22 -3865482738637785 123786 29 -173121761114505 123786 36 109518862276071 123786 38 47241061649703 123786 41 -38538885177441 123786 7 509477824717659 123792 2 359008910144 123798 1 -447990756605 123814 2 -10860724551031541 123816 17 -27009479573790400 123819 5 6706363599863 123825 12 -6231696781400 123825 20 -778962097675000 123830 4 -719162591228146981 123830 9 -19045183034529 123840 114 57085874385408 123840 127 4951448013312 123840 138 -465958450507097088 123840 169 40027910143904469504 123840 29 3717824196096 123840 42 465958450507097088 123840 49 -57085874385408 123840 72 -40027910143904469504 123840 79 -278552565010944 123845 4 -23997336994441 123860 5 -29722486231424384 123861 4 1143949975446248 123861 5 -4339705397464 123888 32 -125099094213568 123888 35 -88037881018048 123888 40 -3102355509184 123888 42 25904226068288 123900 17 6274820985040000 123900 23 -8157235987468000 123900 5 -96263256860000 123914 3 84276527900958175455 123918 11 233026977239 123918 3 -11252742832637 123918 6 -5103328238209 123942 15 4570840881148879 123942 16 -904028897702321 123942 26 -84274148962662625 123942 9 20053599886403 123947 1 14563894149864 123950 17 -506796476587976759625 123950 22 39696322103197975 123950 7 4962040262899746875 123954 5 3420963124379 123960 2 4845505675456 123966 12 6023015455194495 123966 16 233938596384711 123970 15 11354744207331 123970 28 -1159719411107033 123970 3 64989022368403 123975 25 -31332009191031000 123981 15 -2990851892202896281 123981 2 104550367975795 123984 15 -480738491494848 123984 31 1074960873552212352 123984 40 12979939270360896 123984 4 118117409689152 123984 53 -29023943585909733504 123998 4 1474922159523 124002 18 -1337195191618521 124002 8 1854283687489035 124014 5 -1395147755053 124014 6 -53233559317 124026 12 -1684003297789 124026 13 97137813724749864611 124026 17 -1390904241497 124026 5 83374767856099 124026 8 11002818030947 124030 3 573338557179 124030 5 -343291694597641 124033 2 2570313641111 124046 2 -1065390931176533 124046 4 -1760007552098445 124047 16 33851888303976 124062 6 1435907213263531 124062 7 -70004570792052725 124075 4 122295025000 124080 13 267383521422656704 124080 24 38253267877917438656 124080 38 7393666494120256 124080 48 -398370204987328 124080 5 3689928132832 124080 58 167440436673475904 124089 4 71584131046140986120 124110 10 -5885107525557 124110 15 663813604425411 124110 24 -24591370999257 124110 29 -3438483808986749529 124122 3 -12785943995297 124146 102 -8886102672031838649 124146 25 -9731817442596645 124146 37 112459743441243 124146 41 15405111048258459 124146 51 329114913778956987 124146 59 -26353567260009 124146 68 76918501953711 124146 7 711546316020243 124146 81 360437683059135 124146 91 -570559668454017 124146 96 13660759086183 124152 5 2401436851136 124155 10 -110006218191096 124170 8 32122739060819 124179 3 26346480460136 124179 5 1489392010952 124202 3 -3415340864213 124215 2 22166526694312 124215 28 -16397312349509 124215 3 596074486171528 124215 41 -4576022498524841 124215 64 -7603118656149016 124218 20 47072651773023 124218 3 -1975158546237 124221 2 83714889669992 124222 1 -39321273996045 124222 2 -665076380597 124230 10 -13715505135786493 124230 17 -701295858484433 124230 28 -35303919306237577 124230 31 269410950150767 124230 34 -2901493997569 124230 36 1135036246469352119 124230 4 4573899664579 124236 14 25011116143743083040 124242 2 8230333167035 124245 12 -137760221018457 124245 9 497098923912 124248 7 18207851744800 124253 1 -206414123885560 124264 6 14728363555568768 124264 8 -42939835438976 124266 11 2248655247359 124269 1 -672795642061 124270 18 -105674455782549 124270 5 -1308719370176117 124270 6 757484475668803 124270 9 1023782854668146091 124271 1 -3633566968765 124272 44 -201761988868800 124278 11 4134969844802747 124278 13 11198479512773195 124278 20 814440359951 124278 23 -3494213415433 124278 9 -771922325839069 124290 10 -25536853722429 124290 25 -1340341014195081 124300 8 -26820327484584000 124320 28 -14424173056 124320 38 -3724567209728 124320 41 470505971275264 124320 64 -470505971275264 124332 1 23550150270880 124344 16 2142601228572480 124355 13 52420455795657599 124362 10 366277856543739 124362 11 3345480515366451 124362 35 -49784252705397 124362 48 1344174823045719 124362 55 -123906685754313 124362 67 -27628943014953 124362 75 -461051964304681617 124362 8 17075998677951171 124372 1 93244849970336 124374 4 -594533144177 124404 1 -54906806240 124406 5 8254708091767 124410 10 2201381830773107 124410 15 -6581679934892120677 124410 26 620727885487 124410 30 -1588738543361 124410 38 -15940365784721 124410 4 2054556214590043 124410 44 -71315583605796457 124410 46 14505438498767 124410 49 3764285104247 124410 50 178330154458607 124410 6 35949436968619 124422 9 139112484479 124425 11 428800213449000 124425 18 -260387549127000 124425 19 2794288617000 124430 8 3039354012727 124434 10 -18873731932389 124440 5 499942497684299104 124460 11 1294978191197824 124465 2 259390214977571 124470 22 12715780451931 124476 1 -2742737084000 124488 10 -12793247413344 124488 38 456889771864800 124488 9 3652922840694912 124490 1 -213341574277 124497 1 -1541999246616 124503 1 162872788966984 124515 4 -37333142731917 124525 6 -1149831659840625 124530 15 -9888881613141061 124530 16 42991563461939 124530 26 -3386239191649 124530 28 -23538018946681 124542 26 -7818177106593 124542 28 1752525302222223 124542 7 -330555773859453 124545 14 -109229086849304888 124545 17 82702154520136 124545 22 -22082947793857 124545 24 -3981965580142840837 124545 30 -155531795518762813 124545 34 23160381826184 124545 35 -14133920678909646449176 124545 5 580546082540143 124550 1 3619997636055875 124550 18 -664471445793625 124550 2 -88816897714257125 124558 10 6644142956339 124558 14 -54760452122845 124560 21 -275764867296057792 124560 28 10213513603557696 124560 51 -150234433971604416 124560 55 -2729478866976 124568 3 8841937741979328 124574 2 7661303976979 124575 11 21367811299375 124575 1 -149756867431685 124575 16 -18719608428960625 124590 6 26764821936847 124608 37 -129800724413542912 124608 44 -26579105288704 124608 55 129800724413542912 124608 59 26579105288704 124608 90 -8166040901056 124614 11 -140338427573385 124614 19 -1736443024065 124614 3 -4355592835509 124620 3 115830687542048 124630 13 -131141902968989 124630 16 1251078909406623 124630 23 -1018438698914757593 124630 29 68500540289159 124630 8 -77768074805509 124650 19 -112294880128125 124650 26 375554912416875 124650 34 -116926955996625 124650 46 -583748153051625 124650 47 -15353624948625 124650 61 3475097859375 124656 43 -7691684434860893824 124656 54 -52470123247808 124656 60 -101296653574800320 124656 81 78710060663360 124656 98 18654704032832 124658 2 -2356738542865472257 124662 4 -29476306564129 124670 3 6003201373443 124675 1 -1100255087540125 124678 1 -16977358903378365 124683 7 -322023120668920 124683 9 -71523978246109 124690 3 -644940654403439737 124690 5 400358897423 124712 6 -1597743175904 124713 1 24411567433320 124722 11 -6032411302056165 124722 22 5395610979603 124722 25 -159094396565325 124722 30 -58616365911129 124722 38 -181435844793177 124722 40 3234957031660355703 124722 53 -349530389254019025 124734 1 -6423958868453 124740 12 -1013128590996864 124740 15 -72839814592896 124740 20 27354471956915328 124746 1 -1996920139013 124746 4 23074163354494043 124754 5 2005121361953843 124754 9 -3220090979021 124758 3 -3324958387245 124775 7 1643247590587875 124782 8 43261406414351 124786 1 29811762369459 124800 86 -41435547200000 124803 4 4510539998055 124805 1 3450964778425323 124806 2 -14755588814573 124806 4 -42217929652841 124810 6 11735273804311 124815 1 -108584486311049599157 124830 10 -435910961971341 124830 17 -3362254018226973 124830 19 1339905417993747 124830 26 46654798618015947 124830 34 -99076625658621 124830 35 2588828424759099 124830 36 293803499530899 124830 39 16144850443383 124830 51 132370313976423 124830 58 7143719566872821463 124830 65 -658748223583053489 124830 66 -145392040881 124830 69 -44208768810249 124830 72 -351338065544165481 124830 73 226007903333151 124832 6 -21772193738048 124845 11 -24461602717301 124845 13 311750785084103 124845 6 -747718555966712 124845 7 -53333806184504 124848 22 -1791639138863808 124848 51 -702394125379776 124848 98 -190718917944768 124850 2 -64617314472125 124850 7 113114554089767875 124872 11 1467681299637344 124872 15 321840714605696 124878 1 -16161859039373 124890 21 -4891350719399473 124890 9 -33006291539077 124894 2 232531306730955 124894 3 4483277444647 124906 11 -3858040820285 124906 1 6238287131144363 124926 4 -3031718584553 124926 5 19025182737632807 124930 9 520203752401159 124936 2 1177325370080 124944 6 26649578566016 124950 100 -18315874793125 124950 105 -204669668153125 124950 106 31342599771875 124950 107 -693826084118125 124950 112 9567208874391875 124950 120 -29186653540625 124950 122 -1957251601741625 124950 125 18520841560375 124950 130 338114160724375 124950 133 -5550608672945 124950 135 -68891916109625 124950 136 76537670995135 124950 137 -25210693237625 124950 147 -2671304216548625 124950 148 5135911495600375 124950 1 -56763249003125 124950 157 60558828422026375 124950 180 32301215734375 124950 181 -199913351973265 124950 188 1903858774820135 124950 201 -104919358434625 124950 206 87216407534375 124950 210 165631526435375 124950 218 115890487124615 124950 229 -86004093774025 124950 230 -3607804622760625 124950 27 265116259142875 124950 33 43231080158875 124950 35 -316281396528125 124950 36 -10750511721753125 124950 37 237982346852516875 124950 38 -24989168996658125 124950 49 14486310890576875 124950 60 369684145005875 124950 6 -1530172244124125 124950 63 -14828260494494125 124950 65 -79228135874125 124950 67 98776856724875 124950 7 -25182278946125 124950 84 9361537458875 124971 5 -821398466456 124974 5 1311035561739 124974 7 21922414909886979 124986 2 -8644172944537 124992 14 -1120994297565696 124992 148 54289443912192 124992 50 -54289443912192 124992 57 1907891228160 124992 92 -41518307317248 124992 93 1120994297565696 124998 2 5923278572347 124998 3 -15765402846925 124998 5 -946284855362881345 125001 6 -31524640325937 125008 1 -13902968647872 125010 11 -486971165957877 125010 19 52836670522431 125010 29 13148221480862679 125020 10 -76676689857400704 125020 9 3011810107725504 125034 11 -43030157340997 125034 17 101692287001999 125034 23 -603000886769 125034 3 -1191384314693 125034 32 2246858687341295 125040 5 -201739540846528 125048 6 -4184843217184 125050 13 -36514167386625 125054 4 -95065436847185 125055 3 -40348876985208 125055 6 1089419678600616 125103 9 -3291160132881784 125120 28 -5547622920704 125120 33 -27757947787776 125120 42 3614645954765312 125120 46 -2073182643712 125120 6 -3614645954765312 125120 65 5547622920704 125130 8 290354792309963 125130 9 -19796164099597 125136 14 -1755030507461217216 125136 20 -472619125405439424 125139 11 506107656251 125139 8 1459861883432 125160 2 -386081086336352 125160 6 -282223764724544 125166 3 1039123995283 125190 12 -7278558758613 125190 15 546849378625707 125190 41 26700001606719 125190 46 -181425741607449 125202 12 -1144252316667349 125202 16 424859173317055 125202 20 -641927171537 125202 2 1531660856923 125208 7 -42839469822528 125214 13 -102178453425121 125214 15 -64184719648969 125216 6 255701783360512 125216 7 -255701783360512 125230 3 306565184322783 125235 28 -1887395843726712 125235 41 -46727099091981 125244 17 129712100928032448 125244 29 -378234351284832 125244 7 -378169390460736 125248 31 1899189514893824 125248 9 -1899189514893824 125262 2 15165931590002187 125265 7 445742408755799 125286 12 -6742804426244461 125286 16 -135252120162545 125286 20 -28694293042393 125286 3 -53643511701053 125286 4 331228101233539 125286 7 4655046096758051 125286 8 -96883848571809343717 125300 10 -462171526008688000 125316 11 16404733036375488 125325 15 -665015174465625 125328 22 -728291410624 125349 8 -177982669253656 125355 3 190991178869779 125355 6 -1819014828229 125364 3 -67157586001376 125370 11 -2428806218786018037 125370 16 -3453965674389 125370 18 -268569848797461 125370 28 -1288122345449577 125370 29 -14241978519273 125370 9 110900369187 125373 2 -1631484223640 125373 5 82150221812562152 125382 2 2614141253807 125390 2 11584110709799 125392 1 531981556608448 125400 23 -835667253620000 125400 33 193679926928000 125400 37 1039887884996000 125400 51 -1654629459704000 125400 6 -804277300400000 125400 87 -115509630700000 125409 3 4880633205896 125415 2 -724301040417624 125415 5 26825964459912 125424 4 -979627759395264 125426 16 7686269947615015 125426 17 -3525573206961 125426 2 -1011671205691154581 125430 10 -910550495127349 125430 12 1438065426527407 125430 15 5391627081049711 125430 18 -1086976859473 125430 19 -939095761710299401 125430 6 6742385747903483 125433 4 22684287804830856 125438 4 -262005894877697 125450 17 134182449634375 125450 20 78872071012212375 125450 8 62866609971875 125466 2 -168929525896669 125475 14 -71279416279000 125475 18 150934813793000 125488 9 3839278375432000 125490 16 911555188790522903 125490 18 1936433950476479 125502 4 -8662635637525 125504 4 -15951653249536 125510 6 103783133151739 125510 7 -44604486180549 125511 5 -11094884260561 125520 2 311281419613125952 125550 3 51889708150875 125550 52 -466530170504625 125550 83 -1921841042625 125563 1 -22925811853493 125580 11 -2866362565184 125580 8 -20301288772631264 125587 6 16195903810408 125590 4 1098939507823 125594 2 1159728913251 125598 22 -3508726591128758725 125598 30 -36507773425169321 125598 40 3555188522567 125598 41 18194043536207 125600 6 -1884302028280000 125610 2 3825362166643 125610 24 -3806001163081 125610 8 18254666334707 125615 5 -1636823116132856 125622 19 2293043138847 125628 4 181468550928160 125630 1 35340596474203 125640 6 29527566957216 125643 5 622413115703 125650 4 -16459446386125 125664 10 202862545458560 125664 1 465735327616 125664 20 -202862545458560 125664 26 -465735327616 125665 3 36591200016607 125670 5 42317125503103 125670 7 -61750907767889 125685 25 -76758157986233976 125685 32 -43399143505368 125685 41 2072470265628317352 125685 43 -229573198074728088 125685 57 8502711039804744 125706 10 34885991026475 125706 11 3491877357077075 125706 16 -102570340069 125706 21 -3492543791663081 125706 23 1135932344023231 125706 9 82334398191011 125715 10 -12925527946712 125715 15 -5258318719229 125715 21 -8483616965893528 125715 27 8930221599818024 125715 30 -215181730792261 125715 31 -63503118802196056 125718 1 -489512610158093 125718 2 -454118975998093 125730 19 808720120229607 125730 30 -397816401956913 125730 32 17624947296303 125730 6 -12467919148036389 125736 10 -777833979161408 125736 5 431352050345632 125745 3 -104363621354321 125757 1 30887065574307 125760 2 -829265449472 125760 40 35763173831168 125762 1 -409091449351733 125766 6 1745573625937026819 125766 7 -64650875034704697 125769 2 118922416242796279 125775 10 56598392050875 125790 1 1407850419195857323 125790 17 1004930685179 125790 20 -44990443547153 125790 24 26622979681591 125790 7 384731970211 125808 7 891563850589760 125818 1 1291778363555 125832 9 256655364484361696 125840 14 -293381820594368 125840 67 74773607170163264 125840 69 55891376557780544 125850 7 -7653442385125 125850 8 -123161645540125 125853 2 -470817737144 125856 12 12228799136256 125856 18 -12228799136256 125856 37 1038566150659584 125856 9 -1038566150659584 125860 1 -18367297683552 125862 1 922632838108579 125874 20 -1825427709652653 125874 24 84300792018183 125874 42 44216731413567 125890 2 -38521604714229 125892 2 -7464965505408 125895 10 11488730607656 125895 7 9573143498423 125902 10 -37583344138285 125902 11 -356431790620837 125904 13 -109737777345472 125904 19 11238938842688 125910 12 6119576872368543 125925 13 18243554728375 125925 18 199277012121875 125925 23 -25149676249676125 125925 3 4731490888093441000 125930 3 2579856760177543 125934 3 -455748369227297 125936 7 -462927926959552 125946 3 -5159142344349 125950 3 -1610486622125 125954 5 3335611923765495 125958 1 213060046966075 125970 12 2619974188309906043 125970 13 20970693292427 125970 15 -1768266132157 125970 16 336685829810507 125970 19 2474431835102603 125970 20 208449099690850043 125970 21 1221276888879731 125970 23 7040482497251 125970 24 -98863416903061 125970 28 -247796946905898563029 125970 29 49832728795979 125970 32 -262105958135269 125970 33 -1811466131149 125970 4 -451890354820300973 125970 7 -69421832058509 125994 9 21087787717691 125995 1 -1754349511012743384 125998 4 -144424039186873 126002 3 -435579702558835969 126015 8 10172813201576 126024 4 -111202905139264 126030 2 2387926473404810059 126034 1 -45221678111828709 126036 2 -2403741646207296 126036 3 89031129124032 126040 3 -530632580870304 126063 4 787403616258447 126063 5 -29163096898461 126063 8 10000406819304 126066 8 -225580208633 126070 2 -291576416947667613 126070 6 1059126772038651 126075 19 -589004035075000 126075 7 1077042690571375 126078 5 1952176734127 126082 1 1465781634229674267 126082 6 -1101263436686457 126090 20 35335624413591 126090 8 -1308726830133 126093 1 -478971213389 126096 17 499132884761920 126126 104 2793486122926695 126126 112 -164061874325601 126126 128 -103272721964937 126126 129 -55284183148761 126126 135 -40556128276377 126126 144 -16729437382606178433 126126 151 -5456053427732649 126126 156 2047428300345687 126126 16 174089897998947 126126 28 -103462448997285 126126 32 60146726116491 126126 36 -142011395281413 126126 52 239956463326419 126126 54 -110150273701629 126126 57 -42780076159259061 126126 74 1605250554221475 126126 76 132249837472011 126126 85 -90502821082233 126126 98 -227170243728225 126140 12 -58460719780224 126144 56 65551301153280 126150 19 545437653821875 126150 31 -3232286452910125 126150 35 2237938136772875 126150 39 3030911180889875 126150 43 75229120177116875 126150 53 601832961416935 126150 58 86780107525375 126150 62 -33533181430888625 126150 6 247004094221875 126150 7 1021134733496875 126150 73 66447339671375 126150 90 -124319223420625 126150 9 -58015149189291125 126165 3 85126565260853576 126170 2 -26918939944477 126170 4 249958619294203 126170 6 -1215018947353953853 126175 2 -80181306163000 126178 1 38983683539575 126180 13 524677654656 126210 1 -681788129157197 126210 17 -1909216131750577 126210 20 -10235599022809 126210 7 -2378810632213 126225 14 -29265762375000 126225 15 790175584125000 126225 9 -256688154279000 126243 2 -192932270362377 126258 11 -3366495040132729 126270 11 204522109648947 126270 15 -73934749996745013 126270 3 1197620766607131 126270 34 21006414010962207 126270 42 173475953146359 126273 1 -8179381980728 126282 1 24772312160612011 126288 18 -38696126542272 126294 10 -99394696500805 126294 7 -31303220958303461 126294 9 -460372740085 126295 2 -5385578105656 126315 3 -18594967482477 126315 6 87551922375063 126325 9 1307239036875 126330 11 737517377153087 126330 12 221509929743 126334 4 -80130307915601 126350 101 209709728149375 126350 10 2676165609399946875 126350 39 6617877946875 126350 4 659555085993875 126350 50 593308151023596875 126350 60 77375927163375 126350 64 237512677790375 126350 65 54115851000809375 126350 8 -125875897301125 126350 84 -1402848442390625 126350 90 -45392024837615625 126350 93 21409324875199575 126357 3 62494324606216 126360 4 23009998642272 126378 12 18984221597475 126378 20 -27565530488469 126378 2 -1544842017837 126378 31 -6047949116313 126378 32 -392209753271265 126385 1 3268476072015967 126390 15 596419192223 126390 5 31751750477899 126400 4 96939108800000 126400 57 -96939108800000 126405 22 506549227031792136 126420 1 -3812714720404352 126420 22 18149139616384 126420 37 1354847139991011968 126434 1 2473965669267 126450 14 214809929521875 126450 33 226407923067375 126450 48 56853234804375 126469 3 18907366391711 126477 10 387997106055183 126480 19 -257458259734336 126480 30 4474959796915264 126480 7 7341086197088 126490 11 -79672768353261 126490 14 -500157026461 126490 15 -3820570896897 126490 5 -37356366095756037 126498 8 2888973698399 126510 1 20758426663775131 126514 9 -27162673952913 126518 8 89953530357592531 126525 10 141636303600497000 126525 12 -18408067697125 126525 1 -34935583607000 126526 1 -768414248605 126528 15 26969779805696 126528 21 -26969779805696 126528 29 -193571422295552 126528 9 193571422295552 126533 2 -34703565006104 126544 2 -7898624462521025216 126546 10 550351719100351703611 126546 13 -90164519462989 126546 23 20210839341391 126546 25 -7371617103577 126546 33 -412031038006729 126555 17 14656414349591 126555 20 2180985243659 126558 12 580849254774135 126566 6 999195620099787 126570 15 -17412200672159753 126570 18 66416015172383 126582 17 5856566260214339 126582 19 -216348388908805 126582 5 -764016290862965 126585 4 4669546422557448 126588 1 -420067057472 126588 4 11804377345984 126592 15 4587853662829440 126592 17 -4587853662829440 126592 19 -36702829302635520 126592 2 36702829302635520 126600 4 -22148178992000 126614 5 -80225900073073081 126616 12 56116931195892672 126616 18 182421279578193711552 126616 19 -163606213399104 126616 22 -4371478046782412608 126630 23 -8972028341176957461 126630 2 -506114244214893 126630 25 13489866506691 126630 28 -20173117765221 126630 34 -499624685433 126630 37 544674179660967 126630 45 2596094148159 126630 52 332297345969516943 126630 57 -3456092562777 126630 61 18744972007959 126633 2 20097902432431 126635 3 -34940656112408 126635 4 77640858344511 126650 11 -267013511636625 126650 18 -8183964515625 126651 11 4291516008872 126654 17 -17928296500969 126654 18 1424397613548023 126654 3 -1829754339801461 126654 6 -10254488587873309 126666 2 156810453416222427 126666 7 -5807794570971201 126670 4 4424239897451 126670 7 1922833357479 126672 24 149563442520640 126672 41 924049266895936 126672 4 -4966165590560 126672 48 -1681294793717440 126675 10 -2450533074997856625 126687 2 -968667413340088 126687 3 1289296327155657128 126690 10 2277755933291 126690 14 -83312007833897 126690 21 -108852291800928217 126690 29 -25795542903121 126690 6 -64987567597 126699 2 515482715251 126724 1 433976202456256 126730 1 -3220651608055677 126730 6 790647391439 126735 11 -191661445761890392 126735 12 10053479269448 126759 1 -45701662750973 126768 15 5103070588736 126786 15 714177808200105695 126810 3 -95560229709 126813 2 28431739075528 126822 4 8346448199431 126825 19 627885938603375 126825 20 178661696381000 126825 22 -79977450667771000 126826 1 5972599517219 126830 10 -10645912030409 126830 9 -2511141185681 126841 1 -79856846449784 126850 18 478869427867375 126850 23 -10650233490625 126850 6 488369966768875 126852 12 -8792661086714080 126854 1 -370847384781453 126854 16 2584640403569015 126869 3 702723034619 126870 1 596006974302283 126870 2 -13955801974277669 126871 1 125891247905127 126882 1 1905927121827 126882 19 193634811044235 126882 24 -51460032289329 126882 39 264426344769463407 126882 41 -11911974315921 126888 7 39687510997952 126894 1 1204291305179 126900 2 -25979505707484000 126900 26 701446654102068000 126918 10 -615870373707189 126918 9 514839053403 126919 2 36731518298280 126945 13 -565735323672 126945 14 2552449321512 126958 2 -1995262631757 126960 1 -24199371852992 126960 13 -188287975878688 126960 27 -2445579459008 126960 38 -391805983488079808 126960 61 4067995747199552 126960 67 61117647493560128 126960 72 6985544762019392 126960 79 -2482254664751296 126960 86 -1186852108714624 126966 11 41795299754783 126979 1 -99346071160 126984 8 34367046806080 126990 10 67362807808989747 126990 17 -7424202576826557 126990 25 219107855590011 126990 34 1257691255788430899 126990 37 559644123887010207 126990 58 1679740543359 126990 61 412812830392551 126990 7 -20727560143963341 126991 4 11836902043304 126999 7 40347372059208 127006 7 752920806011039 127008 43 66715388135424 127024 5 -10549578623168448 127026 12 -1344934999989 127026 19 -90845067653721 127050 101 -176504255228125 127050 107 -6898167443468125 127050 111 -414863640648325 127050 112 120876302751875 127050 115 308093731611875 127050 120 1648900266756875 127050 121 -1007453938680399925 127050 134 78699802072375 127050 135 -8948713244528011625 127050 13 727170227405875 127050 143 -21058686526625 127050 144 19229493559375 127050 145 -481651476106625 127050 15 10537700058782875 127050 154 8517502807672375 127050 1 -6399325926125 127050 165 -55185339547745 127050 168 -51857955081040625 127050 170 -125931742335049990625 127050 181 -2227133080390625 127050 185 -117281034825625 127050 19 -1287090871701965 127050 198 13104486205130375 127050 204 5411538959762375 127050 208 12449211402332375 127050 214 937504484390375 127050 217 1726814419958375 127050 224 174232076296169375 127050 225 -160886358962745625 127050 226 43615529849375 127050 228 -98454511725625 127050 231 756915055357175 127050 237 176770080884375 127050 240 6208621662886775 127050 24 6723300709637875 127050 25 1393856610369355 127050 31 8486196248195875 127050 39 700439244632875 127050 42 -22788615843125 127050 44 1083052170206875 127050 47 776077707860846875 127050 55 94614381919646875 127050 69 500265677148875 127050 77 -71765820812125 127050 78 -1247818468723589125 127050 82 -4877987424149125 127050 86 156101057352906875 127050 91 -645262889528125 127050 92 -79234630717961125 127062 10 -940298497218261 127062 18 15471278725239 127062 19 81751451391999 127092 7 -27841679156096 127094 1 -14269696102261 127098 7 -2734808148044073 127098 8 3581221050711 127110 21 2934935421078671 127134 7 -50521178335725 127140 5 -97189499477728 127146 2 1253561819147 127155 11 266298254856711091 127155 1 -18483726331133 127155 14 3464817153341327 127155 22 1504535422607 127155 25 6339918131578619 127155 3 35936110074088 127155 4 3721784818386187 127176 1 -576307364478560 127182 11 -7566397214833 127190 3 1743441136095331 127200 14 -3745536581600000 127200 26 101761340816960 127200 35 3745536581600000 127200 65 12720167602120000 127200 81 -51024379528000 127200 93 -12720167602120000 127200 99 -29964292652800 127218 3 51510805780771 127239 3 6072089033800 127248 12 -128306203610048 127248 22 -2093992778505664 127248 24 -1143904178164672 127248 4 -14547060172129472 127248 7 200962302750944 127255 1 41918083416343 127257 3 -132351219326456 127260 10 -25480411737696 127260 5 -1586620769005152 127270 10 -411302736276696109 127270 14 528131396619 127270 22 -1633977344103857 127270 28 -11713529629521 127270 6 944841410433747 127270 8 152533029220375987 127290 10 -57457519815869 127290 14 -2558332527733 127290 2 -1049330559018653 127290 28 -40491796686049 127296 102 -90541453985280 127296 17 -3471094937088 127296 37 -11739280900608 127296 51 90541453985280 127296 89 11739280900608 127302 16 -117734264695817 127302 2 -4640967090557 127305 2 -26001157407381 127308 7 -3745660905026272 127314 12 6379862769481637079 127314 7 8539925491899 127323 2 77157350855208 127323 4 134578498843944 127330 10 -4878316462697 127330 11 3150197648263 127330 6 1793815900601131 127330 9 -125329802133464826101 127344 26 -21406426115264 127344 30 -13543591981760 127344 39 294341556087872 127350 25 42658576738351875 127350 27 613757548024801875 127350 32 341268613906815 127350 35 4910060384198415 127350 38 -57604813817625 127368 5 283888919279520 127374 18 -52172031773753 127374 20 15955694908847 127374 21 1451197381967 127374 2 -14499454950053 127374 22 18793880175991175 127374 6 -1765978034237 127374 7 4683486078883 127398 3 2010003563096659 127400 33 -10058139648900000 127410 1 4362064157961667 127428 12 26197792645516174880 127428 13 10571494173344 127428 4 530566118874784 127428 7 -199658978606816 127434 2 -52190133616025 127440 32 2310629700568896 127440 62 142204142251584 127446 3 3216929511275 127449 25 -2913072578630424 127449 27 -30839516525912472 127449 33 160626290575779 127450 16 -39506107073625 127452 4 -920467146345256160 127464 7 137982441138063488 127466 3 757856773544147 127470 11 1299569421196187 127470 22 -2617840555721 127490 12 718200564110911 127490 7 -771934455889309 127490 9 -956082441921337 127504 4 -12635817740438976 127506 6 -753960232477 127510 5 1641079242811 127512 11 825904808088480 127512 12 4076256394157760 127512 21 93266253319392 127512 39 219022504003008 127518 11 -859760098638337 127518 4 -65105241769 127518 6 626457619157798444111 127518 7 7819418775339791 127530 14 566152267811499 127530 15 -83869424180901 127530 29 3596929740116127 127530 4 17874970074603 127530 7 -6561402621597 127530 8 -1395020364848282277 127530 9 68774431631283 127534 8 -485839397633293 127536 11 -968782391409088 127542 5 -427859032828676345 127550 5 -49248555292609768125 127550 6 -393988442340878145 127556 2 25252048787616 127568 1 -16903416325760 127578 2 -3273417027933029 127578 4 -8718088792094677 127581 2 -2842089921141166673 127582 3 -48268024365653 127584 19 704390581997568 127584 24 -704390581997568 127590 5 -3705467657273 127595 10 -63532931755501 127610 6 -28924767748816073 127620 10 -4180665344832 127638 4 3417401151459 127638 9 -33711230052081 127650 1 100441704203875 127650 18 168863865866875 127650 21 1294410335232475 127650 4 -11492634870125 127650 45 -5003190083125 127650 54 1040067634747375 127650 6 15888887619251003875 127650 72 -74968468195625 127650 75 27921791009375 127650 78 161801291904059375 127650 7 -889847288307125 127650 85 -3149168932433508625 127650 96 -118752586665625 127660 2 -532650712554208 127666 1 2975695534099 127674 8 -25064400342033 127680 103 395193091635712 127680 11 -6724021573233152 127680 117 -27654404742656 127680 123 33003137149774336 127680 125 29086393125376 127680 127 -137904889005568 127680 137 144076871347930608128 127680 143 6724021573233152 127680 150 11250690039296 127680 15 137904889005568 127680 152 -2459169312256 127680 165 -860843518137856 127680 24 -358271097344 127680 27 860843518137856 127680 28 8634592294114816 127680 38 -15341083438976 127680 42 -11250690039296 127680 64 -395193091635712 127680 65 -2280486011392 127680 66 -27096693027328 127680 70 -29086393125376 127680 7 -144076871347930608128 127680 77 -33003137149774336 127680 78 -8634592294114816 127680 81 27654404742656 127680 90 2280486011392 127680 92 27096693027328 127686 2 432837481051 127687 2 8785140676712 127710 11 7645197297339 127721 5 196548388026427 127734 1 -1088909383877 127734 8 76244443552855 127743 16 179779273545907 127743 27 21988659760424 127743 28 -1845866925504280 127743 38 263649060576755 127755 12 11381586778218024 127764 12 -7401535848203328 127764 13 274130957340864 127785 4 -162009802072 127794 26 89284399364195 127794 30 -1196932813858529 127794 41 30301528700509901161199 127794 48 -31213456048009 127794 5 6204045197690947 127794 8 -4417776454367969261 127806 11 -914767224265 127806 1 -472801956101 127806 2 -8757384554645 127806 6 163509560084555 127818 15 -2686093797055257 127818 7 72524532520491939 127820 15 -1750551939424 127834 2 5938560250811 127842 1 -409381492229 127842 15 17643665818826434639 127842 21 -1874264448897073 127842 23 45744351117119 127842 24 -578356616800945 127842 3 11279093325787 127848 3 85693310477216 127853 2 2315954292488 127870 2 -4158285649600301 127870 7 81604765806391 127888 3 210886194900827456 127890 111 -52366461651441 127890 112 22363203001167 127890 119 4599775687323663 127890 122 1323558680436783 127890 124 -2202098637070017 127890 125 1225006582023 127890 12 55475608154184603 127890 133 32370126062502720807 127890 138 -3018936462633 127890 144 -94373545371728049 127890 147 -1577723060752016409 127890 151 -2384619900201 127890 167 3656350009141631991 127890 18 -109446232774221 127890 22 -665248012831269 127890 30 371721363138027 127890 35 45065451847703427 127890 41 -36150531144548373 127890 44 -26904310550397 127890 45 -5713533898048472517 127890 51 1910268016059123 127890 55 -131386156990389 127890 60 16657533230462019 127890 63 8887617882171 127890 65 114080479756299 127890 68 -87095378344149 127890 95 17961696346444263 127890 97 76728063405766311 127896 17 5827602755517760 127896 2 -5672388246484832 127896 28 1546989861942368 127904 12 85856291873792 127904 2 -85856291873792 127908 4 21622311661248 127920 16 427893485590601792 127920 26 77464037873152 127920 29 -26278896310633088 127920 34 -58345914811328 127920 4 76916689106752 127920 59 -6644943418816 127925 2 139025566896875 127935 8 11059698035304 127942 3 -8924389690465 127946 12 -95491174960327329 127950 16 -180583206408125 127950 21 1228923537875 127950 22 -1007859904265125 127950 23 -1596620380457125 127950 25 55834767321875 127950 30 29017774957375 127950 31 -1723087678625 127950 3 245727397758329875 127950 36 -12357720258625 127950 47 314878358909375 127959 2 1278902021480 127974 16 -4374624565572046001 127974 23 -6709846556911105 127974 28 79172974320822984167 127974 8 37341787807678906763 127986 1 882395092171 127986 2 -159128593976069 128002 3 -18547382250181 128010 16 800188320419 128010 31 -879259418228809 128010 6 -894244413149 128011 2 -28061379816965 128016 20 3023620704 128016 30 -171061097943865536 128016 36 44323112677248 128018 15 29994181562719 128018 19 -843489773880609537 128018 20 203319147735 128020 3 23153610652352 128022 1 28531419443402203 128030 10 -2516769310952177 128030 13 15185229313743 128030 8 -1379964485061 128037 5 12131670482016463 128037 8 -35369301696841 128040 20 149626898406944 128050 10 -123785024428125 128064 102 -16955236110131200 128064 104 -11243990517760 128064 50 36627816480256 128064 5 -415040111346176 128064 62 16955236110131200 128064 63 11243990517760 128064 88 -36627816480256 128064 89 415040111346176 128070 5 -806981131917 128079 5 -130523198032460169 128095 5 11171721558664 128100 12 694592457364000 128100 4 -296869704524000 128106 11 -2908786121589969 128110 2 112140861897447 128110 3 -1372783038857 128118 3 12617001468451 128122 6 -5683214365761537 128135 14 -36655394909336 128135 6 -1442589618194648 128139 1 -33890867541090296 128142 3 437538415016403 128150 2 -109255852766125 128154 1 -43864402679261 128154 14 43327476618479 128154 5 15302869572203 128180 3 -236437292161504 128180 5 3160217638793376 128184 9 50159031307840 128190 3 907987209260147 128200 3 292467547000000 128205 14 -215316320377191417 128205 16 8399281215123 128205 21 -6415688174337 128205 24 2814302302948896003 128205 28 -5803325105976 128205 31 41347951593228120744 128205 37 190106971569864 128214 3 3175741801926675 128214 4 3615110245755 128214 7 -117620066738025 128216 2 60272289088992 128225 1 3536397558385875 128226 11 -3713722168433509 128226 13 -406978493417 128226 19 -584363349361 128226 2 1320892748443849267 128226 27 -39245864952169 128226 5 -12169555916309 128238 11 79761262387503887963 128238 13 42204275820035 128238 17 16642131259404419407 128238 1 717894534003859 128238 30 -3514207183583761 128238 6 32610004868539 128271 1 274759677011755 128271 14 95257552309075 128271 2 -6027728220917 128310 14 80445910422832219 128310 17 40634367397651 128310 18 -2375511280813 128310 19 -1073266051213 128310 20 34313272307188883 128310 21 -17819234294653 128310 2 -31161366388277 128310 24 -2140804559629 128310 25 11852514399851 128310 30 992902579154767 128310 3 -359017345133 128310 44 -3809916244961 128310 49 -3302008312114810758097 128310 53 67394171861536031 128310 54 -398317813921 128310 8 2613139767133818657643 128316 1 -125110562816384 128316 3 5807633097225664 128325 21 345647789000 128325 7 -143228804191717625 128330 2 165226249926220951 128334 5 -7868127998917 128336 3 42616496252981312 128340 12 -578340994046688 128340 6 4033476164788128 128340 7 -94040454728029248 128349 2 -4653737475792120 128352 14 -42248903091200 128352 18 42248903091200 128370 11 -1856912410564813 128370 13 -13095775628257933 128370 17 -10916670041389 128370 28 -987223580137 128370 3 27202080168883 128394 16 -63920207141505 128394 4 -5521571440461 128397 2 229039548690824 128400 30 698905542980800000 128400 50 58956357762280000 128400 5 93533296094884000 128400 73 5591244343846400 128402 3 176752109066095 128403 3 23089050371115 128403 4 56783252545416 128414 11 -1737664886521 128414 4 -86078237206697 128415 6 -423746574481 128427 2 -16041586275484856 128427 6 78115662988667 128430 11 -35490047604417 128430 13 -243714342817881 128430 4 -78268201811397 128436 3 2012050773607456 128440 18 140059128094912 128440 27 -12692329172184896 128448 32 -1390626123264 128450 22 -1195368126648625 128450 5 -631658213487125 128450 7 -23573863290880125 128464 5 19504976222528 128466 3 -166687692991461 128466 6 6173618258943 128472 4 -6776338165319531181376 128475 5 39230665497000 128478 1 -17766711846989 128478 13 6795255947347 128478 14 619985457641683 128478 31 -1807537777381 128478 3 -339856047210869 128478 34 626156550582227 128478 40 -320631839980669 128478 44 -32750347759577 128478 47 -1000722035811617 128478 48 241757173731871 128478 52 6978801381924866095 128478 63 1293306248718071 128478 65 13918892308731952199 128478 69 -26588968795630297 128478 71 -571957144762969 128478 8 1405873737928891 128502 24 -27560856826701 128502 42 -9110641861815413337 128502 47 -1865572864765929 128502 50 29360618950311 128502 51 36683500436339031 128502 56 132091532718255 128502 57 89859871047375 128502 60 42957156928455 128520 12 68597419231872 128535 10 -299041710034249 128535 4 -2311150846229 128550 8 5617823874875 128557 2 -563250553237 128557 3 -1437915442969 128562 3 10358638112215 128570 2 -308202006653 128575 4 -12609476212502904625 128576 45 797703964628480 128578 2 -5081403624688843613 128583 10 -212241758219217 128586 2 -2397954279988421 128586 5 306484143283 128586 7 2281539534859 128590 12 -26776140329989 128590 13 918158977322095851 128590 16 -10395034279433 128590 21 67067188466097007 128590 22 -4413501543753 128590 24 -5407248518019153 128590 8 -1861302234581 128592 11 234853582213440 128610 11 -30149774218017 128610 1 -359643706334901 128620 1 -6777040551776 128631 1 -3281807233304 128640 12 6967275143552 128640 24 -630219302272 128640 9 -1649830930496 128656 10 10480044278656 128656 14 -64721156002208 128656 23 895040093175421760 128673 17 455013383450967 128674 10 351604161120835 128674 22 14267865819612467951 128674 24 -41597276442018857 128688 11 4769200207232 128688 15 51670567710784 128694 4 -692467631989595009 128699 3 -893650043925 128700 11 -437723413111152000 128700 49 -95948036805600 128700 56 -11993504600700000 128710 2 -2023564895137493 128710 5 -3883757163242356809 128754 1 -202207225479237 128754 12 -34817544374454261 128754 14 5561791121223 128754 18 7758450951615 128754 8 63377700379803 128760 12 66034147417408 128760 16 -22578320079547712 128760 17 27065842446016 128763 2 10985078902131 128766 12 95732718587711 128772 11 -1727287220367072 128772 14 8724445507637334720 128778 18 692224931359 128790 24 1462950130887 128800 4 71194826392192000 128800 8 -71194826392192000 128820 2 85289975270099072 128820 4 -13059582016384 128826 13 -2054094558561 128826 18 -16119269431785 128832 13 38630625544448 128832 29 1582389420544 128832 31 -38630625544448 128856 19 -1873707151168 128870 1 -1011863929573 128870 12 20737353872604411 128870 22 -38642346629873 128870 25 23867550799687 128870 37 26691064486191 128870 9 -60458757646077 128874 1 -2718125372069 128877 1 -11074695967565 128880 13 1737890166904704 128880 46 -8926419750160896 128880 49 -102196436543424 128880 9 4345535736396448128 128886 2 -10299977508277 128898 10 -3664626433245 128898 21 -92877524477541 128898 49 12590503140375 128905 1 1636250917832 128931 5 3511454066279 128934 36 -4452906941721081 128934 6 -566141377443309 128934 7 19101919446459 128934 9 88559627077298187 128935 1 254783643643 128940 2 -1439726051168 128945 3 3884488953406343 128961 3 4792605995304 128970 10 1371837997320039 128970 7 21887643128751 128982 12 20842613362495 128982 1 4091719032029539 128982 17 -29552633233145 128982 5 -378065730402989 128982 6 298308027466819 128982 8 2800815877243 128986 13 -4371467175570918357 129008 9 -1595040209311680 129010 10 28177627399767 129010 15 38546273847591 129010 20 29419939073951 129010 21 -9779302904841 129010 4 -1359681080164270613 129010 8 1974947582287 129010 9 34581144109023 129027 1 1728203588200 129030 16 -290751500668769 129030 19 -1437708090861521 129030 27 -826608170074909609 129030 28 205484324927759 129030 29 -14491528003729 129030 6 -13796248786829 129042 8 -24354323721657 129048 5 -21735724909888 129050 16 2045424373698375 129054 1 -741341835485 129056 2 -1017072179600896 129056 3 1017072179600896 129066 10 -21969952674173 129066 22 171598974709715 129066 23 7535693767241339 129066 4 -6379169432491709 129066 9 27342961868971 129081 6 1436030042984 129090 2 317783264753323 129090 4 -589735429109 129090 8 6243199938539 129102 3 157007842800731 129105 17 5509808166024 129105 18 7046951559624 129115 15 1584251786587519 129115 1 85987917905687 129115 4 645950445934472 129115 9 -4618809873433 129136 3 -2809505404224 129137 1 24446643577480 129150 25 15330327991875 129150 28 35763491833875 129150 31 49321271077875 129150 3 -33141116759905125 129150 35 -13231134816814125 129150 54 -2358963693194625 129150 59 577438307220375 129150 63 -7117711511625 129150 68 171383213991375 129150 7 -21386603971125 129150 92 19546255209375 129150 93 77452105638375 129150 94 -330936416034197625 129162 14 -266906388736277 129162 25 41422671569215 129162 27 -55555002864953 129162 34 -1705079141342569 129165 5 205564340447 129180 3 150054028177319072 129183 3 132567593145256943 129195 6 18191496448872 129200 15 136902341592000 129200 47 -44602561656000 129200 52 -17216660600000 129206 2 1111363341607 129206 5 -507721995593 129210 10 -4359558841201 129210 4 -2737684840530749570677 129214 3 -652934224032744169 129216 23 18219178238464 129220 6 121037283432064 129234 13 118266938393183 129234 3 111921382745227 129240 7 1309810989627072 129243 2 36546503124520 129255 1 -297855339704 129255 3 1285632977717096 129258 3 790165212144363 129261 6 476509027987783 129270 12 -130092433185931849 129282 7 -31334331199753 129285 18 3370015567866987 129285 21 -327919200417432 129285 3 19572441195528 129285 33 -631806542294616 129286 2 32421382711867 129290 7 -716266958401 129294 15 312997597140087 129294 2 -11592503597781 129294 8 7756964552691 129300 8 -2152818637804000 129310 1 -23286443828797 129314 3 4468172508971 129318 3 3886419874483 129318 4 -295230496335965 129318 9 31556692750519 129340 3 280067836110624 129346 1 -1944697410305 129350 1 -8066512989730125 129354 6 -194884028901937 129360 103 20021093899170112 129360 107 66591846713728 129360 110 -1642585056072128 129360 11 1571431598323552 129360 114 3147873553209952 129360 122 -180691207391744 129360 123 4987832564040256 129360 144 -55730045034944 129360 151 363466695382336 129360 159 -314148444383872 129360 162 -6775404114743488 129360 182 -124669076516141248 129360 193 -358035607792576 129360 194 63550492582976 129360 195 -58370536149184 129360 207 -1119693343593664 129360 29 25490626109699968 129360 3 55116000376192 129360 44 -891703583457344 129360 64 -19502985992896 129360 68 3455995504463936 129360 82 -317291550534784 129360 85 -86942245104064 129360 9 -10075788642752 129363 3 22678165666675 129381 6 214206263144 129390 19 -27149373705585329 129390 2 -8504910336797 129395 1 8230971181672 129402 11 -91204716925197 129402 13 754627067739 129402 24 -145568429984663505 129404 2 369583619729536 129428 2 -2944545193721728 129430 15 317232838805471 129430 19 -10560160050049 129430 20 441963883454239 129444 13 -7971249841120 129450 13 21938590392875 129450 2 -1087262701704125 129456 13 -29645968858848 129456 17 229166194849344 129456 30 1216661925536064 129456 33 4163984670528 129456 56 -10704568969152 129465 11 1677816644694408 129465 13 -5326409100888 129465 4 -2956332823128 129465 6 -62141357210904 129466 3 328653228145391 129470 7 47117343652635039003 129472 46 1977714974670336 129472 71 -1977714974670336 129480 2 148377420514432 129480 29 8529176522996416 129480 35 -34179423190912 129480 38 5404068247616 129480 3 -886280789400128 129480 5 70562154933568 129483 4 277136686440 129486 5 -395151759099217 129493 2 -79796594758392 129495 4 -20818285472773 129507 5 298120832821000 129514 14 -10718180878676265 129514 8 144006323863879 129518 3 -838999450262097 129525 9 50523042095875 129558 13 -457964232038609041 129558 3 4097885174409187 129570 14 -7254502427269 129570 16 -11569198852261 129570 5 2292903040639051 129582 21 -149812077633705 129584 15 -29443110992576 129584 7 -364300701120 129585 2 -6078130303157 129591 16 -584920611721809 129591 25 3102604818511176 129591 4 -3937610110495545 129600 39 -44100994968000 129602 2 -59790178970405 129605 15 2341622720815200648 129605 16 35088980034248 129605 17 -8656128339129208 129605 30 666259731720326079 129618 13 1216970911791 129626 5 -69377270831721 129630 10 24543059821543 129630 20 -1348862205457 129640 1 32197345455808 129658 2 -4078996028865 129670 3 17667925338527 129675 27 -29849538925923625 129675 35 5143617519461000 129685 2 -77632468165144 129690 16 -250428660960861 129690 18 -118160939675457 129690 19 3460316198967 129690 29 36548438352759 129690 6 -2939766991677 129710 7 226712024461643520059 129714 5 1122973201999 129720 5 1884660441508288 129735 11 1609334177747211 129735 19 -43452022799174697 129735 30 -1179003950103789 129744 26 46643994370944 129744 29 85968106132032 129744 30 -44629731041472 129744 49 -909900642568896 129759 2 226472728348537768 129766 5 43173963435131047 129770 5 32445173396899 129774 18 -814046061529 129774 2 1121988622496491 129774 6 2586136039811 129774 7 -2378439440153389 129786 2 2076478802423 129800 2 -35878232600604000 129810 2 -160959063507461 129822 10 -3159507780773 129822 21 155619312479 129822 23 -68392240054884649 129822 26 -6971558616289 129822 4 -121075263357749 129828 4 -7037436144736 129846 15 -25633573409845 129846 30 -15917343217345 129846 32 396380351427119 129846 4 6605058143138731003 129846 8 -14035805986085 129850 15 -135897790853125 129850 18 14824626096352275 129850 35 2818006380791875 129850 37 -186925778754171625 129850 38 2430818901067375 129850 42 -2173748656207625 129850 46 241982149602375 129850 55 544973115901375 129850 57 75567480979375 129850 63 22544051046335 129850 65 46206572934375 129850 73 745595789079215375 129850 79 1853078262044034375 129850 83 -4475321027095625 129850 86 -5402560530740625 129862 1 288137963771 129870 11 200378527109843211 129870 16 -9516000485113173 129870 21 -1080168725241 129870 2 11761012785267 129870 26 60112875847887 129870 29 2754506180583 129870 30 -7421426929994193 129880 4 -2158870555872 129888 16 10382537235456 129888 21 884413346656304448 129888 35 -884413346656304448 129906 7 2437300922954041395 129906 9 -233931299405257413 129930 10 12005145446383 129930 2 -503364841066421 129930 3 -1964447907324101 129940 1 -264164405062752 129942 5 -44688498906753 129948 24 -13377706558048 129948 29 -10605409747571296 129948 35 -28243491812704 129950 16 -1891091613906225 129950 2 -236386451738278125 129950 3 -14777546617125 129954 12 199135447774307 129954 1 256280314917187 129954 17 6507061062929119 129954 2 -16033441450301 129960 13 -14906589873028992 129960 27 15930884533476672 129960 52 271674467603929728 129965 1 2734436198088 129965 3 -105675370813 129974 2 565303908103219 129987 15 2100464312494248 129990 15 -993835885337 129990 26 -1721720838529 129990 27 341830474811279 129990 7 -160474537289053 129996 1 -10886871101102400384 129998 7 104710935193199263 130017 2 -33261134552 130020 8 -116005221685430144 130026 2 1957846699511 130034 2 181276477772967 130034 4 -643945411549 0 0 0 eclib-20250122/libsrc/getcurve.cc000066400000000000000000000056751474421343600164650ustar00rootroot00000000000000// getcurve.cc: implementation of function getcurve() for curve input ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include int getcurve(Curvedata& CD, int verb) { Curve C0; if(verb) cerr << "Enter curve: "; cin>>ws; if(cin.eof()) return 0; // quit if EOF reached cin >> C0; if (verb) cout << endl; if(C0.isnull()) return 0; // quit if null curve entered CD = Curvedata(C0,0); // DON'T change coords if(CD.isnull()) // input curve was singular, non-null { cout<& ai, int verb) { // read the coefficients, either as "a1 a2 a3 a4 a6" or as // "[a1,a2,a3,a4,a6]" using code essentially the same as in // ../qcurves/curve.cc ai.resize(5); if(verb) cerr << "Enter curve: "; cin>>ws; if(cin.eof()) return 0; // quit if EOF reached char c=0; cin.get(c); #ifdef DEBUG_Q_INPUT cout<<"First char read = "<> ai[0] >> c; if(c!=',') { cerr << "syntax error on curve input" << endl; return 0; } cin >> ai[1] >> c; if(c!=',') { cerr << "syntax error on curve input" << endl; return 0; } cin >> ai[2] >> c; if(c!=',') { cerr << "syntax error on curve input" << endl; return 0; } cin >> ai[3] >> c; if(c!=',') { cerr << "syntax error on curve input" << endl; return 0; } cin >> ai[4] >> c; if(c!=']') { cerr << "syntax error on curve input" << endl; return 0; } #ifdef DEBUG_Q_INPUT cout<> ai[0] >> ai[1] >> ai[2] >> ai[3] >> ai[4]; #ifdef DEBUG_Q_INPUT cout< map ZZ_pContextCache; galois_field::galois_field(void) //dummy :q(to_ZZ(2)) { // cout<<"In galois_field constructor, calling default ZZ_p::init(2)"<= zero) return P.height; // already calculated it if (P.is_zero()) {P.height = zero; return zero; } // zero height if torsion if (order(P) > 0) {P.height = zero; return zero; } // zero height if torsion // N.B. So if we ever ask a point its height it will compute its order. // otherwise need to calculate it // The local height at p will only be correctly computed by // pheight() if the curve is minimal at p Curvedata* E = P.E; vector bad_p = getbad_primes(*E); Curvedata Emin; Point Pmin(Emin); // assigns Pmin.E to a pointer to Emin // NB the is_minimal function returns 0 when minimization has not // been done; the curve may still be minimal if (!is_minimal(*E)) { bigint u, r, s, t; Emin = E->minimalize(u,r,s,t); Pmin = transform(P, &Emin, u, r, s, t); bad_p = getbad_primes(Emin); } else { Pmin = P; } // Add local heights at finite primes dividing discr(E) OR denom(P). // The components for primes dividing denom(P) add to log(denom(x(P))); // since P=(XZ:Y:Z^3), denom(P)=Z=gcd(XZ,Z^3), called "zroot" here, // and so the contribution is log(denom(x(P))) = 2*log(zroot). // This avoids factorizing the denominator. const bigint& zroot = gcd(Pmin.getX(),Pmin.getZ()); // = cube root of Z bigfloat h = realheight(Pmin); #ifdef DEBUG_HEIGHT cout<<" - real height = "<getai(a1,a2,a3,a4,a6); P.E->getbi(b2,b4,b6,b8); P.E->getci(c4,c6); discr = getdiscr(*(P.E)); long n = val(pr, discr); #ifdef DEBUG_HEIGHT cout<<"n = val(pr, discr) = " << n << endl; #endif bigint x,y,z; P.getcoordinates(x,y,z); const bigint& zroot = gcd(x,z); // = cube root of z long vpz = 3*val(pr,zroot); #ifdef DEBUG_HEIGHT cout<<"vpz = val(pr, z) = " << vpz << endl; #endif const bigint& x2 = x*x; const bigint& z2 = z*z; const bigint& xz = x*z; const bigint& yz = y*z; long a = val(pr, 3*x2 + 2*a2*xz + a4*z2 - a1*yz) - 2*vpz; long b = val(pr, 2*y + a1*x + a3*z) - vpz; long c = val(pr, 3*x2*x2 + b2*x2*xz + 3*b4*x2*z2 + 3*b6*xz*z2 + b8*z2*z2) -4*vpz; #ifdef DEBUG_HEIGHT cout<<"a = " << a << endl; cout<<"b = " << b << endl; cout<<"c = " << c << endl; #endif // some obvious changes enable calculation of lambda as a rational // some improvements can be made if this is never to be done // eg in the above, no need to work with projective coords, just use real x/z bigfloat halfn = to_bigfloat(n); halfn /= to_bigfloat(2); bigfloat lambda; if ( (a<=0) || (b<=0) ) { lambda = vpz - val(pr,x); if(lambda<0) lambda=0; } else if ( ndiv(pr, c4) ) { bigfloat m = to_bigfloat(b); if(halfn=(3*b) ) lambda = (-2*b) / to_bigfloat(3); else lambda = -c / to_bigfloat(4); bigfloat h = lambda * log( I2bigfloat(pr) ); #ifdef DEBUG_HEIGHT cout<<"...returning lambda = " << lambda << ", pheight = "<getbi(bb2,bb4,bb6,bb8); bigfloat b2 = I2bigfloat(bb2), b4 = I2bigfloat(bb4), b6 = I2bigfloat(bb6), b8 = I2bigfloat(bb8); bigfloat b2dash = b2 - 12; bigfloat b4dash = b4 - b2 + 6; bigfloat b6dash = b6 - 2*b4 + b2 - 4; bigfloat b8dash = b8 - 3*b6 + 3*b4 - b2 + 3; #ifdef DEBUG_HEIGHT cout<<"b2, b4, b6, b8 = "<H) H=t; t=2*abs(b4); if(t>H) H=t; t=2*abs(b6); if(t>H) H=t; t=abs(b8); if(t>H) H=t; // NB We use decimal precision here since the formula for nlim (from // Silverman) is given in terms of decimal places required. long precision = decimal_precision(); #ifdef DEBUG_HEIGHT cout<<"decimal precision = "<& P) // nb not const; sets heights when found { #ifdef DEBUG_REG cout<<"In regulator with PointArray = " << P << endl; #endif int n = P.size(); if( n <= 0) return to_bigfloat(1); if(n == 1) return height(P[0]) ; if(n == 2 ) { bigfloat pair00 = height(P[0]); bigfloat pair11 = height(P[1]); Point Q = P[0] + P[1]; bigfloat h = height(Q); bigfloat pair01 = (h-pair00-pair11)/2; return pair00 * pair11 - pair01 * pair01; } #ifdef MPFP // use NTL to compute the determinant // initialize the matrix of pairings mat_RR height_matrix; height_matrix.SetDims(n,n); for (int i = 0; i < n; i++) { height_matrix[i][i] = height(P[i]) ; } for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { Point Q = P[i] + P[j]; bigfloat h = (height(Q) - height_matrix[i][i] - height_matrix[j][j])/2 ; height_matrix[j][i] = h; height_matrix[i][j] = h; } } return determinant(height_matrix); #else // use a naive determinant method if (n == 3) { bigfloat pair[3][3] ; for (int i = 0; i < 3; i++) {pair[i][i] = height(P[i]) ; for (int j = i + 1; j < 3; j++) {pair[i][j] = pair[j][i] = height_pairing(P[i], P[j]) ; } } bigfloat reg = (pair[0][0] * ( pair[1][1] * pair[2][2] - pair[1][2] * pair[1][2] ) - pair[0][1] * ( pair[0][1] * pair[2][2] - pair[1][2] * pair[0][2] ) + pair[0][2] * ( pair[0][1] * pair[1][2] - pair[1][1] * pair[0][2] ) ); #ifdef DEBUG_REG cout<<"regulator = " << reg << endl; #endif return reg; } if (n == 4) { bigfloat pair[4][4] ; for (int i = 0; i < 4; i++) {pair[i][i] = height(P[i]) ; for (int j = i + 1; j < 4; j++) {pair[i][j] = height_pairing(P[i], P[j]) ; } } // // the following explicit expression is courtesy of Maple and AB // (Maple uses **2, we converted these into explicit squares) // // it purports to be the expression for the determinant of our symmetric // pairing matrix // bigfloat reg = ( ((2 * pair[1][2] * pair[3][3]-2* pair[1][3] *pair[2][3])*pair[0][1]+ (-pair[1][1]*pair[3][3]+pair[1][3]*pair[1][3])*pair[0][2]) * pair[0][2]+pair[0][0] *(pair[1][1]*pair[2][2]*pair[3][3] - pair[1][1]*pair[2][3]*pair[2][3]-pair[1][2]*pair[1][2]*pair[3][3] + 2*pair[1][2]*pair[1][3]*pair[2][3]-pair[1][3]*pair[1][3]*pair[2][2]) + (-pair[2][2]*pair[3][3]+pair[2][3]*pair[2][3])*pair[0][1]*pair[0][1] + ((2*pair[1][3]*pair[2][2]-2*pair[1][2]*pair[2][3])*pair[0][1] + (2*pair[1][1]*pair[2][3]-2*pair[1][3]*pair[1][2])*pair[0][2] + (-pair[1][1]*pair[2][2]+pair[1][2]*pair[1][2])*pair[0][3]) *pair[0][3] ); return reg; } if ( n > MAX_RANK_REG) { // n> 50 not yet (could fold into last case) cout << "## Assuming that the regulator of more than "< #include //#define DEBUG_HILBERT // In all the functions below, the value of the Hilbert symbol is 0 or // 1 (as an int) rather than +1 or -1, for efficiency; int local_hilbert(const bigint& a, const bigint& b, const bigint& p) { static const bigint zero(0); static const bigint two(2); long alpha, beta; bigint u,v; int ans; if(is_zero(a)) {cout<<"Error in local_hilbert(): a==0\n"; return -1;} if(is_zero(b)) {cout<<"Error in local_hilbert(): b==0\n"; return -1;} if(is_zero(p)||is_negative(p)) // p=0 or p=-1 mean the infinite prime { if(is_positive(a)) return 0; if(is_positive(b)) return 0; return 1; } u=a; alpha = divide_out(u,p)%2; // so a=u*p^alpha *square v=b; beta = divide_out(v,p)%2; // so b=v*p^beta *square if(p==two) { // ans = eps4(u)&eps4(v); ans = ((u+1)%4==0); if(ans) ans = ((v+1)%4==0); if(alpha) if(omega8(v)) ans=!ans; if(beta) if(omega8(u)) ans=!ans; return ans; } // now p is odd ans = alphaβ if(ans) ans = ((p+1)%4==0); if(alpha) if(legendre(v,p)==-1) ans=!ans; if(beta) if(legendre(u,p)==-1) ans=!ans; return ans; } int global_hilbert(const bigint& a, const bigint& b, const vector& plist, bigint& badp) { #ifdef DEBUG_HILBERT cout<<"In global_hilbert("< plist=vector_union(pdivs(a),pdivs(b)); return global_hilbert(a,b,plist,badp); } int global_hilbert(const quadratic& q, const bigint& d, bigint& badp) { bigint D = q.disc(); vector plist = vector_union(pdivs(D),pdivs(d)); return global_hilbert(q[0]*d,D,plist,badp); } int global_hilbert(const quadratic& q, const bigint& d, const vector& plist, bigint& badp) { return global_hilbert(q[0]*d,q.disc(),plist,badp); } eclib-20250122/libsrc/homspace.cc000066400000000000000000001312431474421343600164270ustar00rootroot00000000000000// FILE HOMSPACE.CC: Implemention of class homspace ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #define USE_SMATS // Warning: no longer testing without this switched on! #include #include #include #ifdef USE_SMATS #include #endif const string W_opname("W"); const string T_opname("T"); matop::matop(long a, long b, long c, long d) { mats.push_back(mat22(a,b,c,d)); } matop::matop(long p, long n) { if (p==n) { mats.push_back(mat22(0,-1,n,0)); return; } if ((n%p)==0) // W involution, 1 term { long u,v,a,b; for (u=1, v=n; v%p==0; v/=p, u*=p) ; bezout(u,v,a,b); mats.push_back(mat22(u*a,-b,n,u)); return; } // else Hecke operator, p+1 terms { mats.resize(p+1); long j, p2 = p>>1; for (j=0; j check(nsymb, 0); vector gens(nsymb+1); // N.B. Start of gens array is at 1 not 0 vector rel(4); // 2-term relations: if (plusflag!=0) for (j=0; j1) cout << "Relation: " << rel[0]<<" "<1) cout << "gens["<1) { cout << "gens = "; for (i=1; i<=ngens; i++) cout << gens[i] << " "; cout << "\n"; cout << "coordindex = " << coordindex << "\n"; }} // // 3-term relations // long maxnumrel = 20+(2*ngens)/3; long maxnumrel = ngens+10; if (verbose) { cout << "ngens = "<1) cout << "Relation: " << rel[0]<<" "< "; for (j=0; j<3; j++) {ij = rel[j]; check[ij] = 1; if (plusflag) check[rof(ij)] = 1; fix = coordindex[ij]; #ifdef USE_SMATS if(fix) newrel.add(abs(fix),(fix>0?1:-1)); #else if (verbose>1) cout << fix << " "; if (fix!=0) newrel[abs(fix)] += sign(fix); #endif } #ifdef USE_SMATS if(verbose>1) cout<1) cout<<"\n"; #endif #ifdef USE_SMATS if(newrel.size()!=0) { numrel++; make_primitive(newrel); if(numrel<=maxnumrel) relmat.setrow(numrel,newrel); else cout<<"Too many 3-term relations (numrel="<1) cout << newrel << "\n"; long h = content(newrel); if (h!=0) { if (h>1) newrel/=h; if(numrel1) cout << "relmat = " << relmat.as_mat().slice(numrel,ngens) << endl; cout << "Computing kernel..."<-3; j-=2) { rational c = (j==1 ? m.beta() : m.alpha()); if (plusflag==-1) k = cusps.index_1(c); //adds automatically if new, ignores if [c]=[-c] else k = cusps.index(c); //adds automatically if new } } ncusps=cusps.count(); if(verbose) { cout << "ncusps = " << ncusps << endl; if(verbose>1) {cusps.display(); cout<-3; j-=2) { rational c = (j==1 ? m.beta() : m.alpha()); if (plusflag==-1) k = cusps.index_1(c); else k = cusps.index(c); if (k>0) deltamat(k,i+1) += j; if (k<0) deltamat(-k,i+1) -= j; } } if (verbose) { cout << "delta matrix done: size "<1) cout<<"deltamat = "<1) cout<<"tkernbas = "<0) { if (verbose>1) cout << "Freemods:\n"; for (i=0; i1) { cout << i << ": " << freemods[i]; if (!needed[i]) cout << " (not needed)"; cout << "\n"; } } if ((verbose>1)&&cuspidal) { cout << "Basis of ker(delta):\n"; cout << kern.bas().as_mat()<0) ans[i] = v*coord_vecs[j]; else if (j<0) ans[i] = -v*coord_vecs[-j]; } // cout<<"returning "<0) return coord_vecs[i]; if (i<0) return -coord_vecs[-i]; return zero_coords(); } vec homspace::proj_coords_from_index(int ind, const mat& m) const { long i= coordindex[ind]; if (i>0) return m.row(i); if (i<0) return -m.row(-i); return vec(m.ncols()); } long homspace::nfproj_coords_from_index(int ind, const vec& bas) const { long i= coordindex[ind]; if (i>0) return bas[i]; if (i<0) return -bas[-i]; return 0; } svec homspace::coords(const symb& s) const { return coords_from_index(index(s)); } void homspace::add_coords(svec& v, const symb& s) const { v += coords_from_index(index(s)); } svec homspace::coords_cd(long c, long d) const { return coords_from_index(index2(c,d)); } void homspace::add_coords_cd(svec& v, long c, long d) const { v += coords_from_index(index2(c,d)); } vec homspace::proj_coords_cd(long c, long d, const mat& m) const { return proj_coords_from_index(index2(c,d), m); } void homspace::add_proj_coords_cd(vec& v, long c, long d, const mat& m) const { long n = coordindex[index2(c,d)]; if (n>0) v.add_row(m,n); else if (n<0) v.sub_row(m,-n); } long homspace::nfproj_coords_cd(long c, long d, const vec& bas) const { return nfproj_coords_from_index(index2(c,d), bas); } void homspace::add_nfproj_coords_cd(long& a, long c, long d, const vec& bas) const { a += nfproj_coords_from_index(index2(c,d), bas); } svec homspace::coords(long nn, long dd) const { svec ans = zero_coords(); add_coords(ans, nn, dd); return ans; } svec homspace::coords(const modsym& m) const { svec ans = zero_coords(); add_coords(ans, m); return ans; } void homspace::add_coords(svec& vv, const modsym& m) const { rational al = m.alpha(), be=m.beta(); long a=num(be), b=num(al), c=den(be), d=den(al), u, v; long de = a*d-b*c; if (de<0) {de=-de; b=-b; d=-d;} if (de==1) { add_coords_cd(vv, c, d); return; } // now de>1 bezout(a,c, u,v); // =1 long nu = b*u+v*d; // // now m = M{0,infinity} = U.{nu/de,infinity} where U=[a,-v;c,u], so // we find the CF expansion of nu/de. // long C=c, D=u, r=nu, s=de; while (s) { long t=s; s=mod(r,s); long q=(r-s)/t; r=-t; long e=D; D=-C; C= q*C+e; add_coords_cd(vv, -D, C); } } vec homspace::proj_coords(long nn, long dd, const mat& m) const { vec ans = vec(m.ncols()); add_proj_coords(ans, nn, dd, m); return ans; } long homspace::nfproj_coords(long nn, long dd, const vec& bas) const { long ans = 0; add_nfproj_coords(ans, nn, dd, bas); return ans; } void homspace::add_coords(svec& v, long nn, long dd) const { add_coords_cd(v,0,1); long c=0, d=1, a=nn, b=dd; while (b) { long f=b; b=mod(a,b); long q=(a-b)/f; a= -f; long e=d; d=-c; c=q*c+e; add_coords_cd(v,c,d); } } void homspace::add_proj_coords(vec& v, long nn, long dd, const mat& m) const { add_proj_coords_cd(v,0,1,m); long c=0, d=1, a=nn, b=dd; while (b) { long f=b; b=mod(a,b); long q=(a-b)/f; a= -f; long e=d; d=-c; c=q*c+e; add_proj_coords_cd(v,c,d,m); } } void homspace::add_nfproj_coords(long& aa, long nn, long dd, const vec& bas) const { add_nfproj_coords_cd(aa,0,1,bas); long c=0, d=1, a=nn, b=dd; while (b) { long f=b; b=mod(a,b); long q=(a-b)/f; a= -f; long e=d; d=-c; c=q*c+e; add_nfproj_coords_cd(aa,c,d,bas); } } svec homspace::applyop(const matop& mlist, const rational& q) const { svec ans(rk); long i=mlist.size(); while (i--) add_coords(ans,mlist[i](q)); return ans; } svec homspace::applyop(const matop& mlist, const modsym& m) const { svec ans(rk); long i=mlist.size(); while (i--) ans += coords((mlist[i])(m)); return ans; } // copy of routine from ../procs/xsplit.cc: mat sparse_restrict(const mat& m, const subspace& s); smat restrict_mat(const smat& m, const subspace& s); mat homspace::calcop_restricted(string opname, long p, const matop& mlist, const subspace& s, int dual, int display) const { long d=dim(s); mat m(d,rk); for (long j=0; j=nap)) { cerr<<"Error in homspace::opmat_col(): called with i = " << i << endl; return vec(dimension); // shouldn't happen } long p = op_prime(i); if(v) { cout<<"Computing col "<=nap)) { cerr<<"Error in homspace::opmat_cols(): called with i = " << i << endl; return mat(d,rk); // shouldn't happen } long p = op_prime(i); if(v) { cout<<"Computing "<=nap)) { cerr<<"Error in homspace::opmat_col(): called with i = " << i << endl; return svec(dimension); // shouldn't happen } long p = op_prime(i); if(v) { cout<<"Computing col "<=nap)) { cerr<<"Error in homspace::opmat_col(): called with i = " << i << endl; return smat(d,rk); // shouldn't happen } long p = op_prime(i); if(v) { cout<<"Computing "<=nap)) { cerr<<"Error in homspace::s_opmat(): called with i = " << i << endl; return smat(dimension); // shouldn't happen } long p = op_prime(i); if(v) { cout<<"Computing " << ((::divides(p,modulus)) ? W_opname : T_opname) <<"("<=nap)) { cerr<<"Error in homspace::opmat_restricted(): called with i = " << i << endl; return mat(dim(s)); // shouldn't happen } long p = op_prime(i); if(v) { cout<<"Computing " << ((::divides(p,modulus)) ? W_opname : T_opname) <<"("<

=nap)) { cerr<<"Error in homspace::s_opmat_restricted(): called with i = " << i << endl; return smat(dim(s)); // shouldn't happen } long p = op_prime(i); if(v) { cout<<"Computing " << ((::divides(p,modulus)) ? W_opname : T_opname) <<"("<

2)); // Automatically chooses W or T cout<<"done."< T_eigrange(long p) { vector ans; ans.push_back(0); long aplim=1; while (aplim*aplim<=4*p) aplim++; aplim--; for(long ap=1; ap<=aplim; ap++) { ans.push_back(ap); ans.push_back(-ap); } return ans; } #else // new eig order, in strict numerical order static long pm1[]={-1,1}; vector T_eigrange(long p) { long aplim=3, four_p=p<<2; while (aplim*aplim<=four_p) aplim++; aplim--; vector ans(1+2*aplim); iota(ans.begin(),ans.end(),-aplim); return ans; } #endif vector homspace::eigrange(long i) { if((i<0)||(i>=nap)) return vector(0); // shouldn't happen long p = op_prime(i); if(::divides(p,modulus)) return vector(pm1,pm1+2); return T_eigrange(p); } vec homspace::maninvector(long p) const { svec tvec = coords(0,p); // =0, but sets the right length. if (plusflag!=-1) { if (p==2) add_coords(tvec,1,2); else { long p2=(p-1)>>1; for (int i=1; i<=p2; i++) { add_coords(tvec,i,p); } if(plusflag) tvec *=2; else for (int i=1; i<=p2; i++) { add_coords(tvec,-i,p); } } } if(cuspidal) return cuspidalpart(tvec.as_vec()); else return tvec.as_vec(); } vec homspace::manintwist(long p) const { svec sum = coords(0,p); // =0, but sets the right length. for (long i=1; i>1; for (i=1; i<=p2; i++) { add_proj_coords(tvec,i,p); } if(plusflag) tvec *=2; else for (i=1; i<=p2; i++) { add_proj_coords(tvec,-i,p); } } return tvec; } vec homspace::projmaninvector(long p, const mat& m) const { long i,p2; vec tvec = proj_coords(0,p,m); // =0, but sets the right length. if (plusflag==-1) return tvec; if (p==2) add_proj_coords(tvec,1,2,m); else { p2=(p-1)>>1; for (i=1; i<=p2; i++) { add_proj_coords(tvec,i,p,m); } if(plusflag) tvec *=2; else for (i=1; i<=p2; i++) { add_proj_coords(tvec,-i,p,m); } } return tvec; } vec homspace::newhecke(long p, long n, long d) const // Will only work after "proj" { vec tvec = proj_coords(p*n,d); // cout<<"newhecke starts: tvec = "<>1, dp = d*p, k; for (k=1+p2-p; k<=p2; k++) { add_proj_coords(tvec,n+d*k,dp); // cout<<"tvec = "<0"<0) htc = -log(dv)/3; else { cerr<<"Precision problem in cps_real(): dv = "<0"<0) htc = -log(mindv)/3; else { cerr<<"Precision problem in cps_real(): min(dv,dvd) = "<0"<max_search_bound) { cout<<"\n***Warning: search bound of "<hcx) lambda=hcx; if(verbose) cout<<"Using lambda = "<1)); bigcomplex c1(I2bigfloat(c[2])), c2(I2bigfloat(c[1])), c3(I2bigfloat(c[0])); vector roots=solvecubic(c1,c2,c3); // cout<<"solvecubic("< bnd(3); int nrr=order_real_roots(bnd,roots); s.set_intervals(bnd,nrr,1); s.search(); } //#define debugLB /////////////////////////////////////////////////////////////////////// // // class Interval represents a closed interval [lh,rh] where either // empty=1; or empty=0 and lh <= rh; flags rhinf, lhinf denote // rh=infty and lh=-infty resp. // /////////////////////////////////////////////////////////////////////// ostream& operator<< (ostream& os, const Interval& I) { if(I.empty) os<<"[]"; else { os<<"["; if(I.lhinf) os << "-infty"; else os << I.lh; os << ","; if(I.rhinf) os << "+infty"; else os << I.rh; os << "]"; } return os; } void Interval::intersect(const Interval& I) { if(empty) return; if(I.empty) {empty=1; return;} if(lhinf) { lhinf=I.lhinf; lh=I.lh; } else if(!I.lhinf) lh=max(lh,I.lh); if(rhinf) { rhinf=I.rhinf; rh=I.rh; } else if(!I.rhinf) rh=min(rh,I.rh); if((!lhinf)&&(!rhinf)&&(lh>rh)) empty=1; } vector intersect(const vector& L1, const vector& L2) { vector ans; for( const auto& I : L1) for( const auto& J : L2) { Interval K = intersect(I,J); if(!K.is_empty()) ans.push_back(K); } return ans; } /////////////////////////////////////////////////////////////////////// // // class Interval01 represents a closed subinterval [lh,rh] of [0,1], // where either empty=1; or empty=0 and lh <= rh. // /////////////////////////////////////////////////////////////////////// ostream& operator<< (ostream& os, const Interval01& I) { if(I.empty) os<<"[]"; else os<<"[" << I.lh << "," << I.rh << "]"; return os; } void Interval01::intersect(const Interval01& I) { if(empty) return; if(I.empty) {empty=1; return;} lh=max(lh,I.lh); rh=min(rh,I.rh); empty=(lh>rh); } vector intersect(const vector& L1, const vector& L2) { vector ans; for( const auto& I : L1) for( const auto& J : L2) { Interval01 K = intersect(I,J); if(!K.is_empty()) ans.push_back(K); } return ans; } Interval01 operator/(const Interval01& I, const long n) { if(I.empty) return I; return Interval01(I.lh/to_bigfloat(n),I.rh/to_bigfloat(n)); } Interval01 operator+(const Interval01& I, const bigfloat& shift) { if(I.empty) return I; return Interval01(I.lh+shift,I.rh+shift); } //////////////////////////// // // Local exponent function // //////////////////////////// // returns the exponent of the reduction of CD mod p (i.e. of // E^0(Qp)/E^1(Qp), or of E^ns(F_p)) // // NB for good reduction and p>3 we can use the curvemodqbasis class, // but that is not implemented for p=2, 3. We also need special code // for bad reduction. long exponent(CurveRed& CR, long p) { bigint pp(p); int ord_p_N = getord_p_N(CR, pp); if (ord_p_N>1) // additive reduction, cyclic of order p { return p; } if (ord_p_N==1) // multiplicative reduction, cyclic: // order p-1 if split, i.e. root number -1 // order p+1 if split, i.e. root number +1 { return p + LocalRootNumber(CR, pp); } // good reduction if (p>3) { curvemodqbasis Emodq(CR,pp); return I2long(Emodq.get_exponent()); } // now p=2 or 3 int np = 1 + p - I2long(Trace_Frob(CR,pp)); if (p==2 || np!=4) return np; // exponent=order // Now p==3, and order=4, test whether we have full 2-torsion // The b-invariants are (0, 2, _, 2) for C4 and (0,1,0,2) for // C2xC2; so looking at b4 suffices: return ((posmod(getb4(CR),3)==1)? 2 : 4); } /////////////////////////////////////////////////////////////////////// // // Implementation of class CurveHeightConst // /////////////////////////////////////////////////////////////////////// CurveHeightConst::CurveHeightConst(CurveRed& CR) : CurveRed(CR), Cperiods(CR) { c = to_bigfloat(egr_height_constant(*this)); // =-log(alpha) in ANTS7 e3 = get_e3(); n_max=10; #ifdef debugLB cout<<"e3 = "< CurveHeightConst::canonicalHeightInterval01(const bigfloat& target, long k) { vector solution; solution.push_back(Interval01(to_bigfloat(0.5),to_bigfloat(1))); // i.e. image of [e3,+infty] under psi #ifdef debugLB cout<<"testing target bound "< CurveHeightConst::solveLEQ01(long n, const bigfloat& B) { #ifdef debugLB cout<<"solveLEQ01("< ans; if(B < e3) return ans; #ifdef debugLB cout<<"B = "<= B vector CurveHeightConst::solveGEQ01(long n, const bigfloat& B) { if(B <= e3) { vector ans; ans.push_back(Interval01()); // i.e.[0,1] return ans; } vector ans; bigfloat x0=psi(B); bigfloat oneovern = to_bigfloat(1)/to_bigfloat(n); Interval01 I(to_bigfloat(0),1-x0); I=I/n; for(int i=0; i CurveHeightConst::ordinates(const bigfloat& x) { vector ans; static const bigfloat four=to_bigfloat(4), two=to_bigfloat(2); bigfloat d = ((four*x+I2bigfloat(b2))*x+(two*I2bigfloat(b4)))*x+I2bigfloat(b6); if(d<0) return ans; bigfloat y = -(I2bigfloat(a1)*x+I2bigfloat(a3))/two; if(d==0) {ans.push_back(y); return ans;} d=sqrt(d)/two; // positive ans.push_back(d+y); // the larger value ans.push_back(-d+y); // the smaller value return ans; } // elliptic log function (called psi in the paper) with domain // [e3,infty], codomain [0.5,1] bigfloat CurveHeightConst::psi(const bigfloat& x) { if(x& b, vector>& lambda, const vector& d) { #ifdef TRACE_LLL cout<<"R"<(0.25 * (l - 3)); n = 1 + static_cast(3.591 * x); a=x; log(u, a); if (sign(u) > 0) u=-u; a=u; v=b=to_bigfloat(1); for (k = 1; k <= n; k++) { mul(b, b, x); mul(b, b, x); div(b, b, (k * k)); mul(a, a, x); mul(a, a, x); div(a, a, k); add(c, a, b); div(a, c, k); add(u, u, a); add(v, v, b); } RR::SetPrecision(l); div(y, u, v); } long prec() {return RR::precision();} void setprec(long p) { RR::SetPrecision(p);} RR atan(const RR& x) // translated from LiDIA { long i, j, ex, t = prec(); // t stores input precision for restoring later long m, u, f; RR y; if (IsZero(x)) // atan(0)=0 return to_RR(0); ex = x.exponent() + t; if (ex > t) setprec(ex + NTL_BITS_PER_LONG - ex % NTL_BITS_PER_LONG); RR a=to_RR(1); RR tmp(x); m = 0; if (sign(tmp)<0) // compute atan(|x|) and negate later { m = 1; tmp=-tmp; } if (compare(tmp,a) == 0) // atan(1)-Pi/4 { y=Pi()/to_RR(4); if (m) NTL::negate(y,y); setprec(t); return y; } ex = tmp.exponent() + prec(); u = 0; if (ex > 0) { inv(tmp, tmp); u = 1; } ex = tmp.exponent() + prec(); f = 0; RR q(tmp); if (ex > -10) while (tmp.exponent() + prec() > -10) { mul(q, q, tmp); add(q, q, a); SqrRoot(q, q); add(q, q, a); div(tmp, tmp, q); q=tmp; f++; } power(a, tmp, 2); ex = tmp.exponent() + prec(); if (ex < 0) ex = -ex; ex <<= 1; j = prec() / ex; if (j & 1) j++; y = inv(to_RR(2 * j + 1)); setprec(4 * ex); for (i = j; i >= 1; i--) { mul(y, y, a); q=inv(to_RR(2 * i - 1)); setprec(prec() + 2 * ex); if (prec() > t) setprec(t); NTL::negate(y,y); add(y, y, q); } setprec(t); mul(y, y, tmp); y*=power2_RR(f); if (u) { a=Pi()/to_RR(2); sub(y, y, a); NTL::negate(y,y); } if (m) NTL::negate(y,y); return y; } RR asin (const RR & x) { if (sign(x-1) == 0) return Pi()/2; if (sign(x+1) == 0) return -Pi()/2; RR t = 1-x*x; if (sign(t)<0) { cout<<"asin called with arguments "< 1"<>(istream& is, bigcomplex& z) { RR r, i; char c; is >> c; if (c == '(') { is >> r >> c; if (c == ',') { is >> i >> c; if (c == ')') z = bigcomplex(r, i); else is.setstate(ios_base::failbit); } else if (c == ')') z = bigcomplex(r, to_RR(0)); else is.setstate(ios_base::failbit); } else { is.putback(c); is >> r; z = bigcomplex(r, to_RR(0)); } return is; } // return value is 1 for success, else 0 int longify(const bigfloat& x, long& a, int rounding) { bigint z = (rounding==0? RoundToZZ(x): (rounding==1? CeilToZZ(x): FloorToZZ(x))); if(!is_long(z)) { cerr<<"Attempt to convert "<0, up if x<0 { if ((x<=MAXLONG)&&(x>=MINLONG)) { if (x>0) { switch(rounding) { case 0: // round to nearest default: a = (long)(x+0.5); return 1; case 1: // round up a = - (long)(-x+0.5); return 1; case -1: // round down a = (long)x; return 1; } } else { switch(rounding) { case 0: // round to nearest default: a = - (long)(-x+0.5); return 1; case 1: // round up a = (long)x; return 1; case -1: // round down a = (long)(x-0.5); return 1; } } } else { cerr<<"Attempt to convert "< #include #define DEBUG #ifdef MPFP #define EPS1 0.0001 #else #define EPS1 0.1 // slower than 0.001 but doesn't miss so many isogenies // when in ordinary double precision... #endif #define close(x,y,e) (abs((x)-(y))<(e)) vector lisog(const CurveRed& CR, Cperiods& cp, long ell, int verbose) //INPUT: a curve of type CurveRed, so we know its invariants & conductor // the periods of the curve in a Cperiods type // a prime ell (primality not checked) //OUTPUT: an array of the curves isogenous to the given curve (possibly empty) { if(ell==2) return twoisog(CR,verbose); if(ell==3) return threeisog(CR,verbose); bigcomplex x,X,y,Y,z; bigint a1,a2,a3,a4,a6, b2,b4,b6,b8; CR.getai(a1,a2,a3,a4,a6); CR.getbi(b2,b4,b6,b8); bigfloat ra1=I2bigfloat(a1),ra2=I2bigfloat(a2),ra3=I2bigfloat(a3), ra4=I2bigfloat(a4),ra6=I2bigfloat(a6), rb2=I2bigfloat(b2),rb4=I2bigfloat(b4),rb6=I2bigfloat(b6); // b8 isn't used if (verbose>1) cout<<"\nra1: "<2) defined over R vector ans; // other loop variables: bigcomplex t, w, ti, ui; bigint ell1, ad4, ad6, lad4, lad6; bigfloat rad4, rad6; bigfloat xell(to_bigfloat(ell)); static bigfloat two(to_bigfloat(2)); static bigfloat three(to_bigfloat(3)); static bigfloat four(to_bigfloat(4)); static bigfloat five(to_bigfloat(5)); static bigfloat six(to_bigfloat(6)); static bigfloat seven(to_bigfloat(7)); ell1 = ell; bigint ell2 = sqr(ell1); bigint ell3 = ell1*ell2; bigint ell4 = ell2*ell2; bigint ell6 = ell2*ell4; for (subgroup = 1; subgroup <= nsubgroups; subgroup++) { z = (subgroup==1? w1 : (type==1? w1-w2-w2 : w2)) / xell; t = w = to_bigfloat(0); if (verbose>1) cout<<"Subgroup: "<1) cout<<"bigint values are "<0) cout << "Testing curve " << newcurve << endl; Curvedata newCD(newcurve,1); if ((Curve)CR == (Curve)newCD) continue; // cout<<" ## Warning! curve possibly "<1) cout<<"new curve:\n"<<(Curve)newCD<1) cout << "Not close enough\n"; rad4 = rad4*I2bigfloat(ell4); rad6 = rad6*I2bigfloat(ell6); if (verbose>1) cout<<"new a4: "<1) cout<<"bigint values are "<0) cout << "Testing curve " << newcurve << endl; Curvedata newCD(newcurve,1); if ((Curve)CR == (Curve)newCD) cout<<" ## Warning! curve possibly "<1) cout<<"new curve:\n"<<(Curve)newCD<1) cout << "Not close enough\n"; } } // ends for-loop return ans; } int semistable(const CurveRed& CR) { int ans=1; vector plist = getbad_primes(CR); for (const auto& p : plist) if(getord_p_N(CR,p)>1) return 0; return ans; } int comprat(const bigint& n1, const bigint& d1, const bigint& n2, const bigint& d2) { return n1*d2==n2*d1; } vector getelllist(const CurveRed& CR) { static const bigint j11a(-32768); static const bigint j11b(-121); static const bigint j11c(-24729001); static const bigint nj17a(-297756989); static const bigint dj17a(2); static const bigint nj17b(-882216989); static const bigint dj17b(131072); static const bigint j37a(-9317); static const bigint j37b = to_ZZ("-162677523113838677"); static const bigint j19(-884736); static const bigint j43(-884736000); static const bigint j67 = to_ZZ("-147197952000"); static const bigint j163 = to_ZZ("-262537412640768000"); static const bigint one(1); vector ans; ans.reserve(4); ans.push_back(2); ans.push_back(3); ans.push_back(5); ans.push_back(7); bigint N = getconductor(CR); if(!semistable(CR)) { ans.push_back(13); bigint njay=pow(getc4(CR),3); bigint djay=getdiscr(CR); bigint g=gcd(njay,djay); if(!is_one(g)) {njay/=g; djay/=g;} if(djay<0) {djay=-djay; njay=-njay;} // Thanks to Mark Watkins if(is_one(djay)) { if((njay==j11a)||(njay==j11b)||(njay==j11c)) ans.push_back(11); else {if((njay==j37a)||(njay==j37b)) ans.push_back(37); else {if(njay==j19) ans.push_back(19); else {if(njay==j43) ans.push_back(43); else {if(njay==j67) ans.push_back(67); else {if(njay==j163) ans.push_back(163); }}}}} } // end if integral cases else // check with j17a, j17b { if(div(17,N)) if(comprat(njay,djay,nj17a,dj17a)|| comprat(njay,djay,nj17b,dj17b)) ans.push_back(17); } } return ans; } IsogenyClass::IsogenyClass(const CurveRed& C, int verbose) : verb(verbose), cp(Cperiods(C)) { if(verb) { cout << endl; C.output(cout); cout<<"\nPeriod lattice:\n" << cp << endl; } llist = getelllist(C); ss = semistable(C); if(verb) { cout << "Curve is ";if(!ss)cout<<"NOT ";cout<<"semistable."<(MAXNCURVES*MAXNCURVES,0); // initialized to 0 } void IsogenyClass::process(long i) // process i'th curve { vector lworks(nell); // only used when i=0 CurveRed thisc = curves[i]; if (verb) cout << "Working on curve " << i+1 << ": " << (Curve)thisc << endl; Cperiods pers(thisc); long il=0; for (const auto& ell : llist) { if (verb) cout << "trying l = " << ell << "..." << flush; vector lisogcurves = lisog(thisc,pers,ell,verb); if (verb) cout << lisogcurves.size() << " isogenous curves found." << endl; if(i==0) { // cout<<"setting lworks["< goodllist; for(long ii=0; ii1) os << " is "<< isoglist[i-1]<<"-isogenous to curve "< IsogenyClass::getmat() const { vector ans(ncurves*ncurves); long i,j; for(i=0; i twoisog(const CurveRed& CR, int verbose) //INPUT: a curve of type CurveRed //OUTPUT: an array of the curves 2-isogenous to the given curve //(possibly empty) { if(verbose>1) cout<<"In twoisog with CR = "<1) cout<<"In twoisog with CD = "< tt = two_torsion(CD); // include [0:1:0] vector ans; if(tt.size()==1) return ans; bigint a1,a2,a3,a4,a6,b2,b4,b6,b8; CR.getai(a1,a2,a3,a4,a6); CR.getbi(b2,b4,b6,b8); unsigned int i; for(i=1; i0;--k) { k2-=2; double p1=k2*k2+nu2; double ak=-p1*zz/k; s=1+ak*s; t=k2+ak*t; } t/=2.0; double u=s*zf; double v=-(t*zf+u*nu)/n2, q=n2, r=x+x; if(debug) { cout << "Finished k loop. lbin = "<= -1) p1=0.5; double p2=1.0-r/q; if (p1>p2) p1=p2; double c=-p1, d=1, e=u, f=v; long k=1; if(debug) { cout << "...outer loop: p1 = "<lbin); y=u*pow((x/n),nu); } else // x>=n { if(debug) { cout << "In the x>=n case.\n"; } double p2=2*x; double zf=sqrt(PI/p2), zz=1.0/(4*p2), s=1.0; long k2=2*n2+1; for (long k=n2;k>0;--k) { k2-=2; double p1=k2*k2+nu2; double ak=(p1*zz)/k; s=1.0-(ak*s); } y=s*zf; } y/=exp(x); if(debug) { cout << "kbessel returns " << y << endl; } return y; } eclib-20250122/libsrc/lambda.cc000066400000000000000000000130251474421343600160450ustar00rootroot00000000000000// lambda.h Declarations of functions which compute Silverman's ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // finite set Lambda_bad for a curve // N.B. (1) Uses my height normalization, double S's. // (3) Uses the local height normalization WITHOUT the log|Delta| // (2) Intended for use in computing Heegner points (not yet implemented) #include #include #define MAX_NUM_LAMBDA 1000 vector lambda_bad_1(const bigint& p, long kcode, long npd, long& nlambda) { bigfloat logp = log(I2bigfloat(p)), n=to_bigfloat(npd); if((kcode%10)==0) // Type I_m { long i, m = kcode/10; nlambda=1+(m/2); vector ans; ans.reserve(nlambda); for(i=0; i ans; ans.reserve(nlambda); ans.push_back(to_bigfloat(0)); ans.push_back(-logp); ans.push_back(-(1 +m/4)*logp); return ans; } if((kcode==2)||(kcode==7)||(p>3)) { nlambda = 1; vector ans(1,to_bigfloat(0)); return ans; } nlambda = 2; vector ans; ans.reserve(nlambda); ans.push_back(to_bigfloat(0)); long nn = (kcode<5? kcode: kcode+3); ans.push_back( -(nn*logp)/6 ); return ans; } vector lambda_bad(const CurveRed& C, long& nlambda, int verbose) { vector ans; nlambda = 1; ans.push_back(to_bigfloat(0)); bigint discr = getdiscr(C); vector plist = getbad_primes(C); long i, j, nl, nnl; for (const auto& p : plist) { if (ndiv(p*p,discr)) { if(verbose) cout<<"Lambda_bad("< list = lambda_bad_1(p,kcode,npd,nl); if(verbose) { cout << "Lambda_bad("<getbi(b2,b4,b6,b8); bigint d2=d*d; bigint d3=d2*d; bigint e,e2 = ((4*a+b2*d)*a + 2*b4*d2)*a + b6*d3; if(!isqrt(e2,e)) return 0; bigint a1,a2,a3,a4,a6; CD->getai(a1,a2,a3,a4,a6); b = (e-a1*a*c-a3*c*d)/2; *P = Point(CD,a*c,b,c*d); return 1; } int make_point_from_x(Curvedata* CD, const bigfloat& x, long maxdd, Point* P) { static const bigint ten(10); bigint a,b,c,d; //cout<<"In ratapprox2 with x = " << x << endl; bigint x0, x1, x2, y0, y1, y2; bigfloat xx, diff, xc; xx = x; x0 = 0; x1 = 1; y0 = 1; y1 = 0; diff = 1; bigint maxdenom = pow(ten,maxdd); while ( !is_approx_zero(diff) && (y2getbi(b2,b4,b6,b8); bigint d2=d*d; bigint d3=d2*d; bigint e,e2 = ((4*a+b2*d)*a + 2*b4*d2)*a + b6*d3; if(!isqrt(e2,e)) return 0; bigint a1,a2,a3,a4,a6; CD->getai(a1,a2,a3,a4,a6); b = (e-a1*a*c-a3*c*d)/2; *P = Point(CD,a*c,b,c*d); return 1; } int make_point_from_x_and_ht(Curvedata* CD, vector lambdas, const bigfloat& xp, const bigfloat& ht, Point* P) { bigfloat rh = realheight(xp,CD); for (const auto& lam : lambdas) { bigfloat logd = (ht-rh-(lam))/2; bigfloat approxd = exp(logd); bigint xa, xd2, xd = Iround(approxd); if(xd>0) { xd2 = xd*xd; xa = Iround(xp*I2bigfloat(xd2)); if(make_point_from_x(CD,xa,xd2,P)) return 1; } bigint xdx; long id, delta=10; for(id=1;id<=delta;id++) { xdx=xd+delta; if(xdx>0) { xd2 = xd*xd; xa = Iround(xp*I2bigfloat(xd2)); if(make_point_from_x(CD,xa,xd2,P)) return 1; } xdx=xd-delta; if(xdx>0) { xd2 = xd*xd; xa = Iround(xp*I2bigfloat(xd2)); if(make_point_from_x(CD,xa,xd2,P)) return 1; } } } return 0; } eclib-20250122/libsrc/legendre.cc000066400000000000000000001472541474421343600164260ustar00rootroot00000000000000// legendre.cc: implementations of functions for solving legendre equations ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #include #include #include #include //#define DEBUG_MINV //#define DEBUG_LEM1 //#define WATCH_REDUCTION //#define DEBUG_LEGENDRE //#define DEBUG_LEGENDRE_PARAM //#define CHECK_ALL //#define DEBUG_LLL //#define MORDELL_REDUCE // else use JC's reduction via quadratics #ifndef TRACE_HOLZER #define TRACE_HOLZER 0 // =1 for verbose reduction of solutions #endif //#define CHECK_CERTS // define this to check all certificates produced //#define CHECK_LATTICE // define this to check that solutions lie in correct lattice //#define CHECK_INDEX //#define CHECK_CLAIMS //#define REDUCE_INTERMEDIATES // reduces intermediate solutions //#define HOLZER_MEASURES // shows Holzer measure of solutions before/after reduction //#define TL2(nnn) cout<<"Calling lem2() at point "<=n1); while(!reduced) { swap(n1,n2); swap(x,xx); swap(y,yy); dot = c1*x*xx + c2*y*yy; nearest(alpha,dot,n1); reduced = is_zero(alpha); if(!reduced) { xx-=alpha*x; yy-=alpha*y; n2 = c1*sqr(xx) + c2*sqr(yy); } reduced=(n2>=n1); } #ifdef CHECK_ALL #ifdef DEBUG_MINV cout<<"minv called with a=["< 0)) {g= f; f=-e; e=g; return;} if((e< 0)&&(f<=0)) {::negate(e); ::negate(f); return;} if((e>=0)&&(f< 0)) {g=-f; f= e; e=g; return;} return; } // Solve Legendre's equation when ab=1: void lem1plus(const bigint& a, const bigint& b, const bigint& c, const bigint& n, const bigint& p, const bigint& q, bigint& x, bigint& y, bigint& z) { static bigint one, zero; one=1; zero=0; GIgcd(q,one,c,zero,x,y); z=1; if(b==-one) {y=-y;} // So we have qx=-y, qy=x (mod c) #ifdef DEBUG_LEM1 if(!CHECK_LEG(a,b,c,n,p,q,x,y,z)) { cout<<"Wrong solution in lem1plus!\n"; show_all(a,b,c,n,p,q,x,y,z); } #endif // DEBUG_LEM1 return; } // Solve Legendre's equation when ab=-1: // (Trivial solution is (1,1,0), but we want a solution in the correct lattice, // satisfying y=qx (mod c) where q^2=1 (mod c)) // void lem1minus(const bigint& a, const bigint& b, const bigint& c, const bigint& n, const bigint& p, const bigint& q, bigint& x, bigint& y, bigint& z) { #ifdef DEBUG_LEM1 cout<<"lem1minus: ab=-1, c="< factorbase = vector_union(vector_union(pdivs(a),pdivs(b)),pdivs(c)); return legendre_solve(a,b,c,factorbase,x,y,z,use_lll); } int legendre_solve(const bigint& a, const bigint& b, const bigint& c, const vector& factorbase, bigint& x, bigint& y, bigint& z, int use_lll) { #ifdef DEBUG_LEGENDRE cout<<"Starting to solve Legendre equation with coeffs " < apdivs=factorbase, bpdivs=factorbase, cpdivs=factorbase; sqfdecomp(a1,apdivs,a2,a3); yfac*=a3; zfac*=a3; sqfdecomp(b1,bpdivs,b2,b3); xfac*=b3; zfac*=b3; sqfdecomp(c1,cpdivs,c2,c3); xfac*=c3; yfac*=c3; cancel1(xfac,yfac,zfac); #ifdef DEBUG_LEGENDRE cout<<"After squarefree reduction, new coeffs are " <1, so { // we can reduce b with lem2 if(bb>1) { TL2(1) lem2b(a,b,c,n,p,q,bb,x,y,z); return; } } // Now |b| is not a square if(isqrt(absc,cc)) { if(cc>1) // then |c| = cc^2 and we can reduce c with lem2 { TL2(2) lem2c(a,b,c,n,p,q,cc,x,y,z); return; } } // Now |b|, |c| are not squares if(isqrt(absa,aa)) { if(aa>1) // then |a| = aa^2 and we can reduce a with lem2 { TL2(3) lem2a(a,b,c,n,p,q,aa,x,y,z); return; } } // Now |a|, |b|, |c| are all not squares // Sort so that |a|>=|b|>=|c|: int perm; if(absa>absb) { if(absc>absa) perm=4; else {if(absb>absc) perm=0; else perm=1;} } else // absb>absa { if(absa>absc) perm=2; else {if(absc>absb) perm=5; else perm=3;} } switch(perm) { case 0: lem4(a,b,c,n,p,q,x,y,z); break; case 1: lem4(a,c,b,-n,-q,-p,x,z,y); break; case 2: lem4(b,a,c,-p,-n,-q,y,x,z); break; case 3: lem4(b,c,a,p,q,n,y,z,x); break; case 4: lem4(c,a,b,q,n,p,z,x,y); break; case 5: lem4(c,b,a,-q,-p,-n,z,y,x); break; } #ifdef CHECK_ALL CHECK_LEG(a,b,c,n,p,q,x,y,z); #endif // CHECK_ALL } static int permtable[6][4] = {{0,1,2,3}, {0,1,3,2}, {0,2,1,3}, {0,2,3,1}, {0,3,1,2}, {0,3,2,1}}; // Solve Legendre's equation ax^2+by^2+cz^2=0 using Rusin's reduction, // given "certificate" (n,p,q) satisfying a|n^2+bc, b|p^2+ac, c|q^2+ab. // // All this does is sort the coeffs and pass to lem4_1() // int legendre_solve_cert_1(const bigint& a, const bigint& b, const bigint& c, const bigint& n, const bigint& p, const bigint& q, bigint& x, bigint& y, bigint& z, bigint& u) { #ifdef DEBUG_LEGENDRE level++; cout<<"\nLevel "<1, so we return { if(u>1) return 2; } // Now |b| is not a square if(isqrt(absc,u)) // then |c| = u^2 with u>1 and we return { if(u>1) return 3; } // Now |b|, |c| are not squares if(isqrt(absa,u)) // then |a| = u^2 with u>1 and we return { if(u>1) return 1; } // Now |a|, |b|, |c| are all not squares // Sort so that |a|>=|b|>=|c|: int perm, res=-1, newres; if(absa>absb) { if(absc>absa) perm=4; else {if(absb>absc) perm=0; else perm=1;} } else // absb>absa { if(absa>absc) perm=2; else {if(absc>absb) perm=5; else perm=3;} } switch(perm) { case 0: res = lem4_1(a,b,c,n,p,q,x,y,z,u); break; case 1: res = lem4_1(a,c,b,-n,-q,-p,x,z,y,u); break; case 2: res = lem4_1(b,a,c,-p,-n,-q,y,x,z,u); break; case 3: res = lem4_1(b,c,a,p,q,n,y,z,x,u); break; case 4: res = lem4_1(c,a,b,q,n,p,z,x,y,u); break; case 5: res = lem4_1(c,b,a,-q,-p,-n,z,y,x,u); break; } if(res!=-1) {newres=permtable[perm][res];} else newres=res; #ifdef DEBUG_LEGENDRE if(newres!=res) cout<<"Permutation "<1) {cout<<"Input error: a and b not coprime!"<1) {cout<<"Input error: b and c not coprime!"<1) {cout<<"Input error: c and a not coprime!"<0, b>0, c<0) // we may assume a, b, c do not all have the same sign { #ifdef WATCH_REDUCTION verb=1; #endif if(is_positive(a)) { if(is_positive(b)) { conic_mordell_reduce(a,b,c,x0,y0,z0,verb); } else { if(is_positive(c)) { conic_mordell_reduce(a,c,b,x0,z0,y0,verb); } else { conic_mordell_reduce(-c,-b,-a,z0,y0,x0,verb); } } } else { if(is_positive(b)) { if(is_positive(c)) { conic_mordell_reduce(b,c,a,y0,z0,x0,verb); } else { conic_mordell_reduce(-a,-c,-b,x0,z0,y0,verb); } } else { conic_mordell_reduce(-a,-b,-c,x0,y0,z0,verb); } } } // Finds a certificate or returns 0 if none exists: int make_certificate(const bigint& a, const bigint& b, const bigint& c, bigint& n, bigint& p, bigint& q) { if(!sqrt_mod_m(n,-b*c,abs(a))) return 1; if(!sqrt_mod_m(p,-a*c,abs(b))) return 2; if(!sqrt_mod_m(q,-a*b,abs(c))) return 3; return 0; } int make_certificate(const bigint& a, const vector& apdivs, const bigint& b, const vector& bpdivs, const bigint& c, const vector& cpdivs, bigint& n, bigint& p, bigint& q) { if(!sqrt_mod_m(n,-b*c,abs(a),apdivs)) return 1; if(!sqrt_mod_m(p,-a*c,abs(b),bpdivs)) return 2; if(!sqrt_mod_m(q,-a*b,abs(c),cpdivs)) return 3; return 0; } // Check to see if b is congruent to +- c mod a (assumed positive!) // if not, how much to divide a by to ensure that congruence holds? bigint should(const bigint& a, const bigint& b, const bigint& c) { bigint u=gcd(a,b-c); bigint v=gcd(a,b+c); if(u>v) return a/u; else return a/v; } // minv finds shortest vector [xmin,ymin] in lattice generated by // integer vectors a=[a1,a2], b=[b1,b2] // with respect to norm c1*x^2+c2*y^2 (c1, c2>0) // Throughout: [x,y] has norm n1 // [xx,yy] has norm n2 & inner prod = dot. void legendre_via_lll(const bigint& a, const bigint& b, const bigint& c, const bigint& k1, const bigint& k2, const bigint& k3, bigint& x, bigint& y, bigint& z) { int i; bigint g,u,v,adash,bdash,bc=b*c, alpha, beta, gamma; g = bezout(b,c,u,v); if(g!=1) {cout<<"b and c not coprime!\n"; return;} g = bezout(a,bc,adash,bdash); if(g!=1) {cout<<"a and b*c not coprime!\n"; return;} alpha = (c*bdash*k1) % a; beta = (u*adash*b*k3) % bc; gamma = (v*adash*c*k2) % bc; vector vecs(4, vec_m(3)); vecs[0][1] = abs(a); vecs[0][2] = abs(b); vecs[0][3] = abs(c); vecs[1][1] = bc; vecs[1][2] = 0; vecs[1][3] = 0; vecs[2][1] = a*beta; vecs[2][2] = a; vecs[2][3] = 0; vecs[3][1] = alpha*beta+gamma; vecs[3][2] = alpha; vecs[3][3] = 1; #ifdef DEBUG_LLL cout<<"Basis for lattice L:\n"; cout<0, b>0, c<0. void legendre_param(const bigint& a, const bigint& b, const bigint& c, const bigint& x0, const bigint& y0, const bigint& z0, quadratic& qx, quadratic& qy, quadratic& qz) { bigint a1=a, y1=y0, z1=z0, u, v, e; bigint g=abs(gcd(y0,z0)); static bigint zero; zero=0; int scale = (g>1); if(scale) {a1/=sqr(g); y1/=g; z1/=g;} bigint z12=sqr(z1); qx.set( a1*x0, 2*b*y1, -b*x0); qy.set(-a1*y1, 2*a1*x0, b*y1); qz.set( a1*z1, zero, b*z1); #ifdef DEBUG_LEGENDRE_PARAM if(!testparamsol(a1,0,c,-b,qx,qy,qz,0)) cout<<"Parametric solution wrong at (1)\n"; else cout<<"Correct parametrization (1):\n" <0) {qz.reduce(m); qx.transform(m); qy.transform(m);} else { if(a*c>0) {qy.reduce(m); qz.transform(m); qx.transform(m);} else {qx.reduce(m); qy.transform(m); qz.transform(m);} } #ifdef DEBUG_LEGENDRE_PARAM if(!testparamsol(a1,zero,c,-b,qx,qy,qz,0)) cout<<"Parametric solution wrong at (3)\n"; else cout<<"Correct parametrization (3):\n" <0)&&(sc>0)) || ((sa>0)&&(sb<0)&&(sc<0)) ) { which=1; test=b*c; ok=(sqr(x0)<=test); } else { if( ((sb<0)&&(sa>0)&&(sc>0)) || ((sb>0)&&(sa<0)&&(sc<0)) ) { which=2; test=a*c; ok=(sqr(y0)<=test); } else { which=3; test=a*b; ok=(sqr(z0)<=test); } } if(ok) { if(verb) cout<<"...nothing to do, already reduced\n"; return; } quadratic qx, qy, qz; legendre_param(a,b,c,x0,y0,z0,qx,qy,qz); if(verb) { cout<<"Parametrizing quadratics are\n"; cout<=|b|>=|c| and none are squares. If |b|=|c|=1 call lem1 // if((abs(b)==1)) // &&(abs(c)==1)) { lem1(a,b,c,k1,k2,k3,x,y,z); return 0; } w=(k1*invmod(c,a))%a; minv(one,w,zero,a,abs(b),abs(c),w1,w2); t=(b*sqr(w1)+c*sqr(w2))/a; bc=b*c; lem3(t,bc,aa,bb,cc,gamma,alpha); #ifdef DEBUG_LEGENDRE cout<<"w1,w2="<1) {BACK(4,u,2) return 2;} u=gcd(alpha,c); if(u>1) {BACK(5,u,3) return 3;} // From this point alpha=1, // t = aa*cc*gamma^2, // bc = bb*cc. #ifdef CHECK_CLAIMS if(alpha!=1) cout<<"alpha="<1) {BACK(6,u,3) return 3;} // From this point, d1|w1, d1|c #ifdef CHECK_CLAIMS if(!div(d1,w1)) cout<<"d1 ndiv w1\n"; if(!div(d1,c)) cout<<"d1 ndiv c\n"; #endif d2=cc/d1; e=gcd(d2,w2); u=abs(d2/e); if(u>1) {BACK(7,u,2) return 2;} // From this point, d2|w2, d2|b, cc=d1*d2 #ifdef CHECK_CLAIMS if(!div(d2,w2)) cout<<"d2 ndiv w2\n"; if(!div(d2,b)) cout<<"d2 ndiv b\n"; if(cc!=d1*d2) cout<<"Identity 4 fails\n"; #endif d=gcd(b,gamma); e=gcd(d,w2); u=abs(d/e); if(u>1) {BACK(8,u,2) return 2;} if(d>1) {BACK(9,d,2) u=d; return 2;} // From this point, (b,gamma)=1 #ifdef CHECK_CLAIMS if(gcd(b,gamma)!=1) cout<<"(b,gamma) not coprime\n"; #endif d=gcd(c,gamma); e=gcd(d,w1); u=abs(d/e); if(u>1) {BACK(10,u,3) return 3;} if(d>1) {BACK(11,d,3) u=d; return 3;} // From this point, (c,gamma)=1 // Also: (d1,w2)=(d2,w1)=1 #ifdef CHECK_CLAIMS if(gcd(c,gamma)!=1) cout<<"***(c,gamma) not coprime\n"; if(gcd(d1,w2)!=1) cout<<"***(d1,w2) not coprime\n"; if(gcd(d2,w1)!=1) cout<<"***(d2,w1) not coprime\n"; #endif bigint n1, n2, n3, cc1, cc2; bigint m1=c/d1, m2=b/d2; // cout<<"a, gamma, bc = "<1) // we have a square factor of a: reduce { BACK(12,cc1,1) u=cc1; return 1; } if(cc2>1) // we have a square factor of aa: divide it out // and adjust gamma { // cout<<"cc2="<1) { #ifdef DEBUG_LEGENDRE cout<<"**** gammafactor = "<1) {BACK(13,u,3) return 3;} // From this point, d1|w1star #ifdef CHECK_CLAIMS if(!div(d1,w1star)) cout<<"d1 ndiv w1star\n"; #endif e=gcd(d2,w2star); u=abs(d2/e); if(u>1) {BACK(14,u,2) return 2;} // From this point, d2|w2star #ifdef CHECK_CLAIMS if(!div(d2,w2star)) cout<<"d2 ndiv w2star\n"; #endif } // // Now (w1star,gammastar)=(w2star,gammastar)=1 // and (w1star,n2)=(w2star,n2)=1 // and d1|w1star, d2|w2star. // #ifdef CHECK_CLAIMS // cout<<"checking coprimality..."<1) {u=d; return 1;} // since n3|a // now u^2|n2 u2=sqr(u); n2/=u2; aa/=u2; gamma*=u; break; // we will try again... case 2: case 3: d = gcd(u,b); if(d>1) {u=d; return 2;} d = gcd(u,c); if(d>1) {u=d; return 3;} default: return -1; // should not happen } // Now res=0 if we have solution, // =1 if we have adjusted aa and want to try again. } while (res); #ifdef CHECK_ALL if(!CHECK_LEG(aa,bb,cc,k1dash,k2dash,k3dash,x1,y1,z1)) { cout<<" wrong solution for new eqn!\n"; show_all(aa,bb,cc,k1dash,k2dash,k3dash,x1,y1,z1); } #endif // CHECK_ALL #ifdef CHECK_INDEX bigint det_factor=gamma*aa; cout<<"Mapping solution back, reduced det = "<1) cout<<"\t***!!!***"; cout<1) { #ifdef DEBUG_LEGENDRE int divide_ok=1; if(!divide_exact(x,n2,x1)) { cout<<"x="<1) { m1/=d; m2/=d; m3*=d; flag13=flag23=1; } } if(flag13) { d=abs(gcd(m1,m3)); flag13=0; if(d>1) { m1/=d; m2*=d; m3/=d; c1*=d; flag12=flag23=1; } } if(flag23) { d=abs(gcd(m2,m3)); flag23=0; if(d>1) { m1*=d; m2/=d; m3/=d; c2*=d; flag12=flag13=1; } } } #ifdef CHECK_LEM3 if( (a==sqr(c1)*m1*m3) && (b==sqr(c2)*m2*m3) && (gcd(m1,m3)==1) && (gcd(m2,m3)==1) && (gcd(m1,m2)==1) ) {;} else { cout<<"Error in lem3("<=|b|>=|c| and none are squares. If |b|=|c|=1 call lem1 // if(abs(b)==1) { lem1(a,b,c,n,p,q,x,y,z); return; } k=(n*invmod(c,a))%a; minv(one,k,zero,a,abs(b),abs(c),k1,k2); // cout<<"k1,k2="<1) {TL2(4) lem2b(a,b,c,n,p,q,betab,x,y,z); return;} bigint betac=gcd(beta,c); if(betac>1) {TL2(5) lem2c(a,b,c,n,p,q,betac,x,y,z); return;} // From this point beta=1, // t = aa*cc*alpha^2, // bc = bb*cc. #ifdef CHECK_CLAIMS if(beta!=1) cout<<"beta="<1) {TL2(6) lem2c(a,b,c,n,p,q,u,x,y,z); return;} // From this point, d1|k1, d1|c #ifdef CHECK_CLAIMS if(!div(d1,k1)) cout<<"d1 ndiv k1\n"; if(!div(d1,c)) cout<<"d1 ndiv c\n"; #endif d2=cc/d1; e=gcd(d2,k2); u=abs(d2/e); if(u>1) {TL2(7) lem2b(a,b,c,n,p,q,u,x,y,z); return;} // From this point, d2|k2, d2|b, cc=d1*d2 #ifdef CHECK_CLAIMS if(!div(d2,k2)) cout<<"d2 ndiv k2\n"; if(!div(d2,b)) cout<<"d2 ndiv b\n"; if(cc!=d1*d2) cout<<"Identity 4 fails\n"; #endif d=gcd(b,alpha); e=gcd(d,k2); u=abs(d/e); if(u>1) {TL2(8) lem2b(a,b,c,n,p,q,u,x,y,z); return;} if(d>1) {TL2(9) lem2b(a,b,c,n,p,q,d,x,y,z); return;} // From this point, (b,alpha)=1 #ifdef CHECK_CLAIMS if(gcd(b,alpha)!=1) cout<<"(b,alpha) not coprime\n"; #endif d=gcd(c,alpha); e=gcd(d,k1); u=abs(d/e); if(u>1) {TL2(10) lem2c(a,b,c,n,p,q,u,x,y,z); return;} if(d>1) {TL2(11) lem2c(a,b,c,n,p,q,d,x,y,z); return;} // From this point, (c,alpha)=1 // Also: (d1,k2)=(d2,k1)=(k1,alpha)=(k2,alpha)=1 #ifdef CHECK_CLAIMS if(gcd(c,alpha)!=1) cout<<"***(c,alpha) not coprime\n"; if(gcd(d1,k2)!=1) cout<<"***(d1,k2) not coprime\n"; if(gcd(d2,k1)!=1) cout<<"***(d2,k1) not coprime\n"; #endif #define AGREE_PAPER bigint aa1, aa2, aa3, cc1, cc2; bigint m1=c/d1, m2=b/d2, aaa=invmod(a*alpha,bc); // cout<<"a, alpha, bc, aaa = "<1) // we have a square factor of a: reduce { TL2(12) lem2a(a,b,c,n,p,q,cc1,x,y,z); return; } if(cc2>1) // we have a square factor of aa: divide it out // and adjust alpha { // cout<<"cc2="<1) // then d also divides k2 so we can divide it out { k1/=d; k2/=d; alpha/=d; aaa=invmod(a*alpha,bc); } d=gcd(k2,alpha); if(d>1) // then d also divides k1 so we can divide it out { k1/=d; k2/=d; alpha/=d; aaa=invmod(a*alpha,bc); } // Now (k1,alpha)=(k2,alpha)=1 #ifdef CHECK_CLAIMS if(gcd(k1,alpha)!=1) cout<<"***(k1,alpha) not coprime\n"; if(gcd(k2,alpha)!=1) cout<<"***(k2,alpha) not coprime\n"; #endif d=gcd(k1,k2); #ifdef CHECK_CLAIMS if(!div(sqr(d),aa1*aa3*sqr(aa2))) {cout<<"***Identity 9 fails\n"; // cout<<"aa,bb,cc="<1; if(gcd(k1,aa)>1) { #ifdef DEBUG_LEGENDRE cout<<" Special K..."<1) { #ifdef DEBUG_LEGENDRE cout<<" Special K...cc1="<1: square factor of a"<1) { #ifdef DEBUG_LEGENDRE cout<<" Special K...cc2>1"<1) {k1/=d;k2/=d;alpha/=d;} d=gcd(k1,k2); if(d>1) { e=gcd(d,aa3); if(e>1) { #ifdef DEBUG_LEGENDRE cout<<" Special K...first e>1"<1) { #ifdef DEBUG_LEGENDRE cout<<" Special K...second e>1"<1) cout<<"\t***!!!***"; cout<1) { #ifdef DEBUG_LEGENDRE cout<<"Dividing out by factor d="< // We use the pari C library for factoring (via a string interface // defined in parifact.h/cc) #include // for unlink() (not needed on linux) #include #include // Utilities for debugging output -- for example, from gdb you can give the command // p show(a) // to see a where a is a bigint or vector bigint show(const bigint& a) {cout< show(const vector& a) {cout<0, rounded_division(a,b) = q such that a/b = q + r/b with -1/2 <= r/b < 1/2 bigint rounded_division(const bigint& a, const bigint& b) { bigint q, r; DivRem(q,r,a,b); bigint r2 = r<<1; return (r2<-b? q-1: (r2>=b? q+1: q)); } // oddsqrt works on odd n, called by isqrt // //#define oddsqrt(root,n) sqrt(root,n) // builtin //#define oddsqrt(root,n) sqrtq2(root,n) // 2-adic #define oddsqrt(root,n) sqrtnr(root,n) // JC's Newton // 2-adic version of isqrt: int sqrtq2(bigint& root, const bigint& n) { bigint a,r; long a0; ::divides(n,(long)8,r,a0); if(a0!=1) return 0; // odd squares must be 1 mod 8 if(r==1) {a0=3; r=0;} // special case a=a0; // cout<<"odd part 1 mod 8 with quotient r = " << r << endl; bigint twok(8), twok3(1); long kminus1=2; while(r>0) { if(even(r)) { rshift(r,1,r); } else { subx(r,a,r); rshift(r,1,r); subx(r,twok3,r); setbit(a,kminus1); } lshift(twok,1,twok); lshift(twok3,1,twok3); kminus1++; // cout<<"a="< mpdivs = pdivs(m); #ifdef CHECK_SQRT_MOD cout<<"prime factors are "<& mpdivs) { // Some trivial cases require no work: if(is_one(m)) {x=0; return 1;} if(is_zero(a)) {x=0; return 1;} if(is_one(a)) {x=1; return 1;} bigint mm, xp, q; int e; x=0; mm=1; for( const auto& p : mpdivs) { e = val(p,m); if(e==0) continue; if(p==2) {if(!sqrt_mod_2_power(xp,a,e)) return 0;} else {if(!sqrt_mod_p_power(xp,a,p,e)) return 0;} q=pow(p,e); if(p==mpdivs.front()) x=xp; else x=chrem(x,xp,mm,q); mm*=q; } #ifdef CHECK_SQRT_MOD if(ndiv(m,sqr(x)-a)) cout<<"Error in sqrt_mod_m with a="<& bplist, bigint& x) // Solves x^2=a mod b, returns success/fail { // Assumes b square-free, primes factors in bplist bigint u, v, amodp, xmodp, m; x=0; m=1; for( const auto& p : bplist) { if(p==2) { xmodp=odd(a); } else // odd p { amodp = a%p; if(is_zero(amodp)) xmodp=0; else { if(legendre(amodp,p)==-1) return 0; if(amodp<0) amodp+=p; // sqrt_mod_p wants it between 0 and p-1 sqrt_mod_p(xmodp,amodp,p); } } // Now Chinese xmodp with previous (x mod m) bezout(m,p,u,v); x = x*v*p+xmodp*u*m; m*=p; x = mod(x,m); } return 1; } // // bigint divisor lists etc // extra_prime_class the_extra_primes; // The one and only instance void initprimes(const string pfilename, int verb) { if(verb) { cout<<"Computed " << nprimes() << " primes, "; cout << "largest is " << maxprime() << "\n"; } the_extra_primes.read_from_file(pfilename,verb); if(verb) the_extra_primes.show(); } extra_prime_class::~extra_prime_class() { // write_to_file(string("PRIMES").c_str()); } void extra_prime_class::write_to_file(const string pfilename, int verb) { if(the_primes.size()==0) return; if(verb) cout << "writing primes to file " << pfilename << endl; ofstream pfile(pfilename.c_str()); copy(the_primes.begin(),the_primes.end(), ostream_iterator(pfile, "\n")); if(verb) cout << "finished writing primes to file " << pfilename << endl; } void extra_prime_class::read_from_file(const string pfilename, int verb) { ifstream pfile(pfilename.c_str()); if(!pfile) // default: no primes file exists { return; } pfile>>ws; if(pfile.eof()) // primes file exists but is empty { return; } if(verb) cout << "reading primes from file " << pfilename << endl; bigint xp; while(pfile>>xp>>ws, (xp!=0) ) { if(verb) cout << "read extra prime " << xp << endl; the_extra_primes.add(xp); if(pfile.eof()) break; } if(verb) cout << "finished reading primes from file " << pfilename << endl; } // n>0 will be changed; returns prime factors from factor base and divides out from n vector pdivs_use_factorbase(bigint& n, const std::set& factor_base) { vector plist; if(n<2) return plist; for (const auto& p : factor_base) { if (n==1) break; if(divide_out(n,p)) plist.push_back(p); } return plist; } // n>0 will be changed; returns prime factors p pdivs_trial_div(bigint& n, const bigint& pmax) { vector plist; if(n<2) return plist; primevar pr; long p=2, r; bigint mp, q; mp=2; while ( (n>1) && (pr.ok()) && (mp<=pmax)) { if (::divides(n,p,q,r)) // then found a prime factor { plist.push_back(mp); // add it to the list n=q; divide_out(n,mp); // divide it out from n } // Now we might be able to conclude that the cofactor is prime: if(n>1) if (sqr(mp)>n) { plist.push_back(n); the_extra_primes.add(n); n=1; } pr++; p = pr.value(); mp=p; } return plist; } vector pdivs_trial(const bigint& number, int trace) { if(trace) cout<<"In pdivs_trial() with number = " << number << endl; vector plist; bigint n = abs(number), q, mp, mr; if(n<2) return plist; // use prime base first... plist=pdivs_use_factorbase(n,the_extra_primes.the_primes); if(n<2) return plist; if(trace) cout<< "After using factor base, n= " < int is_prime(const bigint& n) { ostringstream oss; oss< read_vec_from_string(string vecstr) { // cout<<"parsing output string "< plist; istringstream vecin(vecstr); bigint p; char c; vecin>>skipws>>c; // swallow leading "[" while(c!=']') { vecin>>p; // cout<<"Reading p="<>skipws>>c; // swallow ",", but it might turn out to be "]" } // cout<<"Finished reading from string"< factor(const bigint& n, int proof=1) { ostringstream oss; oss< plist = read_vec_from_string(factor(oss.str())); if(proof) for( const auto& p : plist) { if(!is_prime(p)) { cout<<"WARNING: pari's factor() returned p="<

pdivs_pari(const bigint& number, int trace) { vector plist; bigint n=abs(number); if(n<2) return plist; // empty! // for small n just use trial division... if(n0) cout<<"after using factorbase, have factors "< pdivs(const bigint& number, int trace) { return pdivs_pari(number); } vector posdivs(const bigint& number) { const vector& plist=pdivs(number); return posdivs(number, plist); } vector posdivs(const bigint& number, const vector& plist) { static const bigint one(1); int np = plist.size(); int e, nu = 1; int nd=nu; vector elist; elist.reserve(np); for (const auto& p : plist) { e=val(p,number); elist.push_back(e); nd*=(1+e); } // cout<<"In posdivs (0) : elist = "< dlist(1, one); // cout<<"In posdivs (1) : dlist = "<1) {check=3; m1/=d; m2/=d; m3*=d;} else check-=1; if(check) { d=abs(gcd(m1,m3)); if(d>1) {check=3; m1/=d; m2*=d; m3/=d; c1*=d;} else check-=1; } if(check) { d=abs(gcd(m2,m3)); if(d>1) {check=3; m1*=d; m2/=d; m3/=d; c2*=d;} else check-=1; } } #ifdef CHECK_LEM3 if( (a==sqr(c1)*m1*m3) && (b==sqr(c2)*m2*m3) && (gcd(m1,m3)==1) && (gcd(m2,m3)==1) && (gcd(m1,m2)==1) ) {;} else { cout<<"Error in rusin_lem3("<0?Ifloor(x+0.5):Iceil(x-0.5));} #define BIG 100000 // not used in new version bigint Ifloor(double x) // bigfloats are just doubles in this case { bigint ans; ans =0; int s=1; if(x==0.0) return ans; if(x<0) {x=-x; s=-1;} //#define DEBUG_IFLOOR int e; frexp(x,&e); #ifdef DEBUG_IFLOOR cout<<"x="<>1); return (abs(a) <= lim) && (abs(b) <= lim); } // Find the number of roots of X^3 + bX^2 + cX + d = 0 (mod p) and // assign roots to a list of these. A stupid search is good enough // since we only use this for very small p! Also it is tacitly assumed // that the roots are distinct. int nrootscubic(long b, long c, long d, long p, vector& roots) { int nr=0; long r=0; roots.clear(); for (r = 0; r eps ) { c = Iround( xx ); rc=I2bigfloat(c); x2 = x0 + c*x1; x0 = x1; x1 = x2; y2 = y0 + c*y1; y0 = y1; y1 = y2; diff = abs( x - I2bigfloat(x2)/I2bigfloat(y2) ); // cout<<"x2 = "<0) && (abs(y2)>maxd) ) // go back to previous { diff = 0; x2 = x0; y2 = y0; } else xx = 1/(xx - c); } } a = x2; b = y2; if ( b < 0 ) {a=-a; b=-b; } // if ( x < 0 ) {a=-a;} } // end of file marith.cc eclib-20250122/libsrc/mat.cc000066400000000000000000001232741474421343600154160ustar00rootroot00000000000000// mat.cc: implementation of integer matrix classes ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // Only to be included by matrix.cc // Definitions of member operators and functions: void mat::init(long nr, long nc) // resets to zero mat of given size; { // with defaults (0,0) releases all space. nro = nr; nco = nc; entries.resize(nro*nco, scalar(0)); } scalar& mat::operator()(long i, long j) // returns ref to (i,j) entry { return entries.at((i-1)*nco+(j-1)); } scalar mat::operator()(long i, long j) const // returns (i,j) entry { return entries.at((i-1)*nco+(j-1)); } scalar mat::sub(long i, long j) const { return entries.at((i-1)*nco+(j-1)); } mat mat::slice(long r1,long r2,long c1,long c2) const { if(c1<0) // abbreviated form with firsts=1 { c2=r2-1; r2=r1-1; r1=c1=0; } else { r1--; c1--; r2--; c2--; } long n=r2-r1+1,c=c2-c1+1; mat ans(n,c); auto ap=ans.entries.begin(); auto mp=entries.begin()+r1*nco+c1; while(n--) { std::copy(mp, mp+c, ap); ap += c; mp += nco; } return ans; } mat& mat::operator=(const mat& m) { if (this==&m) return *this; nro=m.nro; nco=m.nco; entries = m.entries; return *this; } void mat::set(long i, long j, const scalar& x) { entries.at((i-1)*nco+(j-1)) = x; } void mat::add(long i, long j, const scalar& x) { if (is_nonzero(x)) entries.at((i-1)*nco+(j-1)) += x; } void mat::setrow(long i, const vec& v) { std::copy(v.entries.begin(), v.entries.end(), entries.begin() + (i-1)*nco); } void mat::setcol(long j, const vec& v) { auto colj = entries.begin()+(j-1); for ( const auto vi : v.entries) { *colj = vi; colj += nco; } } vec mat::row(long i) const { vec mi(nco); auto e = entries.begin()+(i-1)*nco; std::copy(e, e+nco, mi.entries.begin()); return mi; } vec mat::col(long j) const { vec v(nro); auto entriesij = entries.begin()+(j-1); for ( auto& vi : v.entries) { vi = *entriesij; entriesij+=nco; } return v; } void mat::swaprows(long r1, long r2) { auto mr1 = entries.begin() + (r1-1)*nco; auto mr2 = entries.begin() + (r2-1)*nco; std::swap_ranges(mr1, mr1+nco, mr2); } void mat::multrow(long r, const scalar& scal) { if (is_one(scal)) return; auto mij = entries.begin()+(r-1)*nco; std::transform(mij, mij+nco, mij, [scal](const scalar& x) {return x * scal;}); } void mat::divrow(long r, const scalar& scal) { if (is_zero(scal)||is_one(scal)) return; auto mij = entries.begin()+(r-1)*nco; std::transform(mij, mij+nco, mij, [scal](const scalar& x) {return x / scal;}); } scalar mat::content() const { return std::accumulate(entries.begin(), entries.end(), scalar(0), [](const scalar& x, const scalar& y) {return gcd(x,y);}); } scalar mat::row_content(long r) const { auto mij = entries.begin()+(r-1)*nco; return std::accumulate(mij, mij+nco, scalar(0), [](const scalar& x, const scalar& y) {return gcd(x,y);}); } void mat::clearrow(long r) { divrow(r, row_content(r)); } void mat::makeprimitive() { scalar g = content(); if (is_zero(g)||is_one(g)) return; std::transform(entries.begin(), entries.end(), entries.begin(), [g](const scalar& x) {return x / g;}); } void mat::operator+=(const mat& n) { std::transform(n.entries.begin(), n.entries.end(), entries.begin(), entries.begin(), [](const scalar& x, const scalar& y) { return x + y;}); } void mat::operator-=(const mat& n) { std::transform(n.entries.begin(), n.entries.end(), entries.begin(), entries.begin(), [](const scalar& x, const scalar& y) { return y - x;}); } void mat::operator*=(const scalar& scal) { if (is_one(scal)) return; if (is_zero(scal)) std::fill(entries.begin(), entries.end(), scalar(0)); else std::transform(entries.begin(), entries.end(), entries.begin(), [scal](const scalar& x) {return x * scal;}); } void mat::operator/=(const scalar& scal) { if (is_zero(scal)||is_one(scal)) return; std::transform(entries.begin(), entries.end(), entries.begin(), [scal](const scalar& x) {return x / scal;}); } // Definitions of non-member, friend operators and functions // add/sub row i of mat to v void add_row_to_vec(vec& v, const mat& m, long i) { std::transform(v.entries.begin(), v.entries.end(), m.entries.begin()+(i-1)*m.nco, v.entries.begin(), std::plus()); } void sub_row_to_vec(vec& v, const mat& m, long i) { std::transform(v.entries.begin(), v.entries.end(), m.entries.begin()+(i-1)*m.nco, v.entries.begin(), std::minus()); } mat operator*(const mat& m1, const mat& m2) { long m=m1.nro, n=m1.nco, p=m2.nco; mat m3(m,p); if (n==m2.nro) { auto a=m1.entries.begin(); // a points to m1(i,k) for (auto c=m3.entries.begin(); c!=m3.entries.end(); c+=p) // c points to m3(i,_) for 0<=i colwidths(nco); for(long j=0; jma) ma=*mij; else if (*mijnma)nma=nmi; colwidths[j]=nma; } long nr=nro; auto mij=entries.begin(); while(nr--) { s << "["; for(long j=0; j>(istream& s, mat& m) // m cannot be const { long n=m.nro*m.nco; auto mij=m.entries.begin(); while(n--) s >> (*mij++); return s; } mat colcat(const mat& a, const mat& b) { long nr = a.nro, nca = a.nco, ncb = b.nco; mat c(nr,nca+ncb); if (nr==b.nro) { auto aij = a.entries.begin(); auto bij = b.entries.begin(); auto cij = c.entries.begin(); while (cij!=c.entries.end()) { std::copy(aij, aij+nca, cij); aij+=nca; cij+=nca; std::copy(bij, bij+ncb, cij); bij+=ncb; cij+=ncb; } } else cerr << "colcat: matrices have different number of rows!" << endl; return c; } mat rowcat(const mat& a, const mat& b) { mat c(a.nro+b.nro,a.nco); if (a.nco==b.nco) { auto cij = c.entries.begin(); std::copy(a.entries.begin(), a.entries.end(), cij); cij += a.entries.size(); std::copy(b.entries.begin(), b.entries.end(), cij); } else cerr << "rowcat: matrices have different number of columns!" << endl; return c; } mat directsum(const mat& a, const mat& b) { return rowcat(colcat(a,mat(a.nro,b.nco)),colcat(mat(b.nro,a.nco),b)); } //plain elimination, no clearing void elimrows(mat& m, long r1, long r2, long pos) // m cannot be const { long nc=m.nco; scalar p = m(r1,pos), q=m(r2,pos); auto mr1 = m.entries.begin() + (r1-1)*nc; auto mr2 = m.entries.begin() + (r2-1)*nc; // replace row2 by p*row2-q*row1 std::transform(mr1, mr1+nc, mr2, mr2, [p,q] (const scalar& x, const scalar& y) {return p*y-q*x;}); } //elimination + clearing (i.e. divide new row by its content) void elimrows1(mat& m, long r1, long r2, long pos) { elimrows(m,r1,r2,pos); m.clearrow(r2); } //elimination + divide by last pivot void elimrows2(mat& m, long r1, long r2, long pos, const scalar& last) { elimrows(m,r1,r2,pos); m.divrow(r2,last); } // Definition of non-friend functions mat operator+(const mat& m) { return m; } mat operator-(const mat& m) { return scalar(-1)*m; } mat operator+(const mat& m1, const mat& m2) { mat ans(m1); ans+=m2; return ans; } mat operator-(const mat& m1, const mat& m2) { mat ans(m1); ans-=m2; return ans; } mat operator*(const scalar& scal, const mat& m) { mat ans(m); ans*=scal; return ans; } mat operator/(const mat& m, const scalar& scal) { mat ans(m); ans/=scal; return ans; } int operator!=(const mat& m1, const mat& m2) { return !(m1==m2); } vec operator*(const mat& m, const vec& v) { long c=m.nco; vec w(m.nro); if (c==dim(v)) { auto mi = m.entries.begin(); for (auto& wi : w.entries) { wi = std::inner_product(mi, mi+c, v.entries.begin(), scalar(0)); mi += c; } } else cerr << "Incompatible sizes in *(mat,vec)"<& m, long nc, long r1, long r2, long pos) { auto mr1=m.begin() + r1*nc + pos; auto mr2=m.begin() + r2*nc + pos; scalar p = *mr1, q = *mr2; nc -= pos; #ifdef DEBUG_ECH_0 cout<<"In conservative_elim with p = "< f = [p,q](const scalar& x, const scalar& y) {return p*y - q*x;}; if(is_one(p)) // now q!=0 { if(is_one(q)) f = [p,q](const scalar& x, const scalar& y) {return y - x;}; else { if(is_one(-q)) f = [p,q](const scalar& x, const scalar& y) {return y + x;}; else f = [p,q](const scalar& x, const scalar& y) {return y - q*x;}; } } else // p!=1 { if(is_zero(q)) f = [p,q](const scalar& x, const scalar& y) {return p*y;}; if(is_one(q)) f = [p,q](const scalar& x, const scalar& y) {return p*y - x;}; if(is_one(-q)) f = [p,q](const scalar& x, const scalar& y) {return p*y + x;}; } std::transform(mr1, mr1+nc, mr2, mr2, f); } // This version does not multiply row r1 by p unnecessarily. Used in // back substitution, it does not assume that the entries in // columns& m, long nc, long r1, long r2, long pos) { auto mr1=m.begin()+r1*nc; auto mr2=m.begin()+r2*nc; scalar p = *(mr1+pos), q = *(mr2+pos); #ifdef DEBUG_ECH_0 cout<<"In elim with p = "< f = [p,q](const scalar& x, const scalar& y) {return p*y - q*x;}; if(is_one(p)) // now q!=0 { if(is_one(q)) f = [p,q](const scalar& x, const scalar& y) {return y - x;}; else { if(is_one(-q)) f = [p,q](const scalar& x, const scalar& y) {return y + x;}; else f = [p,q](const scalar& x, const scalar& y) {return y - q*x;}; } } else // p!=1 { if(is_one(q)) f = [p,q](const scalar& x, const scalar& y) {return p*y - x;}; if(is_one(-q)) f = [p,q](const scalar& x, const scalar& y) {return p*y + x;}; } std::transform(mr1, mr1+nc, mr2, mr2, f); } void clear(vector& row, long col1, long col2) { auto row1=row.begin()+col1; auto row2=row.begin()+col2; scalar g = std::accumulate(row1, row2, scalar(0), [](const scalar& x, const scalar& y) {return gcd(x,y);}); if (g>1) std::for_each(row1, row2, [g](scalar& x) {x/=g;}); } //#ifndef DEBUG_ECH_0 //#define DEBUG_ECH_0 //#endif #ifdef DEBUG_ECH_0 void show(vector m, long nr, long nc) { auto mij = m.begin(); for(long i=0; i m = entries.entries; vector pcols(nc), npcols(nc); for (long c=0; (cr) //swap rows { #ifdef DEBUG_ECH_0 cout<<"Swapping rows "<1) { auto mi1 = m.begin()+r3*nc; std::transform(mi1, mi1+nc, mi1, [lastpivot]( const scalar& x) {return x/lastpivot;}); } } lastpivot=piv; #ifdef DEBUG_ECH_0 cout<<"r="<0) // Back-substitute and even up pivots { for (long r1=0; r1r) m.swaprows(r,rmin); for (long r3 = r+1 ; r3<=nr; r3++) elimrows2(m,r,r3,c,lastpivot); lastpivot=mmin; r++; } } return rk; } long mat::nullity() const { return nco-rank(); } scalar mat::trace() const { scalar tr(0); for (long i=0; i mat::charpoly() const { long n = nrows(); mat b(*this); mat id(identity_matrix(n)); vector clist(n+1); scalar t = trace(); clist[n] = 1; clist[n-1] = -t; for (long i=2; i<=n; i++) { b=(*this)*(b-t*id); // cout << b; // (for testing only) t=b.trace()/i; clist[n-i] = -t; } if (!(b==t*id)) { cerr << "Error in charpoly: final b = " << (b-t*id) << endl; } return clist; } scalar mat::determinant() const { scalar det = charpoly()[0]; return (nro%2? -det :det); } void vec::sub_row(const mat& m, int i) { long n=entries.size(); auto wi = m.entries.begin() + (i-1)*n; std::transform(entries.begin(), entries.end(), wi, entries.begin(), std::minus()); } void vec::add_row(const mat& m, int i) { long n=entries.size(); auto wi = m.entries.begin() + (i-1)*n; std::transform(entries.begin(), entries.end(), wi, entries.begin(), std::plus()); } mat addscalar(const mat& mm, const scalar& c) { return mm + mat::scalar_matrix(mm.nrows(), c); } vec apply(const mat& m, const vec& v) // same as *(mat, vec) { return m*v; } void mat::reduce_mod_p(const scalar& p) { if (p==0) return; std::transform(entries.begin(), entries.end(), entries.begin(), [p](const scalar& mij) {return mod(mij,p);}); } void elimp(mat& m, long r1, long r2, long pos, const scalar& pr) { long nc=m.nco; auto mr1 = m.entries.begin() + (r1-1)*nc + (pos-1); auto mr2 = m.entries.begin() + (r2-1)*nc + (pos-1); scalar p = mod(*mr1,pr), q=mod(*mr2,pr); if(q==0) {return;} // nothing to do nc -= (pos-1); // first pos-1 entries are assumed 0 already // generic function to make y (entry in row2) 0 std::function f = [pr,p,q](const scalar& x, const scalar& y) {return mod(xmodmul(p,y,pr)-xmodmul(q,x,pr), pr);}; // simpler special cases (for same signature they must also capture both p and q) if(is_one(p)) { if(is_one(q)) f = [pr,p,q](const scalar& x, const scalar& y) {return mod(y-x, pr);}; else { if(is_one(-q)) f = [pr,p,q](const scalar& x, const scalar& y) {return mod(y+x, pr);}; else // general q f = [pr,p,q](const scalar& x, const scalar& y) {return mod(y-xmodmul(q,x,pr), pr);}; } } else // general p!=1 { if(is_one(q)) f = [pr,p,q](const scalar& x, const scalar& y) {return mod(xmodmul(p,y,pr)-x, pr);}; if(is_one(-q)) f = [pr,p,q](const scalar& x, const scalar& y) {return mod(xmodmul(p,y,pr)+x, pr);}; // else the generic f will be used } std::transform(mr1, mr1+nc, mr2, mr2, f); } void elimp1(mat& m, long r1, long r2, long pos, const scalar& pr) //same as elimp except assumes pivot is 1 { long nc=m.nco; auto mr1 = m.entries.begin() + (r1-1)*nc + (pos-1); auto mr2 = m.entries.begin() + (r2-1)*nc + (pos-1); scalar q=mod(*mr2,pr); if(is_zero(q)) return; nc -= (pos-1); // first pos-1 entries are assumed 0 already // generic function to make y (entry in row2) 0 std::function f = [pr,q](const scalar& x, const scalar& y) {return mod(y-xmodmul(q,x,pr), pr);}; // simpler special cases if (is_one(q)) f = [pr,q](const scalar& x, const scalar& y) {return mod(y-x, pr);}; if (is_one(-q)) f = [pr,q](const scalar& x, const scalar& y) {return mod(y+x, pr);}; std::transform(mr1, mr1+nc, mr2, mr2, f); } //#define TRACE 1 // This method uses mod-p arithmetic internally but returns the // "characteristic zero" echelon form of the mat. It will only give // the wrong answer if (a) the rank mod pr is not the actual rank, or (b) // the actual echelon form has entries which are too big. mat echelonp(const mat& entries, vec_i& pcols, vec_i& npcols, long& rk, long& ny, scalar& d, const scalar& pr) { #ifdef TRACE cout << "In echelonp\n"; #endif /* TRACE */ long nr=entries.nrows(), nc=entries.ncols(); mat m(nr,nc); std::transform(entries.entries.begin(), entries.entries.end(), m.entries.begin(), [pr] (const scalar& x) {return mod(x,pr);}); pcols.init(nc); npcols.init(nc); rk=0; ny=0; long r=1; for (long c=1; (c<=nc)&&(r<=nr); c++) { scalar mmin = m(r,c); long rmin = r; for (long r2=r+1; (r2<=nr)&&(mmin==0); r2++) { scalar mr2c = m(r2,c); if (0!=mr2c) { mmin=mr2c; rmin=r2; } } if (mmin==0) npcols[++ny] = c; else { pcols[++rk] = c; if (rmin>r) m.swaprows(r,rmin); for (long r3 = r+1 ; r3<=nr; r3++) elimp(m,r,r3,c,pr); r++; } } for (long c = rk+ny+1; c<=nc; c++) npcols[++ny] = c ; #ifdef TRACE cout << "Finished first stage; rk = " << rk; cout << ", ny = " << ny << "\n"; cout << "Back substitution.\n"; #endif /* TRACE */ pcols = pcols.slice(1,rk); npcols = npcols.slice(1,ny); // truncate index vectors if (ny>0) { for (long r1=1; r1<=rk; r1++) for (long r2=r+1; r2<=rk; r2++) elimp(m,r2,r1,pcols[r2],pr); for (long r1=1; r1<=rk; r1++) { scalar fac = xmod(invmod(m(r1,pcols[r1]),pr),pr); for (long c=1; c<=nc; c++) m(r1,c)=xmodmul(fac,m(r1,c),pr); } } else for (long i=1; i<=rk; i++) for (long j=1; j<=nc; j++) m(i,j)=(j==pcols[i]); // 0 or 1 ! #ifdef TRACE cout << "Finished second stage.\n Echelon mat mod "<r) m.swaprows(r,rmin); auto entriesij = m.entries.begin()+(r-1)*nc; // cout<<"c = "<0) { for (long r1=1; r1<=rk; r1++) for (long r2=r1+1; r2<=rk; r2++) elimp(m,r2,r1,pcols[r2],pr); for (long r1=1; r1<=rk; r1++) { auto mij = m.entries.begin()+(r1-1)*nc; scalar fac = *(mij+pcols[r1]-1); fac = mod(invmod(fac,pr),pr); std::transform(mij, mij+nc, mij, [pr,fac] (const scalar& x) {return mod(xmodmul(fac,x, pr), pr);}); } } else { auto mij=m.entries.begin(); for (long i=1; i<=rk; i++) for (long j=1; j<=nc; j++) *mij++ = scalar(j==pcols[i]); // 0 or 1 ! } return m.slice(rk,nc); } mat echmodp_uptri(const mat& entries, vec_i& pcols, vec_i& npcols, long& rk, long& ny, const scalar& pr) { // cout << "In echmodp_uptri with matrix = " << entries; long nr=entries.nrows(), nc=entries.ncols(); mat m(nr,nc); std::transform(entries.entries.begin(), entries.entries.end(), m.entries.begin(), [pr] (const scalar& x) {return mod(x,pr);}); pcols.init(nc); npcols.init(nc); rk=ny=0; long r=1; for (long c=1; (c<=nc)&&(r<=nr); c++) { auto mij=m.entries.begin()+(r-1)*nc+c-1; scalar mmin = *mij; long rmin = r; mij += nc; for (long r2=r+1; (r2<=nr)&&(mmin==0); r2++, mij+=nc) { scalar mr2c = *mij; if (0!=mr2c) { mmin=mr2c; rmin=r2; } } if (mmin==0) npcols[++ny] = c; else { pcols[++rk] = c; if (rmin>r) m.swaprows(r,rmin); auto entriesij = m.entries.begin()+(r-1)*nc; scalar fac = mod(invmod(mmin,pr),pr); std::transform(entriesij, entriesij+nc, entriesij, [pr,fac] (const scalar& x) {return mod(fac*x, pr);}); for (long r3 = r+1 ; r3<=nr; r3++) elimp1(m,r,r3,c,pr); r++; } } for (long c = rk+ny+1; c<=nc; c++) npcols[++ny] = c ; pcols = pcols.slice(rk); npcols = npcols.slice(ny); // truncate index vectors // cout << "Rank = " << rk << ". Nullity = " << ny << ".\n"; return m.slice(rk,nc); } ////////////////////////////////////////////////////////////////////////////////////////////// // // Interface with NTL matrices // ////////////////////////////////////////////////////////////////////////////////////////////// //#define TRACE_NTL_REF #include #ifdef TRACE_NTL_REF #include #endif // Construct an NTL mat_lzz_p (matrix mod p) from a mat mod pr mat_zz_p mat_zz_p_from_mat(const mat& M, const scalar& pr) { long nr=M.nrows(), nc=M.ncols(); #ifdef TRACE_NTL_REF cout<<"Creating an NTL mat_zz_p from a matrix with " << nr <<" rows and "<(M(i+1,j+1))); #ifdef TRACE_NTL_REF cout<<"--done."<(A.get(i,j)), pr); #ifdef TRACE_NTL_REF cout<<"--done."<(det), pr); } ////////////////////////////////////////////////////////////////////////////////////////////// // // Interface with FLINT matrices // ////////////////////////////////////////////////////////////////////////////////////////////// #if FLINT #include "eclib/flinterface.h" // FLINT has more than one type for modular matrices: standard in // FLINT-2.3..2.9 was nmod_mat_t with entries of type mp_limb_t // (unsigned long) while non-standard was hmod_mat_t, with entries // hlimb_t (unsigned int). From FLINT-3 the latter is emulated via a // wrapper. We use the former when scalar=long and the latter when // scalar=int and the FLINT versin is at least 3. The unsigned // scalar types are #define'd as uscalar. void mod_mat_from_mat(mod_mat& A, const mat& M, const scalar& pr) { long nr=M.nrows(), nc=M.ncols(); // copy of the modulus for FLINT long ipr = I2long(pr); uscalar p = (uscalar)ipr; // create flint matrix copy of M: mod_mat_init(A, nr, nc, p); for(long i=0; i>1); m = mm; m.reduce_mod_p(pr); if (maxabs(m) < lim) return 1; int success = 1; dd=1; std::for_each(m.entries.begin(), m.entries.end(), [&success,lim,&dd,pr,&n,&d] (const scalar& x) {if (abs(x)>lim) {int succ = modrat(x,pr,n,d); if(succ) d=lcm(d,dd); else success=0;}}); dd=abs(dd); if(trace) cout << "Common denominator = " << dd << "\n"; std::transform(m.entries.begin(), m.entries.end(), m.entries.begin(), [pr,dd] (const scalar& x) {return mod(xmodmul(dd,x,pr),pr);}); if (!success) { cerr<<"liftmat() failed to lift some entries mod "<2)&&(SCALAR_OPTION==1) // Implementation of wrapper functions declared in flinterface.h // written by Fredrik Johansson #include #include void hmod_mat_init(hmod_mat_t mat, slong rows, slong cols, hlimb_t n) { gr_ctx_t ctx; gr_ctx_init_nmod32(ctx, n); gr_mat_init((gr_mat_struct *) mat, rows, cols, ctx); nmod_init(&(mat->mod), n); } void hmod_mat_clear(hmod_mat_t mat) { if (mat->entries) { flint_free(mat->entries); flint_free(mat->rows); } } void hmod_mat_mul(hmod_mat_t C, const hmod_mat_t A, const hmod_mat_t B) { gr_ctx_t ctx; gr_ctx_init_nmod32(ctx, C->mod.n); GR_MUST_SUCCEED(gr_mat_mul((gr_mat_struct *) C, (gr_mat_struct *) A, (gr_mat_struct *) B, ctx)); } slong hmod_mat_rref(hmod_mat_t mat) { slong rank; gr_ctx_t ctx; gr_ctx_init_nmod32(ctx, mat->mod.n); GR_MUST_SUCCEED(gr_mat_rref_lu(&rank, (gr_mat_struct *) mat, (gr_mat_struct *) mat, ctx)); return rank; } #endif eclib-20250122/libsrc/matrix.cc000066400000000000000000000053411474421343600161330ustar00rootroot00000000000000// matrix.cc: manage implementation of integer matrix classes ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #undef scalar #undef vec #undef mat #undef subspace #undef SCALAR_OPTION #define scalar int #define vec vec_i #define mat mat_i #define subspace subspace_i #define SCALAR_OPTION 1 #include "mat.cc" #undef scalar #undef vec #undef mat #undef subspace #undef SCALAR_OPTION #define scalar long #define vec vec_l #define mat mat_l #define subspace subspace_l #define SCALAR_OPTION 2 #include "mat.cc" #undef scalar #undef vec #undef mat #undef subspace #undef SCALAR_OPTION #define scalar bigint #define vec vec_m #define mat mat_m #define subspace subspace_m #define SCALAR_OPTION 0 #include "mat.cc" #undef scalar #undef vec #undef mat #undef subspace #undef SCALAR_OPTION mat_m to_mat_m(const mat_i& m) { const vector & mij = m.get_entries(); vector n(mij.size()); std::transform(mij.begin(), mij.end(), n.begin(), [](const int& x) {return bigint(x);}); return mat_m(m.nrows(), m.ncols(), n); } mat_m to_mat_m(const mat_l& m) { const vector & mij = m.get_entries(); vector n(mij.size()); std::transform(mij.begin(), mij.end(), n.begin(), [](const long& x) {return bigint(x);}); return mat_m(m.nrows(), m.ncols(), n); } mat_i to_mat_i(const mat_m& m) { const vector & mij = m.get_entries(); auto toint = [](const bigint& a) {return is_int(a)? I2int(a) : int(0);}; vector n(mij.size()); std::transform(mij.begin(), mij.end(), n.begin(), toint); return mat_i(m.nrows(), m.ncols(), n); } mat_l to_mat_l(const mat_m& m) { const vector & mij = m.get_entries(); auto tolong = [](const bigint& a) {return is_long(a)? I2long(a) : long(0);}; vector n(mij.size()); std::transform(mij.begin(), mij.end(), n.begin(), tolong); return mat_l(m.nrows(), m.ncols(), n); } eclib-20250122/libsrc/mequiv.cc000066400000000000000000000225551474421343600161430ustar00rootroot00000000000000// mequiv.cc: implementation of quartic equivalence functions ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include // for is_small, is_real #include int new_equiv( quartic& q1, quartic& q2, int info) { if(info) { cout<<"Checking equivalence of " << q1 << " and " << q2 << "\n"; } const bigint& ii=q1.ii; const bigint& jj=q1.jj; if (!(ii==q2.ii && jj==q2.jj && q1.disc==q2.disc && q1.type== q2.type)) { if (info) { cout << "equiv failed on first test!\n"; cout << "First has I="< upolroots = Introotsquartic(zero,-2*p, -8*r, s); if (upolroots.size()>0) { if(info) cout<<"Root u = "<& dlist, int info); int allperms[24][4] = {{0,1,2,3},{1,0,2,3},{0,1,3,2},{1,0,3,2}, // Up to here for Type III {2,3,0,1},{2,3,1,0},{3,2,0,1},{3,2,1,0}, // Up to here for Type I {0,2,1,3},{0,2,3,1},{0,3,1,2},{0,3,2,1}, {1,2,0,3},{1,2,3,0},{1,3,0,2},{1,3,2,0}, {2,0,1,3},{2,0,3,1},{2,1,0,3},{2,1,3,0}, {3,0,1,2},{3,0,2,1},{3,1,0,2},{3,1,2,0},}; // All for Type II int testd(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const bigint& e, const bigint& as, const bigint& bs, const bigint& cs, const bigint& ds, const bigint& es, const bigint& dd, const bigint& al, const bigint& be, const bigint& ga, const bigint& de, int info) { bigint d2 = dd*dd; bigint al2=al*al, al3=al2*al, al4=al3*al; bigint ga2=ga*ga, ga3=ga2*ga, ga4=ga3*ga; bigint temp = ga4*es + al*ga3*ds + al2*ga2*cs + al3*ga*bs + al4*as - d2*a; if (!is_zero(temp)) return 0; bigint de2=de*de, de3=de2*de, de4=de3*de; bigint be2=be*be, be3=be2*be, be4=be3*be; temp = de4*es + be*de3*ds + be2*de2*cs + be3*de*bs + be4*as - d2*e; if (!is_zero(temp)) return 0; temp = 4*ga3*de*es + (3*al*ga2*de+be*ga3)*ds + 2*(al2*ga*de+al*be*ga2) * cs + (3*al2*be*ga+al3*de)*bs + 4*al3*be*as - d2*b; if (!is_zero(temp)) return 0; temp = 4*ga*de3*es + (3*be*ga*de2+al*de3)*ds + 2*(be2*ga*de+al*be*de2)*cs + (be3*ga+ 3*al*be2*de)*bs + 4*al*be3*as - d2*d; if (!is_zero(temp)) return 0; temp = 6*ga2*de2*es + 3*(be*ga2*de+al*ga*de2) * ds + (be2*ga2+ 4*al*be*ga*de+al2*de2) * cs + 3*(al*be2*ga+al2*be*de) * bs + 6*al2*be2*as - d2*c; if (!is_zero(temp)) return 0; return 1; } /* end of testd() */ bigcomplex crossratio(const bigcomplex& x1,const bigcomplex& x2,const bigcomplex& x3,const bigcomplex& x4) { return ((x1-x3)*(x2-x4))/((x1-x4)*(x2-x3)); } int rootsequiv(const quartic* q1, const quartic* q2, int i, const vector& dlist, int info) { vector x = q1->getroots(); vector y = q2->getroots(); bigcomplex x1=x[0], x2=x[1], x3=x[2], x4=x[3]; bigcomplex y1=y[allperms[i][0]],y2=y[allperms[i][1]], y3=y[allperms[i][2]],y4=y[allperms[i][3]]; //cout<<"X-roots ("<0.1) {if (info) {cout << i+1 << ": Cross-ratios unequal: "<getdisc()<<":\n"; // cout << dlist << endl; } for ( const auto& d : dlist) { bigfloat rscale = sqrt(abs(I2bigfloat(d)/det)); bigfloat rscaler = floor(rscale+0.5); if(abs(rscale-rscaler)<0.001) { bigint al = Iround(rscale*alpha), be = Iround(rscale*beta ), ga = Iround(rscale*gamma), de = Iround(rscale*delta); bigint ddet = abs(al*de-be*ga); if(d==ddet) { if (info) {cout << "d = " << d << endl; cout<<"rscale = "<geta(),q1->getb(),q1->getcc(),q1->getd(),q1->gete(), q2->geta(),q2->getb(),q2->getcc(),q2->getd(),q2->gete(), d,al,be,ga,de,info)) return 1; } } } return 0; } // of rootsequiv() int equiv(const quartic* q1, const quartic* q2, const vector& dlist, int info) { bigint iiq1 = q1->getI(), jjq1 = q1->getJ(), discq1 = q1->getdisc(); bigint iiq2 = q2->getI(), jjq2 = q2->getJ(), discq2 = q2->getdisc(); int typeq1 = q1->gettype(), typeq2 = q2->gettype(); if(info) { cout<<"Checking equivalence of \n"; q1->dump(cout); cout<<"and\n"; q2->dump(cout); } if (iiq1==iiq2 && jjq1==jjq2 && discq1==discq2 && typeq1== typeq2) { int nperms = (typeq1==1)? 8 : (typeq1==2)? 24 : 4; if (info) cout << "Params agree; calling rootsequiv "<1) { cout << "Finished constructing quartic_sieve, using "; switch(moduli_option) { case 1: cout << "ten primes 3..31"; break; case 2: cout << "three composite moduli"; break; case 3: cout << "prime powers"; break; } cout << endl; } } //#define DEBUG_RANGES void sort(bigfloat& x1, bigfloat& x2, bigfloat& x3, bigfloat& x4) // sorts into increasing order { #ifdef DEBUG_RANGES cout << "sort called with roots "<x2) {t=x1; x1=x2; x2=t;} if(x2>x3) {t=x2; x2=x3; x3=t;} if(x3>x4) {t=x3; x3=x4; x4=t;} // now x4 is biggest if(x1>x2) {t=x1; x1=x2; x2=t;} if(x2>x3) {t=x2; x2=x3; x3=t;} // now x3 is second biggest if(x1>x2) {t=x1; x1=x2; x2=t;} #ifdef DEBUG_RANGES cout << "sort returns roots "<=maxnpoints) return npoints; if(easy&2) // e is a square with root roote { pu=0; pv=roote; pw=1; npoints++; // cout<<"Easy case: "<=maxnpoints) return npoints; // Now do some harder work: if(use_stoll) return stoll_search(h_lim,posxonly); // set initial bounds for point coefficients ulim = (long)floor(exp(h_lim)); if (verbose) cout << "quartic_sieve::search: trying u,w up to "<gettype(); vector roots = g->getroots(); bigfloat x1, x2, x3, x4,t, zero=to_bigfloat(0); switch (type) { case 0: default: // no roots info known #ifdef DEBUG_RANGES cout << "sieve::search: no info about real roots.\n"; #endif search_range(0,zero,0,zero,posxonly); return npoints; break; case 1: // no real roots #ifdef DEBUG_RANGES cout << "sieve::search: no real roots.\n"; #endif search_range(0,zero,0,zero,posxonly); return npoints; break; case 3: // 2 real roots, one or two ranges x1 = real(roots[2]); x2 = real(roots[3]); if(x1>x2) {t=x1; x1=x2; x2=t;} #ifdef DEBUG_RANGES cout << "sieve::search: type 3, real roots "<0) { search_range(1,x2,0,zero,posxonly); // x20) { search_range(1,x2,1,x3,posxonly); // x2 coef(5); coef[0]=e; coef[1]=d; coef[2]=c; coef[3]=b; coef[4]=a; qsieve s(this, 4, coef, to_bigfloat(h_lim), verbose); // Find and set search intervals int type = g->gettype(), lb_flag; vector roots = g->getroots(); vector real_roots(4); int nrr=0; bigfloat x1, x2, x3, x4, t; switch (type) { case 0: case 1: default: // no roots info known or no real roots #ifdef DEBUG_RANGES if(type==0) cout << "sieve::stoll_search: no info about real roots.\n"; else cout << "sieve::search: no real roots.\n"; #endif s.set_intervals(real_roots,0,0,posxonly); break; case 3: // 2 real roots, one or two ranges nrr=2; x1 = real(roots[2]); x2 = real(roots[3]); if(x1>x2) {t=x1; x1=x2; x2=t;} #ifdef DEBUG_RANGES cout << "sieve::search: type 3, real roots "<0) if(wprimes[0]==2) odd_w_only=1; long wstep = 1+odd_w_only; if(odd_w_only) { if(!odd(wstart)) wstart++; } int odd_u_only=0; if(nwprimes>0) if(uprimes[0]==2) odd_u_only=1; long ustep = 1+odd_u_only; for (w = wstart; (w <= ulim) && (npoints10); int use_gcd_table = use_w_sieve&&(w<10000)&&((last_u-first_u)>(w/2)); long umodw=0; int w_vars_set = 0; vector wflag(w); if(use_w_sieve) { // some preliminary calculations of multiples of w etc. w2 = sqr(bigint(w)); w3 = w*w2; w4 = w2*w2; aw = a; bw = b*w; cw = c*w2; dw = d*w3; ew = e*w4; for ( i=0; i < num_aux; i++) umod[i] = posmod(first_u-ustep, auxs[i]); // set up flag array of residues coprime to w if(use_gcd_table) { umodw = posmod(first_u-ustep,w); wflag[0]=(w==1); for(i=1; i<=w-i; i++) wflag[i] = wflag[w-i] = (gcd(i,w)==1); } // set the main flag matrix for (long index = 0; index < num_aux; index++) { aux = auxs[index]; paw = posmod(aw, aux); pbw = posmod(bw, aux); pcw = posmod(cw, aux); pdw = posmod(dw, aux); pew = posmod(ew, aux); long ddddf= posmod(24*paw , aux); long dddf = posmod(36*paw + 6*pbw , aux); long ddf = posmod(14*paw + 6*pbw + 2*pcw , aux); long df = posmod(paw+pbw+pcw+pdw, aux); long f = posmod(pew , aux); vector flag = xgood_mod_aux[index]; vector sqs = squares[index]; for (long x=0; x= aux) f -= aux; df += ddf; if(df >= aux) df -= aux; ddf += dddf; if(ddf >= aux) ddf -= aux; dddf += ddddf; if(dddf >= aux) dddf -= aux; } } // end of aux loop } // end of if(use_w_sieve) for (u=first_u; (u <= last_u) && (npoints= auxs[i]) umodi -= auxs[i]; if(u_is_ok) { u_is_ok = xgood_mod_aux[i][umodi]; // if(!u_is_ok) // cout<<"(u,w)=("<=w) umodw-=w; u_is_ok = wflag[umodw]; // true if gcd(u,w)=1 } if(!u_is_ok) continue; // Check that u has no impossible prime factors: for(nwp=0; (nwp #include #include //#define DEBUG_MINIM bigint root_p(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const bigint& e, const bigint& p) // assuming p|I, p|J, returns the unique alpha mod p // modulo which quartic has a root of multiplicity at least 3 // returns -1 if multiple root is at infinity (if a=b=0 mod p) // (program does not actaully use this dubious feature) { static const bigint zero(0), one(1); if(div(p,a)&&div(p,b)) return -one; if(div(p,e)&&div(p,d)) return zero; // Now we have to find the multiple root, using invariant theory: if(p==2) { return one; // the only other possibility } if(p==3) { if(div(p,a)) return mod(-b*e,p); else return mod(-a*d,p); } bigint b2=sqr(b); bigint ac=a*c; bigint p_seminv = mod(3*b2-8*ac,p); if(is_zero(p_seminv)) // quadruple root { return mod(-b*invmod(4*a,p),p); } else // triple root only { if(div(p,a)) // fourth root is at infinity { return mod(-c*invmod(3*b,p),p); } bigint t=invmod(4*a*p_seminv,p); bigint r_seminv = b*b2+8*sqr(a)*d-4*ac*b; bigint alpha = mod((3*r_seminv-b*p_seminv)*t,p); return alpha; } } int minim_p(bigint& a, bigint& b, bigint& c, bigint& d, bigint& e, const bigint& p, scaled_unimod& m) // assuming p^4|I, p^6|J, (or stronger conditions when p=2 or p=3) // returns an equivalent quartic with invariants divided by p^4, p^6; // m holds the transformation matrix, must be initialized (say with identity) // returns success, can be 0 only for p=2 { static const bigint three(3), nine(9), twentyseven(27); bigint a0,b0,c0,d0,e0,r; bigint p2=sqr(p), temp; int p_is_2 = (p==2); int p_is_3 = (p==3); // First test for trivial case where p^2 divides all coeffs: int p2divall=::divides(a,p2,a0,r); if(p2divall) {p2divall=::divides(b,p2,b0,r);} if(p2divall) {p2divall=::divides(c,p2,c0,r);} if(p2divall) {p2divall=::divides(d,p2,d0,r);} if(p2divall) {p2divall=::divides(e,p2,e0,r);} if(p2divall) // trivial case, all coeffs divisible by p^2 { #ifdef DEBUG_MINIM cout<<"All coeffs divisible by p\n"; #endif a=a0; b=b0; c=c0; d=d0; e=e0; m.u_scale(p); return 1; } // Next test for case where p divides all coeffs: int pdivall=::divides(a,p,a0,r); if(pdivall) { pdivall=::divides(b,p,b0,r);} if(pdivall) { pdivall=::divides(c,p,c0,r);} if(pdivall) { pdivall=::divides(d,p,d0,r);} if(pdivall) { pdivall=::divides(e,p,e0,r);} if(pdivall) // Case where all coeffs are divisible by p // a0 etc hold coeffs/p { #ifdef DEBUG_MINIM cout<<"All coeffs divisible by "<7)&&(vpj>11); // if(smallp==2) return ((vpi>5)&&(vpj>8)&&(vpd>9)); if(smallp==3) return (((vpi>4)&&(vpj>8)) || ((vpi==4)&&(vpj==6)&&(vpd>14))); return (vpi>3)&&(vpj>5); } void minim_all(bigint& ga, bigint& gb, bigint& gc, bigint& gd, bigint& ge, bigint& I, bigint& J, const vector& plist, scaled_unimod& m, int assume_locsol, int verb) { unsigned long i; long j; for(i=0; i= 2*nu) return 0; return -1; } // now gdashx !=0: long mu = val(p,gdashx); if ((lambda-mu >= nu) && (nu > mu)) return +1; if ((lambda >= 2*nu) && (mu >= nu)) return 0; return -1; } /* end of lemma6 */ int lemma7(const bigint& a,const bigint& b,const bigint& c,const bigint& d,const bigint& e, const bigint& p, int nu, const bigint& x) // returns -1 for insoluble, 0 for undecided, +1 for soluble --- p=2 { bigint gx = (((a*x+b)*x+c)*x+d)*x+e; if (psquare(gx,p)) return +1; bigint gdashx = ((4*a*x+3*b)*x+2*c)*x+d; long lambda = val(p,gx); bigint oddgx = gx; if (oddgx==0) oddgx= 1; else while (even(oddgx)) oddgx /= 2; int odd4 = (posmod(oddgx,4)==1); if(is_zero(gdashx)) // mu = infinity { if (lambda >= 2*nu) return 0; if ((lambda == 2*nu-2) && odd4) return 0; return -1; } long mu = val(p,gdashx); // Now gdashx is nonzero if ((lambda-mu >= nu) && (nu > mu)) return +1; if ((nu > mu) && (lambda==mu+nu-1) && even(lambda)) return +1; if ((nu > mu) && (lambda==mu+nu-2) && even(lambda) && odd4) return +1; if ((mu >= nu) && (lambda >= 2*nu)) return 0; if ((mu >= nu) && (lambda == 2*nu-2) && odd4) return 0; return -1; } /* end of lemma7 */ int zpsol(const bigint& a,const bigint& b,const bigint& c,const bigint& d,const bigint& e, const bigint& p, const bigint& x0, long nu) // Checks for solublility in Zp with x=x0 (mod p^nu) // Fully recursive (depth-first) version { // cout << "In zpsol with (p,nu) = (" << p << "," << nu << "), x0="<1)|| is_positive(g.geta())); } int Rsoluble(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const bigint& e) { quartic g(a,b,c,d,e); return Rsoluble(g); } //#define CHECK_LOC_SOL 1 int locallysoluble(const quartic& g, const vector& plist, bigint& badp) { bigint a=g.geta(), b=g.getb(), c=g.getcc(), d=g.getd(), e=g.gete(); return locallysoluble(a,b,c,d,e,plist,badp); } int locallysoluble(const bigint& a, const bigint& c, const bigint& e, const vector& plist, bigint& badp) { static const bigint zero(0); bigint d = c*c-4*a*e; if(global_hilbert(a,d,plist,badp)) return 0; return locallysoluble(a,zero,c,zero,e,plist,badp); } int locallysoluble(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const bigint& e, const vector& plist, bigint& badp) { // First check R-solubility if (!Rsoluble(a,b,c,d,e)) { badp = bigint(0); return 0; } if(is_zero(b)&&is_zero(d)) // do a quick Hilbert check: if(global_hilbert(a,c*c-4*a*e,plist,badp)) return 0; return std::all_of(plist.begin(), plist.end(), [&badp, a,b,c,d,e] (const bigint& p) {badp=p; return new_qpsoluble(a,b,c,d,e,p,0);}); } /* end of locallysoluble */ /* Samir Siksek's Local Solubility Test for odd p */ // The following is the cross-over between the B&SD method & the SS method // i.e. only uses SS method for p greater than this //#define CROSS_OVER_P 10000 // for testing only! #define CROSS_OVER_P 1000 //#define CROSS_OVER_P 100 //#define CROSS_OVER_P 7 // for testing only! int new_qpsoluble(const quartic& g, const bigint& p, int verbose) { bigint a=g.geta(), b=g.getb(), c=g.getcc(), d=g.getd(), e=g.gete(); return new_qpsoluble(a,b,c,d,e,p,verbose); } int new_qpsoluble_ace(const bigint& a, const bigint& c, const bigint& e, const bigint& p, int verbose) { bigint b; b=0; return new_qpsoluble(a,b,c,b,e,p,verbose); } int new_qpsoluble(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const bigint& e, const bigint& p, int verbose) { int verb; #ifdef DEBUG_NEW_LOCSOL verb=1; #else verb=verbose; #endif if(p c, int verbose) { ZZ_p::init(p); if (verbose) { cout << "---------------------------------------------\n"; cout << "LOCAL_SOL \n"; cout << c[4] << " " << c[3] << " " << c[2] << " " << c[1] << " "; cout << c[0] << " p=" << p << endl; } bigint r[2],t; long fl,i; bigint p2=sqr(p); Term term; Poly F; int zeromodp=1; for (i=0; (i<5) && zeromodp; i++) {zeromodp=div(p,c[i]);} if (zeromodp) { // Case II (Case I is below) if (verbose) cout << "f is 0 mod p: Case II" << endl; zeromodp=1; for (i=0; (i<5) && zeromodp; i++) { zeromodp=div(p2,c[i]); } vector dd(5); if (zeromodp) { for (i=0; i<5; i++) { dd[i]=c[i]/p2; } if (verbose) cout << "f is 0 mod p^2, recursing" << endl; return local_sol(p,dd,verbose); } for (i=0; i<5; i++) { dd[i]=c[i]/p; } Factorization fact_f=fact_c(dd); // Is there a non-repeated root if (verbose) cout << "Factorization of f/p = "< d(5); fl=0; for (i=0; i=0 && zeromodp; i--) { unit=c[i]; zeromodp=div(p,unit); } // If leading non-zero term is a square return 1 if (legendre(unit,p)==1) { return 1; } // If f is a constant mod p and constant not a square return 0 if (i==-1) { return 0; } // Factorize f Factorization fact_f=fact_c(c); long nc=fact_f.length(); // Check if of the form unit*g^2 if (verbose) cout << "Factorization of f = "<< fact_f << endl; for (i=0; i d(5); fl=0; for (i=0; i #include level::level(long n, long neigs) : modulus(n), plist(pdivs(n)), dlist(posdivs(n)), nap(neigs) { //cout<<"Creating a class level with n = " << n << endl; npdivs=plist.size(); ndivs=dlist.size(); primelist=plist; primevar pr; long p; p0=0; while(primelist.size()<(unsigned)nap) { p=pr; if (ndivides(p,modulus)) { if(p0==0) p0=p; primelist.push_back(p); } ++pr; } sqfac=1; for(long ip=0; ip0) {dstarts.resize(ndivs);} } void moddata::display() const { cout << "Level = " << modulus << "\n"; cout << "Number of symbols = " << nsymb << "\n"; cout << ndivs << " non-trivial divisors: " << dlist << endl; cout << npdivs << " prime divisors: " << plist << endl; cout << "invlist: " << invlist << endl; cout << "noninvlist: " << noninvlist << endl; cout << "noninvdlist: " << noninvdlist << endl; cout << "gcdtable: " << gcdtable << endl; cout << "unitdivlist: " << unitdivlist << endl; } string of_filename(long n, char c) { stringstream s; s << getenv_with_default("OF_DIR","./newforms"); s << "/" << c << n; return s.str(); } string nf_filename(long n, char c) { stringstream s; s << getenv_with_default("NF_DIR","./newforms"); s << "/" << c << n; return s.str(); } string small_nf_filename(long n, char c) { stringstream s; s << getenv_with_default("SNF_DIR","./smallnf"); s << "/" << c << n; return s.str(); } eclib-20250122/libsrc/mquartic.cc000066400000000000000000000221711474421343600164540ustar00rootroot00000000000000// mquartic.cc: Implementation of class quartic and related functions ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #include #include // constructors quartic::quartic() { have_zpol=0; equiv_code=0; roots.resize(4); //cout<<"Quartic constructor #1: " << this << endl; } quartic::quartic(const bigint& qa, const bigint& qb, const bigint& qc, const bigint& qd, const bigint& qe, const vector& qr, int qt, const bigint& qi,const bigint& qj,const bigint& qdisc) :a(qa),b(qb),c(qc),d(qd),e(qe), roots(qr), type(qt),ii(qi),jj(qj),disc(qdisc), have_zpol(0), equiv_code(0) { //cout<<"Quartic constructor #2: " << this << ", roots="<0)) {type=2;} // 4 real roots else {type=1;} // 0 real roots } #ifdef DEBUG_ROOTS int nrr = (type==3? 2 : (type==2? 4 : 0)); cout<<"Type = " << type << " ("< cphi = solvecubic( c1, c2, c3); #ifdef DEBUG_ROOTS cout<<"Roots of cubic are "<0) orderreal(phi1,phi2,phi3); else orderreal(phi3,phi2,phi1); #ifdef DEBUG_ROOTS cout<<"phi = "<0) r1 = -r1; #ifdef DEBUG_ROOTS cout<<"r_i = "<& qr, int qt, const bigint& qi,const bigint& qj,const bigint& qdisc) { have_zpol=0; equiv_code=0; a=qa; b=qb; c=qc; d=qd; e=qe; roots = qr; type=qt; ii=qi; jj=qj; disc=qdisc; // cout<<"Quartic assign, now: "; dump(cout); } void quartic::operator=(const quartic& q) { have_zpol=0; equiv_code = q.equiv_code; //cout<<" Quartic op=, LHS was: "; dump(cout); //cout<<" RHS = "; q.dump(cout); a=q.a; b=q.b; c=q.c; d=q.d; e=q.e; roots = q.roots; type=q.type; ii=q.ii; jj=q.jj; disc=q.disc; //cout<<" Quartic op=, LHS now: "; dump(cout); } int quartic::trivial() const // Checks for a rational root { return rational_roots().size()>0; } vector quartic::rational_roots() const // returns rational roots { bigint num; int i, start = (type==1)? 5 : (type==2)? 1 : 3; bigint ac = a*c, a2d = a*a*d, a3e = a*a*a*e; bigfloat ra = I2bigfloat(a); vector ans; for (i = start; i<=4 ; i++) { num = Iround(ra*real((roots)[i-1])); if (((((num+b)*num+ac)*num+a2d)*num+a3e)== 0) ans.push_back(bigrational(num,a)); } return(ans); } void quartic::make_zpol() { if(have_zpol) return; bigint b2 = sqr(b); asq=sqr(a); p = -H_invariant(a,b,c); psq = sqr(p); r = R_invariant(a,b,c,d); have_zpol=1; } // find the number of roots of aX^4 + bX^3 + cX^2 + dX + e = 0 (mod p) // except 4 is returned as 3 so result is 0,1,2 or 3. long quartic::nrootsmod(long p) const { #ifdef TEST_EQCODE cout << "Counting roots mod " << p << " of " << (*this) << "\n"; #endif long ap = mod(a,p); long bp = mod(b,p); long cp = mod(c,p); long dp = mod(d,p); long ep = mod(e,p); #ifdef TEST_EQCODE cout << "reduced coefficients: " << ap <<","<< bp <<","<< cp <<","<< dp <<","<< ep << "\n"; #endif long nroots = (ap==0); // must count infinity as a root! for (long i = 0; (i < p)&&(nroots<3) ; i++) { long temp = ((((ap*i+bp)*i + cp)*i + dp)*i + ep); if ((temp%p)==0) {nroots++;} } if(nroots==4) return 3; #ifdef TEST_EQCODE cout << "returning code " << nroots << "\n"; #endif return nroots; } unsigned long quartic::set_equiv_code(const vector& plist) { #ifdef TEST_EQCODE cout << "Setting equiv_code for " << (*this) << "\n"; #endif equiv_code=0; #ifdef NEW_EQUIV // else leave all codes 0, i.e. disable this test for(unsigned long i=0; i #include #include #include #include #define USE_BIGINTS #ifdef USE_BIGINTS //#define DEFAULT_NAUX 12 #define DEFAULT_NAUX 8 #else #define DEFAULT_NAUX 5 #endif // For testing: defines the strategy for dealing with large quartics // 1 for original BSD criteria // 2 for simple version of JC+MS criteria (Lemma 5.1 only) // 3 for optimal JC+MS criteria, with 2-adic refinement (uses twoadic.h) // So far, the options only affect the criteria for using small // quartics only, not the handling of large quartics using the exact // 2-adic index. // 4 for intelligent handling of large quartics when 2-adic index is 2 // or 4. When index=2 we can abort large quartic search as soon as // one is found; when index=2 we can abort after two are found // provided that they are independent modulo small quartics. #ifndef LARGE_Q #define LARGE_Q 4 #endif #ifndef QSIEVE_OPT #define QSIEVE_OPT 0 // uses Stoll's sieve #endif #define SQUARE_A_FIRST //#define NO_PADIC_FILTERING //#define SHOW_ABC_RANGES //#define DEBUG_AH #define maxnquartics 2048 // OK for curves of rank 12 or less. #define abceps 0.001 // used in abc-test #define NEQPLIST 5 // Number of primes for equiv-test sieving #ifndef USE_BIGINTS int xsqrt(bigfloat a, bigfloat &b) { if(a<0) return 0; b=floor(sqrt(a)+0.1); return is_zero(b*b-a); } #endif vector rank1::qeps(const quartic& q, int x2) { vector vec(num_aux); // position 0 is not used long i; vec[0]=0; for(i=1; i& vec) { long i; cout<<"("; for(i=1; i1) cout<<":"; if(aux_types[i]==1) switch(vec[i]) { case 15: cout<<"0"; break; case 5: cout<<"1"; break; default: cout<<"?"; } else switch(vec[i]) { case 15: cout<<"00"; break; case 5: cout<<"01"; break; case 3: cout<<"10"; break; case 1: cout<<"11"; break; default: cout<<"??"; } // cout<<"("<3 if(!btype) { if (extra2&&(twoadic_index==2)) // then 2 is pivotal {btype=1; pivtype=2;} } #endif if(!btype) { if (ipivot>=0) // then we have a pivotal odd prime {btype=1; pivtype=1;} } int atype = !btype; // NB We do not use 2 as a pivotal prime when the 2-adic index is 4, // since we have not implemented the corresponding local map from // quartics to (Z/2Z)^2 which maps large quartics to one of the // three non-trivial elements. So when the 2-adic index is 4, we // only use large quartics for pivoting when there is an odd pivotal // prime suitable. vector& qlist = (atype? qlista : qlistb); if(atype) {thisnumber=nquarticsa; nfl=nfirstlota; ab='A';} else {thisnumber=nquarticsb; nfl=nfirstlotb; ab='B';} qlist[thisnumber].assign(a,b,c,d,e,croots,type,ii,jj,disc); quartic& thisq = qlist[thisnumber]; if (verbose) cout << thisq << "\t"; if (verbose>1) { cout << "(ipivot = "<1) cout<<"\nipivot = "<=nfl) H=posmod(hscale*H,auxpiv); // Check if it would now be sieved out: long fl = flags[ipivot][aa][H]; if(verbose>1) cout<<(i+1)<<"-th quartic in list has flag = "<1) cout<<" (pivotal prime =" << auxs[ipivot] << ")";} cout<2 else // use 2-adic refinement to determine index (case 1) { bigint a = -27*ii/4; bigint b = -27*jj/4; if(verbose>1) cout<<"Case 1 with a = I/4 = "<2 else // use 2-adic refinement to determine index (case 2) { bigint a = -7-27*(ii-1)/4; bigint b = -14-27*(jj-2)/4; if(verbose>1) cout<<"Case 2 with a = (I-1)/4 = "<2 cout<<"2-adic index = "<1 vector plist0 = getbad_primes(*the_curve); // sorted by construction // now make sure 2 and 3 are in the list of primes vector p23 = {two, three}; set_union(plist0.begin(),plist0.end(),p23.begin(),p23.end(),back_inserter(plist)); // cout<<"\nplist0 = "<1) { cout << ah_count << "\t (a,b,c) triples in search region\n"; cout << ah_sieve_1 << "\t failed c-divisiblity,\n"; cout << ah_sieve_2 << "\t failed syzygy sieve,\n"; cout << ah_sieve_0 << "\t passed sieve.\n"; cout << ah_rfail << "\t failed syzygy after sieving,\n"; cout << ah_dfail << "\t failed d-integrality,\n"; cout << ah_efail << "\t failed e-integrality,\n"; cout << ah_extra2fail << "\t failed extra-2 divisibility conditions,\n"; cout << ah_pass << "\t passed all and produced quartics.\n"; } } // End of getquartics() void rank1::getquartics1() { if (verbose) cout<<"Looking for quartics with I = "<< ii << ", J = " << jj << endl; static bigint zero(0); IJ_curve = Curvedata(zero,zero,zero,-27*ii,-27*jj,0); // don't minimise if (posdisc) { gettype(2); // get type 2s first as they are a subgroup of index 1 or 2 if (!success) return; if(!(have_eggpoint || have_large_quartics)) { gettype(1); if (!success) return; } } else { gettype(3); if (!success) return; } } // of getquartics1() void rank1::gettype(int t) // new hybrid version 13/2/96 { type=t; long a,astep, amin=0, amax=0, firsta, lasta; long b,bstep; long c,cstep,cmod3; int a_is_odd, b_is_odd, a_div_by_4; int a_positive; bigint I48=48*ii, J64=64*jj; static const bigint m27(-27); static const bigfloat root27=sqrt(to_bigfloat(27)); static const bigfloat zero=to_bigfloat(0); bigint rsq, r, rem, h, d, e, ee; bigfloat r1, r2, r3, xr; long efactor; bigcomplex c1; // Unnecessary initializations to keep -Wall happy: bigfloat phi=zero,phi1,phi2,phi3; bigfloat amax0=zero, amin0, amax2, amin2, amax3, amin3; bigfloat hmin=zero, hmax=zero, hmin0=zero, hmax0=zero, hmin2, hmax2, htemp; bigfloat const6=zero,const5=zero,const3=zero,const2=zero; int extraextra2 = div(64,ii)&&div(128,jj); // Pascale's extra condition cmod3 = mod(jj,3); if (verbose) cout << "Looking for Type " << t << " quartics:\n"; // Set phi to be the real root in type 3, // else set the phi_i to be the three real roots // in descending order phi1 > phi2 > phi3: switch(type) { case 1: phi1 = real(cphi[0]); phi2 = real(cphi[1]); phi3 = real(cphi[2]); orderreal(phi1,phi2,phi3); // decreasing order hmax0 = 4*(phi3*phi3-xii)/3; if(verbose>1) cout<<"phi1 = "<0) const6 = sqrt(const2); // const2 must be >0 but avoid rounding problems hmin0 = 4*const5/3; amax0 = (abs(cphi[0]-cphi[1]) + 2*abs(cphi[0]-cphi[2]))/18; // (2*sqrt(phi^2-I)+sqrt(phi^2-4I))/6*sqrt(3) if(verbose>1) { cout<<"After sorting, phi = "<0) { amax2 = (phi+const6)/6; // const6 = sqrt(phi^2-4I) amax3 = 2*const5/(9*phi); // const5 = phi^2-I if(verbose>1) { if((amax2amax2) amax2=amax3; // so amax2=max of two previous if(amax2>amax0) { amax2=amax0; // so amax2=min of two previous } success = longify(amax2, amax, -1); // round down if (!success) { cerr<<"2-descent: upper bound "<amax0) { amax2=amax0; cout<<"New a upper bound worse, not using -- should NOT happen!"<1) { if((amin0amin3) amin2=amin3; // so amin2=min of two previous if(amin21) cout<<"Search range for a: ("<1) cout<<"Search range for a: ("<=0; a_positive--) #ifdef SQUARE_A_FIRST for(a_positive=2; a_positive>=0; a_positive--) #else for(a_positive=1; a_positive>=0; a_positive--) #endif { #ifdef SQUARE_A_FIRST int square_a_only = (a_positive==2); #endif if (a_positive) { firsta=amin; if(firsta<1) firsta=1; lasta =amax; if(firsta>lasta) continue; a=firsta-1; astep=1; if(verbose) { cout << "Trying positive a from " << firsta << " up to " << lasta; #ifdef SQUARE_A_FIRST if(square_a_only) cout << " (square a first...)"; else cout << " (...then non-square a)"; #endif cout<< endl; } } else // negative range will be traversed downwards! { firsta=amax; if(firsta>-1) firsta=-1; lasta =amin; if(firsta10000) { if(verbose) cout<<"**************\na range too big, quitting\n*************\n"; success=0; return; } #endif long iaux=num_aux; auto flagsi = flags.begin(); auto flagai = flaga.begin(); auto auxi=auxs.begin(); auto amodi=amod.begin(); auto hmodi=hmod.begin(); auto astepmodi=astepmod.begin(); auto hstepmodi=hstepmod.begin(); auto hscalemodi=hscalemod.begin(); while(iaux--) { *amodi++ = posmod(a, *auxi); *astepmodi++ = posmod(astep,*auxi); auxi++; } while(a!=lasta) { a+=astep; for(iaux=0, amodi=amod.begin(), auxi=auxs.begin(), flagai=flaga.begin(), flagsi=flags.begin(), astepmodi=astepmod.begin(); iaux=(*auxi)) (*amodi)-=(*auxi); *flagai = (*flagsi)[*amodi]; } #ifdef SQUARE_A_FIRST // First time through positive a, only look at square a: if(a_positive) { long roota=(long)(sqrt((double)a)+0.1); if((square_a_only)!=(a==roota*roota)) continue; } #endif // // Tests: not(4|a) if extra2, not(2|a) if extraextra2: // a_is_odd = (a&1); a_div_by_4 = !(a&3); if ((! (extra2 && (a_div_by_4))) && (! (extraextra2 && !(a_is_odd))) ) { #ifdef SHOW_ABC_RANGES if(verbose)cout<<"a = "<1) cout<<"hmin = "<1) cout<<"hmax1 = "<1) cout<<"hmax2 = "<hmax2) hmax = hmax2; //if(verbose>1) cout<<"hmax = "<hmax) { // cout<<"Empty H-range! hmin = "<hmin) { // cout<<"Empty H-range! hmin = "<cmax+1) cout<<"Empty c-range! cmin = "<cmax) continue; // Skip to next b #ifdef SHOW_ABC_RANGES if(verbose)cout<<":\tcmin = "<=(*auxi)) (*hmodi)-=(*auxi); } int flagok = (b_is_odd || even(c-Imod2)); if(!flagok) {ah_sieve_1++; continue;} ipivot=-1; for(iaux=0, hmodi=hmod.begin(), flagai=flaga.begin(); flagok&&(iaux0)&&(!(thisflag&8))&&(ipivot==-1)) { ipivot=iaux; pivflag=thisflag; } #endif } if(!flagok) {ah_sieve_2++; continue;} // We have an (a,b,c)-triple which passes the sieve test ah_sieve_0++; bigfloat xh=8*xa*c-xbb3; int ok=1; // Check that rounding has not put us outside the range: if((a_positive&&((xh>hmax)||(xhhmin)||(xh1) cout<<"(a,b,c)=("<abceps) {ah_dfail++; continue;} #endif #ifdef USE_BIGINTS ee=ii_cc+sb3*d; #ifdef DEBUG_AH cout<<"\n ii,b3,d,ee = "<abceps) {ah_efail++; continue;} d = Iround(xd); e = Iround(xe); #endif #ifdef DEBUG_AH cout << ":\n [" << a<<","<0 check that the type is correct if(posdisc) { bigint habcde = biga8*bigc-bigbb3; bigint qabcde = habcde*habcde-16*biga*biga*ii; // =3*Q if(type==1) { if((habcde<0)&&(qabcde>0)) { cout<<"Error: constructed quartic "; cout<<"[" << a<<","<=0)||(qabcde<=0)) { cout<<"Error: constructed quartic "; cout<<"[" << a<<","<3 if((extra2)&&(have_large_quartics)) { if (verbose) { cout << "Exiting search for large quartics after "; cout << "finding enough globally soluble ones.\n"; } return; } #endif // LARGE_Q>3 } // end of b-sign-loop } // end of c loop } // end of b conditions } // end of b loop } // end of a conditions } // end of main a loop } // end of loop on sign of a if (verbose) cout << "Finished looking for Type " << t << " quartics.\n"; } // end of gettype() rank1::rank1(Curvedata* ec, int verb, int sel, long lim1, long lim2,long n_aux) : rank12(ec,verb,sel,lim1,lim2,n_aux,1) { static bigint zero(0); traceequiv=0; success=1; // the default! if(num_aux==-1) num_aux=DEFAULT_NAUX; if(verbose>1) { cout << "Using (a,b,c) search with (a,h) sieve and algebraic method\n"; #ifdef USE_BIGINTS cout << "(with bigints to solve the syzygy)\n"; #else cout << "(with bigfloats to solve the syzygy)\n"; #endif } qlista.resize(maxnquartics); qlistb.resize(maxnquartics); qlistbflag.resize(maxnquartics); croots.resize(4); the_curve->getci(c4,c6); d1728 = c4*c4*c4-c6*c6; if (is_zero(d1728)) {cout<<"Curve is singular\n"; success=0; return;} // Set up the transformation [u,r,s,t] from the minimal model to the model // [0,0,0,-27*c4,-54*c6]; from these we will later obtain (by simple scaling) // the transformations to the IJ-curve for various I,J bigint a1,a2,a3,a4,a6,b2=getb2(*the_curve); the_curve->getai(a1,a2,a3,a4,a6); tr_u=6; tr_r=3*b2; tr_s=3*a1; tr_t=108*a3; vector ir = Introotscubic( zero,-27*c4,-54*c6); n0=ir.size()+1; long e0,e1,e2; if(!intlog2(n0,e0,0)) { success=0; cerr<<"\n\n!!! Fatal error in mwrank: n0=#E[2]="<1) { cout<<"After getquartics(): \n"; cout<<"n1 = "<"; cout<<"= "<0) { if(explanation_needed) { cout << "Points in A:\n"; } else { cout << "Points covering E(Q)/2E(Q):\n"; } for (long i=0; i0) { if(explanation_needed) { cout << "Points generating B:\n"; } else { cout << "Points generating E(Q)/2E(Q):\n"; } for (long i=0; i0)&&(npoints2>0); if(explanation_needed) { cout<<"p-adic filtration expresses E(Q)/2E(Q) as a direct sum A+B\n"; cout<<"where A = E(Q)\\cap\\sum 2E(Q_p) for certain primes p.\n"; cout<<"We list all nonzero points of A, and generators of B\n"; } if(npoints1>0) { if(explanation_needed) { cout << "Points in A:\n"; } else { cout << "Points covering E(Q)/2E(Q):\n"; } for (long i=0; i0) { if(explanation_needed) { cout << "Points generating B:\n"; } else { cout << "Points generating E(Q)/2E(Q):\n"; } for (long i=0; i rank1::getpoints() // We construct a set of coset reps for 2E(Q) in E(Q) given // reps for the subgroup A in pointlist1 and // gens for the complementary subgroup B in pointlist2 { static bigint zero(0), one(1); long np = (1+npoints1) << npoints2; vector ans; long j, k, ip=1+npoints1; ans.push_back(Point(the_curve, zero, one, zero)); ans.insert(ans.end(),pointlist1.begin(),pointlist1.end()); ans.resize(np); for(j=0; j rank1::getgens() const // Returns a set of generators for E(Q) mod 2E(Q) // (but not necessarily independent) { vector ans; ans.reserve(pointlist1.size()+pointlist2.size()); copy(pointlist1.begin(),pointlist1.end(),back_inserter(ans)); copy(pointlist2.begin(),pointlist2.end(),back_inserter(ans)); return ans; } void rank1::aux_init() // define auxiliary moduli and squares { auxs.resize(num_aux); aux_flags.resize(num_aux); aux_types.resize(num_aux); phimod.resize(num_aux, vector(3)); squares.resize(num_aux); flags.resize(num_aux); flaga.resize(num_aux); amod.resize(num_aux); hmod.resize(num_aux); hstepmod.resize(num_aux); astepmod.resize(num_aux); hscalemod.resize(num_aux); auxs[0]=9; // treated specially aux_flags[0]=1; aux_types[0]=0; long i=1, j; // the rest of the auxs must be chosen carefully: if possible they should // be good odd primes p, such that the resolvent cubic is not irreducible mod p. // If it has a unique root phi mod p, E(Qp)/2E(Qp) has order 2 and the coset in // which the image of a quartic lies depends on whether it has 0 or 2 roots mod p. // If it has 3 roots mod p, E(Qp)/2E(Qp) has order 4 and the coset in // which the image of a quartic lies depends on whether it has 0 or 4 roots mod p; // if 0, then a further condition determines which non-trivial coset it belongs to primevar pr; pr++; pr++; // skip past 2 and 3 for(;pr.ok()&&i0) { auxs[i]=p; aux_flags[i] = 1; aux_types[i] = 1; if(nr>1) aux_types[i] = 2; i++; } } // report on which primes will be used: if((verbose>1)&&(num_aux>0)) { cout<<"(a,h) sieving using " <(aux)); } // end of aux loop // initialize scaling factors for use with large I,J pair: // NB we use the same sieve for both; (a,h) passes for the larger I,J // iff (a,h/4) passes for the standard I,J. for(i=0; i1)&&(num_aux>0)) cout<<"finished aux_init()"<1)&&(num_aux>0)) cout<<"starting flag_init()"< a4phi(3); vector eps(3); #ifdef COUNT_CODES vector code_count(5, 0); #endif for(long i=0; ibegin(); for(a=0; a0) { a4phi[0] = (4*a*phimod[i][0])%aux2; if(case_2) { a4phi[1] = (4*a*phimod[i][1])%aux2; a4phi[2] = (4*a*phimod[i][2])%aux2; } } auto flagsiah = flagsia->begin(); for(h=0; h0) { cout << "Code count for p = " << aux << ":\n"; cout << 0 << "\t"<< 15 << "\t"<< 5 << "\t"<< 3 << "\t"<< 1 << "\n"; for (const auto& cc : code_count) cout< // for setbase(), used for hex output of codes #include #include #include #include #include #include #ifndef QSIEVE_OPT #define QSIEVE_OPT 0 // uses Stoll's sieve #endif //#define DEBUG_ROOTS //#define DEBUG_SQF //#define DEBUG_ELS //#define DEBUG_GLS // bound on first descent search when a second descent is going to be done #define FIRST_DESCENT_BOUND 8 #define MAX_R 5 // will not attempt to list all coset reps // for 2E(Q) in E(Q) if rank is more than this void rank2::makepoint(const bigint& c,const bigint& d1,const bigint& d2, const bigint& x, const bigint& y, const bigint& z, int which) { Point P(ee); if (verbose) cout<<" (x:y:z) = ("<FIRST_DESCENT_BOUND) lim3=FIRST_DESCENT_BOUND; if(qs.search(lim3, 1, 1)) // maxnpoints, pos-x-only { qs.getpoint(x,y,z); makepoint(c,d1,d2,x,y,z,which); return 1; } if (verbose) cout<<" no rational point found (hlim="<1) { if(which) cout<<"\n"; cout<<"Finding els gens for E"; if(which) cout<<"'"; cout<<" (c"; if(which) cout<<"'"; cout<<"= "<& supp = (which? supp1 : supp0); long ns = supp.size(); if(verbose>1) { cout<<"Support (length "<=NTL_BITS_PER_LONG) { cerr<<"Too many primes dividing discriminant!\n"; cerr<<"mwrank cannot handle supports of more than "< elsgens; // use all torsion: added 24/6/02 // Find and process torsion vector torsion; if(which) torsion=torsion_points(eedash); else torsion=torsion_points(ee); long it,ntorsion=torsion.size(); #ifdef DEBUG_ELS cout<<"Number of torsion points = "<orderT1) {T1=T; orderT1=orderT;} } #ifdef DEBUG_ELS cout<<"Generator of maximal order = "<1) cout<<"Processing torsion d1 = " << d1 << endl; #endif index=makeindex(supp, d1, d1x); d1=d1x; // the square-free part, = d1/square #ifdef DEBUG_ELS if(verbose>1) cout<<"Squarefree part of d1 = " << d1 << endl; #endif if(mask&index) continue; if(index) { elsgens.push_back(d1); nelsgens++; if(verbose>1) cout<<"Adding (torsion) els generator #"<1) cout<<"Testing d1 = "<1) cout<<"Adding els generator #"<1) cout<<"not locally soluble at p = "<1) { cout<<"After els sieving, nelsgens = " << nelsgens; cout << endl; cout<<"2-rank of S^{phi"; if(which) cout<<"'"; cout<<"}(E"; if(!which) cout<<"'"; cout<<") = "<0) cout<<"(els)gens: "<& elsgens = (which? elsgens1: elsgens0); long nelsgens = (which? els1: els0); long nt2gens = (which? nt2gens1: nt2gens0); bigint d1, d2, badp, x,y,z; unsigned long els2mask; long index; long maxn=1< els2gens; bitspace els2_space(nelsgens); // first record the torsion contribution: for(index=0; index1) cout<<"Processing torsion d1 = " << d1 << ":"<1) cout<<"Adding (torsion) els2 generator #"<<(nels2gens) <<": d1 = " << d1 <1) cout<<"res = " << res << endl; #endif if(res) { els2gens.push_back(d1); nels2gens++; els2_space.augment(els2mask,els2piv); #ifdef DEBUG_ELS cout<<"now bitmask = "<1) cout<<"Adding els2 generator #"<& elsgens = (which? els2gens1: els2gens0); long nelsgens = (which? els21: els20); long nt2gens = (which? nt2gens1: nt2gens0); vector gls_gens; bitspace gls_space(nelsgens); long glspiv, maxn = 1<1) { cout<<"Adding (torsion) gls generator #"<<(nglsgens+1) <<": d1 = " << d1 <1) { cout<<"Adding gls generator #"<<(nglsgens) <<": d1 = " << d1; #ifdef DEBUG_GLS cout<<" (g_pos = "<1) { cout<<"(c,d) =("<getai(a1,a2,a3,a4,a6); fullnpoints = npoints = 0; rank = 0; // default value if failure occurs int best_isogeny=0, best_rank_bound=999999; success = 1; int n, scaled=0; if (odd(a1) || odd(a3)) { s2= a1*a1+ 4*a2; s4= 8*(a1*a3+ 2*a4); s6= 16*(a3*a3+ 4*a6); scaled=1; } else { s2=a2; s4=a4; s6=a6; } vector xlist = Introotscubic(s2,s4,s6); ntwo_torsion = xlist.size(); if (ntwo_torsion==0) { success=0; if (verbose) cerr << "No points of order 2, cannot create rank2 class"<0) cout<<", "; cout<1)) { cout<<"****************************"<best_rank_bound); rank_bound=best_rank_bound; if(verbose&&best_isogeny>0) { cout<<"After second local descent, combined upper bound on rank = " <"; cout<<"= " << index2 << "\n\n"; if(do_second_descent) { cout<<"Information on III(E/Q):\n"; long lb = 1, lb1=1, ub = sha1; int eq=(lb==ub); cout<<"\t#III(E/Q)[phi'] "; if(eq) cout<<"= "<0) makegens(); if(rank<=MAX_R)makepoints(); } // end of "else" clause after if(selmer_only) } void rank2::makegens() { Curvedata ee_min; bigint u, r, s, t, x, y, z; int i; ee_min=ee.minimalize(u,r,s,t); if(verbose) { cout<<"-------------------------------------------------------\n"; cout << "\nList of points on E = " << (Curve)ee_min << ":\n"; cout<<"\nI. Points on E mod phi(E')\n"; if(npoints1==0) cout << "--none (modulo torsion).\n\n"; } for(i=0; i0) return; // avoids calling this twice int i, j; long smallindex = index2/(1+ntwo_torsion); fullnpoints=1; // will be smallindex fullpointlist.resize(smallindex); fullpointlist[0]=Point(the_curve); if(verbose&&(rank>0)) { cout<<"-------------------------------------------------------\n"; cout << "Computing full set of "<0)) cout << "done.\n" << endl; } void rank2::listpoints() { makepoints(); cout << "Points on curve E = " << (Curve)(*the_curve) << " covering E(Q)/2E(Q), modulo torsion:"; if(rank==0) cout<<" none."; else if(rank>MAX_R) cout << "Too many to list ("<MAX_R) cout << "Too many to list ("< #include #include #include #include #include #include #include #include #include #include #include #include #include // // some locally called general functions, belong in library maybe: // // unlikely to be called by anything but find_inf: vector roots_of_cubic(const Curve& E) { bigint a1,a2,a3,a4,a6; E.getai(a1,a2,a3,a4,a6); bigfloat ra1=I2bigfloat(a1), ra2=I2bigfloat(a2), ra3=I2bigfloat(a3), ra4=I2bigfloat(a4), ra6=I2bigfloat(a6); bigfloat c1 = ra2 + ra1*(ra1/4); bigfloat c2 = ra4 + ra1*(ra3/2); bigfloat c3 = ra6 + ra3*(ra3/4); return solvecubic(c1,c2,c3); } bigfloat min_real(vector array) { //cout<<"In min_real() with array:\t"< r)) {minr = r; first=0;} } } //cout<<"minr finally " << minr << "\n"; return minr; } int order_real_roots(vector& bnd, vector roots); //checks (and returns) how many roots are actually real, and puts those in //bnd, in increasing order, by calling set_the_bound int set_the_bounds(vector& bnd, bigfloat x0, bigfloat x1, bigfloat x2); //This transforms (if possible) x0, x1 and x1 into double; the search //should be made on [x0,x1]U[x2,infty] so if x1 or x2 overflows, the search //is on [x0,infty]. The function returns 3 in the first case, 1 in the second. //If x0 overflows, it returns 0. A warning is printed out. bigfloat det(const vector>& m, long m_size); // fwd declaration: det and detminor jointly recursive vector> get_minor(const vector>& m, long m_size, long i0, long j0) { vector> the_minor(MAXRANK, vector(MAXRANK)); for (long i=0; i=i0? i+1 : i); for (long j=0; j=j0? j+1 : j); the_minor[i][j] = m[ii][jj]; } } return the_minor; } bigfloat det_minor(const vector>& m, long m_size, long i0, long j0) { return det(get_minor(m,m_size,i0,j0), m_size-1); } bigfloat det(const vector>& m, long m_size) { bigfloat one = to_bigfloat(1); switch (m_size) { case 0: return one; break; case 1: return m[0][0]; break; case 2: return m[0][0]*m[1][1] - m[0][1]*m[1][0]; break; default: // Make a copy since we will change m before recursing vector> m1 = m; int neg = 0; long i,j,i0; bigfloat pivot=m1[0][0], piv, temp, eps=to_bigfloat(1.0e-6); for(i0=0; i00) // swap rows 0, i0: { neg = 1; for(j=0; j cleardenoms(vector alpha) { long len = alpha.size(); vector nlist(len); // returned vector dlist(len); long i, lcmd = 1; bigfloat x, last=alpha[len-1]; for (i=0; i < len-1; i++) // i doesn't include rank (new value) { x = alpha[i] / last; ratapprox(x, nlist[i], dlist[i]); lcmd = (lcmd*dlist[i]) / ::gcd(lcmd, dlist[i]); // ie lcm(d, dlist[i]) // ie we find the lcm of whole of dlist #ifdef DEBUG cout<<"ratapprox: of "<< x <<" is "<(MAXRANK)); } // NB We cannot use the default parameter mechanism as this must fit // the template for the virtual function declared in class // point_processor! int mw::process(const bigint& x, const bigint& y, const bigint& z) { return process(x,y,z,MAXSATPRIME); } int mw::process(const bigint& x, const bigint& y, const bigint& z, int sat) { #ifdef DEBUG cout<<"mw::process with x = "<< x <<", y = "<& Plist, int sat) { // process the points without saturation, do that at the end if(verbose) cout<<"Processing "<0)&&(rank>0)) { if (verbose) cout<<"saturating up to "< unsat; int sat_ok = satsieve.saturate(unsat, index, sat); if(verbose) { cout<<"done"; if (!sat_ok) { cout<<" (saturation failed for "<1) { basis = satsieve.getgens(); if(verbose) cout<<"Gained index "< 0) { if (verbose) cout<<" is torsion point, order "<0) { satsieve.set_points(basis); if (verbose) cout<<"saturating up to "< unsat; int sat_ok = satsieve.saturate(unsat, index, sat); if(verbose) { cout<<"done"; if (!sat_ok) { cout<<" (saturation failed for "<1) { basis = satsieve.getgens(); if(verbose) cout<<"Gained index "< alpha(rank1); // to store cofactors long detsign = ( odd(rank) ? +1 : -1 ); //set for flip before first use for (i=0; i < rank; i++) { detsign = -detsign; alpha[i] = det_minor(height_pairs, rank1, i, rank) * detsign; #ifdef DEBUG cout<<"alpha["< 1.0e-4 ) { reg = newreg; #ifdef DEBUG cout << "treating as NON-zero" << "\n"; #endif basis.push_back(P); rank=rank1; if (verbose) cout<<" is generator number "<0) { satsieve.reset_points(basis); if (verbose) cout<<"saturating up to "< unsat; int sat_ok = satsieve.saturate(unsat, index, sat); if(verbose) { cout<<"done, index = "<1) { basis = satsieve.getgens(); if(verbose) cout<<"Gained index "< sat) #ifdef DEBUG cout << "treating as ZERO" << "\n"; cout << "Finding a linear relation between P and current basis\n"; #endif vector nlist = cleardenoms(alpha); long index = nlist[rank]; #ifdef DEBUG cout<<"index = "<1) { cout<<"Difference = "<1) { cout<<"Difference = "<0) && ( (imin==-1) || (ni 1 ) { for (i=0; i <= rank; i++) { r = mod(nlist[i], min); q = (nlist[i] - r) / nlist[imin]; if ( r!=0 ) { basis[imin] += q*basis[i]; imin=i; min=abs(r); nlist[imin]=r; #ifdef DEBUG if (verbose) { for (j=0; j < rank; j++) cout< pts; bigint ib = index_bound(E,basis,pts,0,(verbose>1)); // Must make sure that the new points have the correct Curvedata pointer! for(unsigned int i=0; i1)) { cout<<"after search, gained index "<1) { basis = satsieve.getgens(); // completely recompute the height pairing matrix for (int i=0; i < rank; i++) { mat_entry(i,i) = height(basis[i]); for (int j=0; j < i; j++) { mat_entry(i,j) = mat_entry(j,i) = height_pairing(basis[i], basis[j]); } } reg /= (index*index); if(verbose) { cout<<"Gained index "< rts=solvecubic(c1,c2,c3); vector bnd(3); int nrr=order_real_roots(bnd,rts); #ifdef DEBUG_QSIEVE cout<getai(a1,a2,a3,a4,a6); int ncomp = getconncomp(*E); posdisc = ncomp==2; long i, j; // find pt of order two in E(R) with minimal x-coord vector rts = roots_of_cubic(*E); if(posdisc) { x1=real(rts[0]); x2=real(rts[1]); x3=real(rts[2]); orderreal(x3,x2,x1); // so x12^31 // and overflows // On 64-bit machines, h_lim must be < 43.668. long i,j; // set initial bounds for point coefficients alim = I2long(Ifloor(exp(h_lim))); clim = clim1 = clim2 = clim0 = I2long(Ifloor(exp(h_lim / 2))); if(posdisc) { if(x2<-1) { long temp = I2long(Ifloor(sqrt(alim/(-x2)))); if(clim1>temp) clim1=temp; } if(x1>1) { long temp = I2long(Ifloor(sqrt(alim/x1))); if(clim1>temp) clim1=temp; } } if (x3>1) { long temp = I2long(Ifloor(sqrt(alim/x3))); if(clim2>temp) clim2=temp; } clim=clim2; if(posdisc) if(clim1>clim2) clim=clim1; if (verbose) cout<< "sieve::search: trying a up to "<=aux) f -=aux; df += ddf; if(df >=aux) df -=aux; ddf +=dddf; if(ddf>=aux) ddf-=aux; } } // end of default case } // end of aux loop #ifdef DEBUG_SIEVE if(verbose) { for(i=0; i1) { for(i=0; iamin) amin=temp; temp = I2long(Ifloor(csq*x2)); if(tempamin) amin=temp; a_search(amin,amax); } } // ends c- loop } // end of sieve::search() void sieve::search_range(bigfloat xmin, bigfloat xmax, bigfloat h_lim) { // N.B. h_lim MUST be < 21.48 else exp(h_lim)>2^31 and overflows long i; // set initial bounds for point coefficients alim = I2long(Ifloor(exp(h_lim))); clim = clim1 = clim2 = clim0 = I2long(Ifloor(exp(h_lim / 2))); long temp; if(xmax<-1) { temp = I2long(Ifloor(sqrt(alim/(-xmax)))); if(clim1>temp) clim1=temp; } if(xmin>1) { temp = I2long(Ifloor(sqrt(alim/xmin))); if(clim1>temp) clim1=temp; } clim=clim2; if(clim1>clim2) clim=clim1; if (verbose) cout<< "sieve::search: trying a up to "<clim1) continue; // some preliminary calculations of multiples of c etc. csq = c*c /* long */; c2 = csq /* bigint */; c3 = c*c2; c4 = c2*c2; c6 = c2*c4; d1 = a1*c; d2 = a2*c2; d3 = a3*c3; d4 = a4*c4; d6 = a6*c6; long amin = -alim, amax = alim; temp = I2long(Iceil(csq*xmin)); if(temp>amin) amin=temp; temp = I2long(Ifloor(csq*xmax)); if(temp=0); i--) { long& amodi = amod[i]; amodi++; if (amodi == auxs[i]) amodi = 0; if(try_x) { try_x = xgood_mod_aux[i][amodi]; if(!try_x) modhits[i]++; } } if (!try_x) continue; pb=a; pb*=d1; pb+=d3; // pb = a*d1 + d3; // qb = d6 + a*(d4 + a*(d2 + a)); qb=a; qb+=d2; qb*=a; qb+=d4; qb*=a; qb+=d6; db = sqr(pb); db += (4*qb); if(isqrt(db,rdb)) { b = rdb-pb; b/=2; ac = a*c; Point P(*E, ac, b, c3); mwbasis->process(P); npoints++; } } // ends a-loop } void sieve::a_simple_search(const long& amin, const long& amax) { bigint pb,qb,db,rdb,rdb2,b,ac; long a; if (verbose) cout<<"sieve::search: trying c = "<process(P); npoints++; } } // ends a-loop } void sieve::stats(void) { cout << "\nNumber of points found: "<& bnd, vector roots) {//checks (and returns) how many roots are actually real, and puts those in //bnd, in increasing order, by calling set_the_bound long i,nrr=0; vector real_roots; for (i=0;i<3;i++) { if (is_approx_zero(roots[i].imag())) { real_roots.push_back(roots[i].real()); if (is_approx_zero(real_roots[nrr])) real_roots[nrr]=0; nrr++; } } // cout<<"nrr = "<& bnd, bigfloat x0, bigfloat x1, bigfloat x2) { if (doublify(x0,bnd[0])) { cout<<"##WARNING##: lowest bound "< #include #include #include // Functions for ordering newforms // (1) Old ordering (first aq, then ap for good p); // with the order for eigenvalues being // 1,-1 or 0,1,-1,2,-2,... // (2) New ordering (ap for all p in natural order) // with the order for eigenvalues being // -1,1 or ...,-2,-1,0,1,2,... (plain numerical order) // less_ap(a,b) returns +1,0,-1 according to whether a is // before/equal/after b in the above ordering int less_ap(long a, long b, int old=0) { if(!old) return sign(b-a); // the simple new ordering! if(a==b) return 0; int s = sign(abs(b)-abs(a)); if(s) return s; else return sign(a-b); // this way round! +1 before -1 etc } // Compare two ap-vectors lexicographically, using less_ap(.,.,old): int less_apvec(const vector& v, const vector& w, int old=0); int less_apvec(const vector& v, const vector& w, int old) { auto wi=w.begin(); for ( const auto& vi : v) { int s = less_ap(vi,*wi++,old); if(s) return s; } return 0; } // Old newform sorting comparison function: first by aq, then by ap, // each lexicographically, with individual eigs compared first by // absolute value, then positive first: struct old_newform_comparer { bool operator()(const newform& f, const newform& g) { int s = less_apvec(f.aqlist,g.aqlist,1); if(s==0) s = less_apvec(f.aplist,g.aplist,1); return (s==1); } } less_newform_old; // New newform sorting comparison function: only ap, // lexicographically, with individual eigs compared by // numerical value: struct new_newform_comparer { bool operator()(const newform& f, const newform& g) { return less_apvec(f.aplist,g.aplist,0)==1; } } less_newform_new; vector eiglist(const newform& f, int oldorder) { /* cout<<"Entering eiglist with f.aqlist="<2) { if(sign!=-1) cout<<"bplus = "<h1->extend_coords(bminus); tvec = nf->h1->contract_coords(bminusx); tvec /= denom; if (tvec!=bminus) { success=0; cout<<"! bminus="<h1->h1denom(); aqlist.resize(nf->npdivs); auto api=aplist.begin(); auto pi=nf->plist.begin(); auto aqi=aqlist.begin(); primevar pr; long q, i; long n = nf->modulus; while((api!=aplist.end())&&(aqi!=aqlist.end())) { q=pr.value(); pr++; if(::divides(q,n)) { *aqi++=*api; *api=(::divides(q*q,n)? 0: -*api); pi++; } api++; } if(aqi!=aqlist.end()) // compute missing aq { scalar piv; ssubspace espace; if(sign==-1) espace=make1d(bminus,piv, MODULUS); else espace=make1d(bplus,piv, MODULUS); piv*=denom; while(aqi!=aqlist.end()) // compute missing aq { q=*pi++; if(nf->verbose) cout<<"Computing Wq for q="<h1->s_heckeop_restricted(q,espace,1,0); long aq = Wq.elem(1,1) / piv; if(nf->verbose) cout<<"aq ="<verbose) cout<<"aqlist = "<npdivs); i++) sfe*=aqlist[i]; if(nf->verbose) cout<<"sfe = "<modulus; while((api!=aplist.end())&&(aqi!=aqlist.end())) { if(::divides(pr.value(),n)) *api=*aqi++; api++; pr++; } } // After recovering eigenbases, we need to replace the ap for bad p void newform::refix_eigs() { auto api=aplist.begin(); primevar pr; long n = nf->modulus, np = nf->npdivs, ip=0; while((api!=aplist.end())&&(ipp0) {pr++; api++;} ap0=*api; np0 = 1 + (nf->p0) - ap0; if(nf->verbose) cout<<"ap0 = "<mvp)*bplus; // should be negative since L(f,1)>=0 if (pdot>0) // NB This will ensure that plus modular symbols have the right // sign for curves where L(E,1) is nonzero, but more work is // necessary for the plus symbols when L(Em1)=0, and for minus // symbols. The additional work is done in find_matrix(). { coordsplus *= -1; bplus *= -1; pdot *= -1; } dp0=abs(pdot); // DO NOT scale pdot by denom: factor will cancel when used to compute ap // DO scale dp0 since it is used to compute L/P if(dp0!=0) { if(denomplus>1) { if(::divides(denomplus,dp0)) dp0/=denomplus; else cout<<"newform constructor error: dp0 not divisible by denomplus!" <verbose) { cout<<"pdot = "<h1->coord_vecs[i]; if(sign!=-1) coordsplus[i]=dotmodp(cvi,bplus,MODULUS); if(sign!=+1) coordsminus[i]=dotmodp(cvi,bminus,MODULUS); } contplus=content(coordsplus); if (contplus>1) coordsplus/=contplus; contminus=content(coordsminus); if (contminus>1) coordsminus/=contminus; if(sign!=+1) { denomminus=contminus*cuspidalfactorminus; if(verbose>1) cout<<"coordsminus = "<1)) { if(sign!=-1) { cout<<"cuspidalfactorplus = "<2) cout<<"bplusc = "<degphi(bplusc,bminusc,type); if(nf->verbose) cout<<"done..."<verbose); if(verbose) cout<<"computing twisting primes (sign="<squarelevel) return; long n = nf->modulus; for (primevar lvar; lvar.ok() && (((sign!=-1)&&(mplus==0)) || ((sign!=+1)&&(mminus==0))); lvar++) { //cout << "Trying l = " << lvar << endl; while (n%lvar==0) {lvar++;} long l = lvar; //cout << "Trying l = " << l << endl; if (legendre(-n,l)!=sfe) continue; //cout << "Legendre condition passed... " << endl; if((sign!=-1)&&(mplus==0)&&(l%4==1)) { lplus = l; //cout << "Trying lplus = " << l << "\n"; auto vi = nf->mvlplusvecs.find(l); if(vi==nf->mvlplusvecs.end()) mplus = (nf->mvlplusvecs[l]=nf->h1->manintwist(l))*bplus; else mplus = (vi->second)*bplus; // We force mplus>0 to fix the sign of the modular symbol to // agree with L(f*chi,1)>0, since L(f*chi,1) is real and a // positive multiple of mplus. This uses the fact that the // Gauus sum is +sqrt(l). if (mplus<0) { mplus *= -1; bplus *= -1; coordsplus *= -1; } if((denomplus>1)&&(mplus!=0)) { if(::divides(denomplus,mplus)) mplus/=denomplus; else cout<<"Warning in newform constructor: mplus not divisible by denomplus!" <mvlminusvecs.find(l); if(vi==nf->mvlminusvecs.end()) mminus = (nf->mvlminusvecs[l]=nf->h1->manintwist(l))*bminus; else mminus = (vi->second)*bminus; // We force mminus<0 to fix the sign of the modular symbol // to agree with L(f*chi,1)>0, since L(f*chi,1) is real and // a negative multiple of mminus. This uses the fact that // the Gauus sum is +i*sqrt(l). if (mminus>0) { mminus *= -1; bminus *= -1; coordsminus *= -1; } if((denomminus>1)&&(mminus!=0)) { if(::divides(denomminus,mminus)) mminus/=denomminus; else cout<<"Warning in newform constructor: mminus="<modulus; int found=0; vec v; for(d=2; !found; d++) { if(1==gcd(d,n)) { for(b=1; (bh1->coords(b,d).as_vec(); // cout<<"v="<0 for integration if(verbose) { cout<<"done: "; cout << "[(" <=nap) return; int verbose=(nf->verbose); // Do not make the espace right away, as it is possible that the // only ap we are missing are aq which we already have... ssubspace espace; int have_espace=0; scalar piv; primevar pr(nap,aplist.size()+1); while((int)aplist.size()modulus)) { if(::divides(p*p,nf->modulus)) ap=0; else ap=-aqlist[find(nf->plist.begin(),nf->plist.end(),p)-nf->plist.begin()]; } else { if(verbose>1) cout<<"Computing Tp for p="<h1->h1denom(); have_espace=1; } ap = (nf->h1->s_heckeop_restricted(p,espace,1,0)).elem(1,1) / piv; } aplist.push_back(ap); pr++; } if(verbose>1) cout<<"aplist = "<verbose); bigcomplex w1,w2; bigfloat x0, y0, xE, yE; // Definitions: for the period lattice of the optimal curve or // newform, x0 = (type)*(least real period) and y0 = (type)*(least // imag period)/i. Here type = #components = 1 (Delta<0) or 2 // (Deta>0). Note that if we are in the plus or minus quotient then // we can still compute these even though we do not now the type // since they generate the projections of the period lattice to the // real (resp. imaginary) axis. // Similarly xE, yE for the input curve E, though here we do know // the type. // Compute the real and/or imginary periods of the newform, which // are those of the optimal curve in the isogeny class: if (sign==+1) { nf->get_real_period(i,x0); x0 = 2*abs(x0); } else if (sign==-1) { // NB it is impossible to get the scaling right in this case nf->get_imag_period(i,y0); y0 = abs(y0); } else { Cperiods CP_opt = nf->getperiods(i); int opt_type = CP_opt.getwRI(w1,w2); x0 = opt_type * abs(w1.real()); y0 = abs(w2.imag()); } // Compute the real and/or imginary periods of the input curve, which may not be optimal: Cperiods CP(E); int Etype = CP.getwRI(w1,w2); xE = Etype * abs(w1.real()); // least real period yE = abs(w2.imag()); // least imag period // now xE, yE are twice the least real/imag part of a period of E in both cases // Now we find rational approximations to the rations x0/xE and // y0/yE. These will have very small numerators and denominators. long n,d; if (sign!=-1) { ratapprox(x0/xE,n,d,163); optimalityfactorplus = rational(n,d); if (verbose) cout << "x-ratio (optimalityfactorplus) = " << (x0/xE) << " = " <1) { cout<<"Approximate numerical values:"<1)&&(modulus<130000)) // reorder into old order { if(verbose) cout<<"Reordering newforms into old order as N<130000"<0) { int nap, maxnap=0; for(int i=0; imaxnap) maxnap=nap; if(verbose) cout<<"Max number of ap in newforms so far is "<1 this MUST be re-called after any sorting of newforms make_projcoord(); // Look for a j0 such that nflist[i].bplus/bminus[j0]!=0 for all i, or a set of such j find_jlist(); } void newforms::find_jlist() { int i, j, ok=0; j0=0; for(j=1; (!ok)&&(j<=h1->h1dim()); j++) { ok=1; for (i=0; (i1) cout<<"j0="<1) { cout<<"Newform #"<<(i+1)<<": bplus = "<1) { cout<<"Newform #"<<(i+1)<<": bplus = "< x0s; vector y0s; bigfloat x0,y0; if (check) for(long k=0; k "; rational alpha = ms.alpha(), beta = ms.beta(); long a=0, b=0, c=0, d=0, g=0; // intialise all, otherwise the compiler worries if (num(alpha)==0) { b = num(beta); d = den(beta); g = bezout(-modulus*b,d,c,a); // so g=a*d-b*N*c } long j=h1->coordindex[i]; long sg=::sign(j); j=abs(j); // cout<<"g="<=DEFAULT_SMALL_NAP) nap=DEFAULT_SMALL_NAP; else { cout<<"Warning: small newforms output will only have" << nap << "a_p (at least " << DEFAULT_SMALL_NAP <<"required" << endl; } } putout(out,(int)n1ds,binflag); putout(out,(int)nflist[0].aqlist.size(),binflag); putout(out, nap,binflag); nl(out,binflag); // Line 2: blank line nl(out,binflag); // Line 3: sign of f.e. for each newform for(i=0; i> data(n1ds, vector(16)); vector> aq(n1ds, vector(npdivs)); vector> ap(n1ds, vector(nap)); // read extra data for each newform (16 ints each) long ntotal = 16*n1ds; int* batch_i = new int[ntotal]; datafile.read((char*)batch_i,ntotal*sizeof(int)); int *batch_i_ptr = batch_i; for(j=0; j<16; j++) for(i=0; i aq(naq); for(primevar pr; (iqmaninvector(p0); long nap_default = long(100*sqrt(modulus)); if (nap > eigs(ncurves); int i; for(i=0; i Clist, int nap) { if(verbose) cout << "In newforms::createfromcurves_mini()..."<0) // construct the ap and aq vectors from the curves { long N = I2long(getconductor(Clist[0])); for(long i=0; i ap=eiglist(Clist[i],nap); vector aq=aqlist(ap,N); // dummy data -- these fields are not set and will not be used vector data(16,0); newform nf(data,aq,ap,this); if (verbose) { cout<<"adding this newform: "< * ap = new vector[n1ds]; for(i=0; i * aq = new vector[n1ds]; for(i=0; i * data = new vector[n1ds]; for(i=0; i> data[i][15]; // degphi // cout<<"degphi = "<> data[i][0]; // sfe // cout<<"sfe = "<> nloverp; // num(L/P) intdatafile >> dloverp; // den(L/P) intdatafile >> data[i][14]; // type // cout<<"type = "<> dp0; data[i][3]=dp0; // dp0 // cout<<"dp0 = "<> np0; data[i][2]=np0; // np0 // cout<<"np0 = "<maninvector(p0); if(verbose) cout << "Making form_finder (nap="< > eigs(nf_subset.size()); std::transform(nf_subset.begin(), nf_subset.end(), eigs.begin(), [this](const int& nfi) {return nflist[nfi].aplist;}); splitspace.recover(eigs); // NB newforms::use() determines what is // done with each one as it is found; // this depends on basisflag and sign if(verbose) cout << "...done."<1) cout<<"Reordering newforms after recovery"<1) {cout<<"Before sorting:\n"; display();} sort(int(modulus<130000)); // old order for N<130000, else new order if(verbose>1) {cout<<"After sorting:\n"; display();} } void newforms::merge(int all_nf) { if(n1ds==0) return; if(verbose) cout << "Making homspace..."<1) cout<<"merging newforms " << nf_subset << endl; unfix_eigs(); sort(); for (const auto nfi : nf_subset) { int inf = nf_subset[nfi]; if(verbose) cout << "Newform #"<<(inf+1)<<":"<nsymb); bminus.init(h1->nsymb); for(int i=1; i<=h1->nsymb; i++) { int j = h1plus->coordindex[i-1]; if (j==0) bplus[i] = 0; else if (j>0) bplus[i] = nflist[inf].coordsplus[j]; else if (j<0) bplus[i] = -nflist[inf].coordsplus[-j]; j = h1minus->coordindex[i-1]; if (j==0) bminus[i] = 0; else if (j>0) bminus[i] = nflist[inf].coordsminus[j]; else if (j<0) bminus[i] = -nflist[inf].coordsminus[-j]; } if(verbose) cout<< "done, about to contract bplus,bminus..."<contract_coords(bplus); bplus /= content(bplus); bminus = h1->contract_coords(bminus); bminus /= content(bminus); if(verbose) cout<< "done."<1) { cout << " new bplus = "<0) imagej.add_row(pcd,ind); else if(ind<0) imagej.sub_row(pcd,-ind); } vector newforms::apvec(long p) // computes a[p] for each newform { //cout<<"In apvec with p = "< apv(n1ds); if(::divides(p,modulus)) // we already have all the aq { if(::divides(p*p,modulus)) for (long i=0; i images; // [j,v] stores image of j'th M-symbol in v // (so we don't compute any more than once) vec bas, imagej; long p2=(p-1)>>1; // (p-1)/2 long sg, a, b, c, q, r; long u1,u2,u3; // Compute the image of the necessary M-symbols (hopefully only one) //cout<<"Computing images of M-symbols"<projcoord; //cout<<"projcoord = "<coordindex[h1->index2(u,p*v)]; update(pcd,imagej,ind); //cout<<"(1) (u1,u2)=("<1) // output the ap already known... { long j=0; for(primevar pr(nflist[0].aplist.size()); pr.ok(); pr++, j++) { long p = pr; if(ndivides(p,modulus)) cout<<"p="; else cout<<"q="; cout< apv=apvec(p); if(verbose>1) { if(ndivides(p,modulus)) cout<<"p="; else cout<<"q="; cout<nfproj_coords(num(r),den(r),nflist[i].coordsplus), nflist[i].cuspidalfactorplus); // {oo,r} = {0,r}+{oo,0} and loverp={oo,0} (not {0,oo}!) if (base_at_infinity) a+=nflist[i].loverp; a *= nflist[i].optimalityfactorplus; return a; } rational newforms::minus_modular_symbol(const rational& r, long i, int base_at_infinity) const { // Ignore the value of base_at_infinity as it does not affect the minus symbol rational a(h1->nfproj_coords(num(r),den(r),nflist[i].coordsminus), nflist[i].cuspidalfactorminus); a *= nflist[i].optimalityfactorminus; return a; } pair newforms::full_modular_symbol(const rational& r, long i, int base_at_infinity) const { mat m(h1->coord_vecs.size()-1,2); m.setcol(1,nflist[i].coordsplus); m.setcol(2,nflist[i].coordsminus); vec a = h1->proj_coords(num(r),den(r),m); rational a1(a[1],nflist[i].cuspidalfactorplus); // {oo,r} = {0,r}+{oo,0} and loverp={oo,0} (not {0,oo}!) if (base_at_infinity) a1 += nflist[i].loverp; a1 *= nflist[i].optimalityfactorplus; rational a2(a[2],nflist[i].cuspidalfactorminus); a2 *= nflist[i].optimalityfactorminus; return pair ( a1, a2 ); } // Attempt to compute and display the elliptic curve for each // newform; return a list of newform indices where this failed. vector newforms::showcurves(vector forms, int verbose, string filename) { if((verbose>1)&&(sqfac>1)) cout<<"c4 factor " << sqfac << endl; ofstream curve_out; int output_curves = (filename!="no"); if (output_curves) curve_out.open(filename.c_str()); bigfloat rperiod; bigint a1,a2,a3,a4,a6, N; vector badcurves; // will hold the indices of forms for which we fail to find a curve for( const auto& inf : forms) { if(verbose) cout<<"\n"<<"Form number "< #include #include #include #include #define OUTPUT_PARI_STYLE nfd::nfd(homspace* in_h1, int one_p, int w_split, int mult_one, int verbose) { h1=in_h1; long n = h1->modulus; long dimh = h1->h1dim(); long denh = h1->h1denom(); dH=denh; vector badprimes = h1->plist; mat K = basis(h1->kern).as_mat(); mat_m tp, tp1, m; long d, i,j, p; bigint ap1; Hscales.resize(dimh+1); Hscales[0]=1; for(i=1; i<=dimh; i++) Hscales[i]=Hscales[i-1]*denh; // Compute the desired linear combination of Tp: if(one_p) // Compute one Tp: { primevar pr; while (n%pr==0) pr++; p=pr; cout << "Computing T_p for p = " << p << "..." << flush; tp = to_mat_m(transpose(h1->newheckeop(p,0))); cout<<"done."<>p; if(p==0) break; if(p==1) { cout<<"Coefficient of identity: "; cin>>ap1; if(ap1!=0) tp = addscalar(tp,ap1); } else { cout << "Computing T_p for p = " << p << "..." << flush; tp1 = to_mat_m(transpose(h1->newheckeop(p,0))); cout<<"done."<>ap1; if(ap1!=1) tp1*=ap1; if(ap1!=0) tp+=tp1; } } } // Compute the appropriate W-eigenspace and restrict to it subspace_m SW(dimh); int dimsw=dimh; if(w_split) { int nq = badprimes.size(); for(i=0; (i0); i++) { long q = badprimes[i]; bigint eq; cout<<"Enter eigenvalue of W("<>eq; eq *=dH; mat_m wq = to_mat_m(transpose(h1->heckeop(q,0))); if(dimsw coeffs; while(looking) { cout<<"Enter factor number: "; cin>>j; if((j<1)||(j>nf)) {cout<<"Must be between 1 and "<1!\n"; continue;} d = deg(factors[j].a); cout<<"Degree = "<=0; i--) { minpol[i]=coeff(factors[j].a,i); coeffs[i]=coeff(factors[j].a,i)*Hscales[d-i]*Sscales[d-i]; m = addscalar(m,coeffs[i]); if(i) m = m*tp; } if(verbose) { cout<<"(unscaled) min poly = [1 "; for(i=d-1; i>=0; i--) cout<1) cout<1||(sden2>1)) { cout<<"S has denom "<1) { cout<<"WinvV = ";showmatrix(WinvV);cout<coord_vecs.size()-1; projcoord.init(ncoord,dims); coord_fac=0; vec_m mrowi(dims), coordi(dimh); vec rowi(dims); for (i=1; i<=ncoord; i++) { coordi = to_vec_m((h1->coord_vecs[i]).as_vec()); if(h1->cuspidal) coordi = to_vec_m(h1->cuspidalpart(to_vec_i(coordi))); mrowi = V*coordi; rowi = to_vec_i(mrowi); projcoord.setrow(i,rowi); coord_fac=gcd(coord_fac,(long)content(rowi)); } if(verbose>1) cout<<"content of projccord = "<1) projcoord /= coord_fac; Wdetdenom = coord_fac; Wdetnum*=dHS; Winv_scaled=Winv; bigint g; g=content(Winv_scaled.row(1)); for(i=2; i<=dims; i++) { Winv_scaled.multrow(i,Hscales[i-1]*Sscales[i-1]); g=gcd(g,content(Winv_scaled.row(i))); } // now g is the content of Winv_scaled Winv_scaled/=g; Wdetdenom*=g; g = gcd(Wdetnum,Wdetdenom); if(g>1) {Wdetnum/=g; Wdetdenom/=g;} cout<<"Basis for Hecke eigenvalues, in terms of powers of alpha:"<kern).as_mat(); long rk = K.nrows(); long k,l,n = h1->modulus, dims=dim(S); vec_m apvec(dims); int bad = ::divides(p,n); if(bad) return apvec; // temporary fix! matop matlist(p); // if(bad) // matlist=matop(p,n); for(k=0; ksymbol(h1->freegens[k]); for(l=0; lnewheckeop(p,0))),S); } mat_m nfd::heckeop(long p) { mat K = basis(h1->kern).as_mat(); long rk = K.nrows(); long j,k,l,n = h1->modulus, dimh=h1->h1dim(), dims=dim(S); int bad = ::divides(p,n); matop matlist(p); if(bad) { cout<<"q = "<applyop(matlist,h1->freemods[k])).as_vec(); if(h1->cuspidal) vt=h1->cuspidalpart(vt); colj += (mKkj*to_vec_m(vt)); } else { symb s = h1->symbol(h1->freegens[k]); for(l=0; lcuspidal) vt=h1->cuspidalpart(vt); colj += mKkj*to_vec_m(vt); } } } } TE.setcol(j+1,colj); } return transpose(V*TE); } bigint inverse(const mat_m& a, mat_m& ainv) { long d = a.nrows(); mat_m aug=colcat(a, mat_m::identity_matrix(d)); long rk, ny; vec pc,npc; bigint denom; mat_m ref = echelon(aug, pc, npc, rk, ny, denom); ainv = ref.slice(1,d,d+1,2*d); // cout<<"Inverse = "< #include #include inline int testbit(long a, long i) {return (a& (1< get_curves(string filename, long N) { vector curves; ifstream infile(filename.c_str()); if (!infile.is_open()) { cerr<<"Unable to open file "<> iN; // skip over curves whose conductors are too small while ((iN> code >> dum >> C >> dum >> dum >> dum; // check for end of file: infile >> ws; if (!infile.eof()) infile >> iN; } if (infile.eof()) return curves; // read curves whose conductors are just right while ((iN==N)&&!infile.eof()) { infile >> code >> dum >> C; CurveRed CR(Curvedata(C,0)); if (getconductor(CR)!=N) cerr<<"Wrong conductor "<> dum >> dum >> dum; // check for end of file: infile >> ws; if (!infile.eof()) infile >> iN; } // cout << "Read "<dlist) { if(M<11) continue; if(M==(N->modulus)) continue; getoldclasses(M,verbose); } if(verbose) cout<<"Finished getting oldclasses "<modulus; if ((d>10) && (n>d)) { if(verbose) cout << "Getting oldclasses for divisor M = " << d << "\n"; newforms olddata(d,verbose); string curve_file = curve_filename(d); if (file_exists(curve_file)) { vector curves = get_curves(curve_file,d); olddata.createfromcurves_mini(curves); } else { // if a newforms file exists for level d it will read data // from it, otherwise it will create the newforms at level d // (and store them) olddata.createfromdata(1,25, 1 /* create_from_scratch_if_absent */, 1 /* small_data_ok */); } long nforms = olddata.n1ds; long oldnap = olddata.nap; if(nforms==0) return; if(verbose>1) cout << "Computing W multiplicities." << "\n"; long m = n/d; long k=0, xmult, mult, j, beta; vector betalist; // =new long[N->npdivs]; for (const auto& qj : N->plist) { beta=val(qj,m); if(beta>0) k++; betalist.push_back(beta); } if(verbose>1) cout<<"betas: "< nextoldformap(nap); primevar pr; long iform, c, ip, aq; int bit; for(iform=0; iform& aqlist=olddata.nflist[iform].aqlist; nextoldformap = olddata.nflist[iform].aplist; if(verbose>1) { cout<<"form #"<<(iform+1)<<": "<<"aqlist="<1) cout<<"setting entry #"<1) cout<<"setting entry #"<0) { oldformap.push_back(nextoldformap); oldclassdims.push_back(mult); oldlevels.push_back(d); noldclasses++; } } } } } long oldforms::dimoldpart(vector aplist) const { long ans = 0; if (aplist.size()==0) return 0; // all lists "start with" a null list! for (long i=0; i0) { long nap0=nap; if(nap0>20) nap0=20; cout << "\nOld classes\n~~~~~~~~~~~\n"; cout << "Level Dimension " << primes(nap0) << "\n"; for (long i=0; i(oldformap[i].begin(),oldformap[i].begin()+nap0); cout << "\n"; } } cout<<"Total number of oldclasses = "< #include // for the realify_point() function // // P2Point member functions // void P2Point::reduce(void) { if(Z==1) return; // integral point, no work needed bigint d = gcd(gcd(X, Y), Z); if(sign(d)==0){ return ; } if(d!=1) { X /= d ; Y /= d ; Z /= d ; } if(sign(Z)<0){ ::negate(X) ; ::negate(Y) ; ::negate(Z) ; } } // P2Point input: 3 formats allowed are // [x:y:z], [x,y], [x/z,y/z] with any type of brackets istream& operator>>(istream & is, P2Point& P) { static const bigint zero(0), one(1); char c; is>>c; // swallow first bracket bigint x,y,dx,dy; is >> x >> c; // swallow comma or colon switch(c) { case ',': P.X=x; is >> P.Y >> c; P.Z=one; break; case '/': is >> dx >> c >> y >> c >> dy >> c; P.X=x*dy; P.Y=y*dx; P.Z=dx*dy; break; case ':': P.X=x; is >> P.Y >> c >> P.Z >> c; break; default: P.X=P.Y=P.Z=zero; // null point } P.reduce(); return is; } // test of equality of points int eq(const P2Point&P, const P2Point&Q) { if(sign(P.X*Q.Z-P.Z*Q.X)) return 0; if(sign(P.Y*Q.Z-P.Z*Q.Y)) return 0; if(sign(P.Y*Q.X-P.X*Q.Y)) return 0; return 1; } //#define DEBUG_REALIFY // the real x and y coords of the point // // There are different version for the various arithmetic options so // that when we are not using multiprecision floating point, we do not // overflow when the homogeneous coordinates are large // // NTL: temporarily use RR type void P2Point::getrealcoordinates(bigfloat&x, bigfloat& y) const { RR zp=to_RR(Z); #ifdef MPFP x=to_RR(X)/zp; y=to_RR(Y)/zp; #else x=to_double(to_RR(X)/zp); y=to_double(to_RR(Y)/zp); #endif #ifdef DEBUG_REALIFY cout<<"realifying P="< #include // for getenv_with_default #include //#define DEBUG_GPFACT #include #define DEFAULT_PARI_SIZE 100000000 #define DEFAULT_PARI_MAX_PRIME 1000000 void eclib_pari_init(long max_prime=DEFAULT_PARI_MAX_PRIME) { if (!avma) { long pari_size = strtol(getenv_with_default("PARI_SIZE", "DEFAULT_PARI_SIZE").c_str(), NULL, 0); if (pari_size==0) // e.g. syntax error in the environment variable PARI_SIZE pari_size = DEFAULT_PARI_SIZE; #ifdef DEBUG_GPFACT std::cout<<"calling pari_init with pari_size = "< #include // Function used to test whether a denominator found by ratapprox() is // "trustworthy": always with multiprecision, but only if below // a fixed bound otherwise. #ifdef MPFP // Multi-Precision Floating Point //inline int trust_denom(long d) { return (d<501);} // 1000);} inline int trust_denom(long d) { return (d<1201);} // 1000);} #else inline int trust_denom(long d) { return (d<251);} #endif // Given a newform (the i'th in newforms) at level n with a real // period x0; Finds a matrix [a0,b0;Nc0,d0] whose integral is // dotplus*x0+dotminus*y0*i N.B. The value of x0 may be changed, if we // come across some period whose real part is not an integer multiple // of the original x0. // We compute periods of lots of matrices in Gamma_0(N), over all // symbols {0,b/d} for d1) cout << "Matrix ("<1) cout<<"real part = " << x << ", x/x0 = " << ratio << " =~= "<1) { cout<<"******************************real part of period not an multiple of x0?\n"; if(verbose<=1) cout<<"real part = " << x << ", x/x0 = " << ratio << " =~= "<10) { drx=1; nrx=I2long(Iround(ratio)); cout << "Using rounded value nrx=" << nrx <0)) { if(d1) cout<<"replacing original x0 by "<0.001) { x0=x; have_rp=1; nrx=drx=1; if(verbose>1) cout<<"real period = " << x0 << "\n"; } bigfloat y = abs(integrator.iper()); if(have_ip) { bigfloat ratio=y/y0; ratapprox(ratio, nry, dry); // cout<<"dry = "<1) cout<<"imag part = " << y << ", y/y0 = " << ratio << " =~= "<0.001) { y0=y; have_ip=1; nry=dry=1; if(verbose>1) cout<<"imag period = " << y0 << "\n"; } if(!have_both && (x>0.001) && (y>0.001) && trust_denom(dry)) { have_both=1; if(trust_denom(drx)) {nrx0=nrx; drx0=drx;} nry0=nry; dry0=dry; // cout<<"nrx0="<1)) cout<<"c6 factor " << fac6 << endl; bigcomplex w1, w2; bigcomplex c4, c6; bigfloat x1=x0, y1=y0; for(nx=1; (nx<=maxnx); nx++) {x1=x0/to_bigfloat(nx); for(ny=1; (ny<=maxny); ny++) { y1=y0/to_bigfloat(ny); for(type=1; (type<=2); type++) { if(type==2){w1=bigcomplex(x1,zero); w2=bigcomplex(zero,y1);} else {w1=bigcomplex(2*x1,zero); w2=bigcomplex(x1,y1);} normalize(w1,w2); getc4c6(w1,w2,c4,c6); if (detail>1) { cout<<"w1 = "<1) cout << "Invalid c-invariants" << endl; } if(validc4c6) { Curve C(ic4,ic6); Curvedata CD(C,1); CurveRed CR(CD); bigint cond = getconductor(CR); if(cond==n) { if(detail)cout<<"Curve is "; cout << (Curve)CD << " N = " << cond << " "; // Check periods were correct: unsigned int disagree=0; Cperiods cpC(CD); bigcomplex wRC, wRIC; cpC.getwRI(wRC, wRIC); int Ctype = get_lattice_type(cpC); bigfloat x1C, y1C; if(Ctype==1) {x1C=real(wRC)/to_bigfloat(2); y1C=imag(wRIC);} else {x1C=real(wRC); y1C=imag(wRIC);} if(type!=Ctype) { disagree|=1; cout<<"Period lattice type of constructed curve does not match"<0.001)) { disagree|=2; cout<<"Real period of constructed curve does not match that" <<" of the newform"<1) cout<<"L(f,"<0.001) { nflist[i].lminus=ell; bigfloat ratio = y/y1; if(verbose>1) cout<<"ratio = "<1) { cout << "******************************L(f,"<10) { mm=I2long(Iround(ratio)); cout << "Using rounded value mminus=" << mm <1) cout << "lminus = "< #ifndef MPFP // Multi-Precision Floating Point #include #endif #define CHECK_PERIODS // check that curves constructed from periods // have the same periods... //#define TRACE_CACHE //#define TRACE_USE ///////////////////////////////////// // functions for character class // ///////////////////////////////////// character::character(long m) { modul=m; chartable.resize(m); init(); } void character::init() { if ( modul==1 ) chartable[0] = 1; else { long i=modul; while(i--) chartable[i] = legendre(i,modul);} } void character::reset(long m) { modul=m; chartable.resize(m); init(); } ///////////////////////////////// // functions for summer class // ///////////////////////////////// #ifndef NEW_OP_ORDER vector resort_aplist(const level* iN, const vector& primelist, const vector& apl) { long N = iN->modulus; //Sort out the aplist, since apl has the W_q eigs first: long nap=apl.size(); // cout<<"resort_aplist(), using "< aplist; aplist.reserve(nap); long ip = iN->npdivs; for(long i=0; iplist.begin(),iN->plist.end(),p); if(pi==iN->plist.end()) // then p is good { aplist.push_back( apl[ip++]); // cout << "i = "<aplist); rootmod = sqrt(to_bigfloat(N)); long bp = bit_precision(); Iasb(limit0,bp*rootmod/(TWOPI)) ; // brackets essential } void lfchi::compute(long ell) { chi.reset(ell); limit = limit1 = ell*limit0; factor1 = exp(-(TWOPI)/ (to_bigfloat(ell) * rootmod)); rootlimit=sqrt(to_bigfloat(limit)); an_cache.resize(I2long(Ifloor(rootlimit+1)),0); #ifdef TRACE_USE cout<<"lfchi.factor1 = "<loverp; x = abs(lx.value())*to_bigfloat(den(lop))/to_bigfloat(num(lop)); if(verbose) cout<<"real period = "<lplus; long mplus=nfi->mplus; if(mplus!=0) { if(verbose) cout << "Computing real period via L(f,chi,1) with chi mod " <dotplus); if (!dotplus) return 0; x /= dotplus; if(verbose) cout<<"real period (after scaling by "<lminus); long mminus=(nfi->mminus); if(mminus!=0) { if(verbose) cout << "Computing imaginary period via L(f,chi,1) with chi mod " <a<<","<b<<";"<c <<","<d<<"), dotplus="<dotplus <<", dotminus="<dotminus<<"; type="<type<dotplus), per.iper()/(nfi->dotminus), (nfi->type));; } else { if(verbose) cout<<"Finding periods -- via L(f_chi) using twists by " <lplus<<" and "<lminus<1) cout<<"factor = "< p | c4, c6 so we take advantage of the fact that c4, c6 // must be multiples of fac when rounding. // bigcomplex wR, wRI, w1, w2, c4, c6; Cperiods cp = getperiods(i, method, verbose); if(verbose) cout<1) cout << ", using factors " << fac << " for c4 and " << fac6 << " for c6"; cout<<":\n"; cout << "ic4 = " << ic4 << "\nic6 = " << ic6 << endl; } // To fix the c4 or c6 values insert data in files fixc4.data and // fixc6.data; NB the index here (i) starts at 0, but class fixc6 // adjusts so in the data files, start at 1 #ifndef MPFP // Multi-Precision Floating Point c4c6fixer(n,i,ic4,ic6); if(verbose) { cout << "After fixing: \n"; cout << "ic4 = " << ic4 << "\nic6 = " << ic6 << endl; } #endif Curve C(ic4,ic6); if(C.isnull()) return C; Curvedata CD(C,1); // The 1 causes minimalization CurveRed CR(CD); if (getconductor(CR) != n) { if (verbose) cout << "Constructed curve "<0.0001)) { cout<<"Real period of constructed curve does not match that" <<" of the newform (using bit precision "<0.0001)) { cout<<"Second period of constructed curve does not match that" <<" of the newform (using bit precision "<< bit_precision()<<")"< Av(r+1, one); // indexed from 0 to r while(!is_approx_zero(emx*term*Av[r])) { n++; // update A-vector, term and sum for(int j=1;j<=r;j++) Av[j]+=(Av[j-1]/n); term*=x; term/=n; y = Av[r]*term; ans+=y; // cout<<"\n"< Cv(r+1, zero); // indexed from 0 to r Cv[0]=one; while((n<1000) && !is_approx_zero(abs(emx2*term))) { n++; // update C-vector, term and sum for(int j=r;j>0;j--) Cv[j]+=(Cv[j-1]/n); term*=n; term*=mxinv; y = Cv[r]*term; ans+=y; // cout<<"\n"< // which includes curve.h #include #include // for the realify_point() function //#define DEBUG_TORSION // // Point member functions // // Shifts P via T = (u, r, s, t) on to newc. // N.B. Assumes that (1) T(P.E) = newc // (2) T(P) is on newc // "back" means use reverse transform Point transform(const Point& P, Curvedata* newc, const bigint& u, const bigint& r, const bigint& s, const bigint& t, int back) { if(P.is_zero()) return Point(newc); if(!P.isvalid()) cout << "Attempting to transform the point " << P << "which is not a valid point on its curve " << P.getcurve() << "!\n"; Point Q(newc,transform(P,u,r,s,t,back)); if(!Q.isvalid()) { cout << "Result of transforming the point " << P << " on curve "<<(Curve)*(P.E) << " via [u,r,s,t]=["<getai(A1,A2,A3,A4,A6); // coordinates of P const bigint& X1 = X ; const bigint& Y1 = Y ; const bigint& Z1 = Z ; // coordinates of Q const bigint& X2 = Q.X ; const bigint& Y2 = Q.Y ; const bigint& Z2 = Q.Z ; const bigint& Z12 = Z1 * Z2 ; const bigint& L = - Y2 * Z1 + Y1 * Z2 ; /* lambda */ const bigint& M = - X2 * Z1 + X1 * Z2 ; /* mu */ const bigint& N = - Y1 * X2 + Y2 * X1 ; /* nu */ const bigint& Mz = M * M * Z12 ; const bigint& t = L * L * Z12 + M * ( A1 * L * Z12 - M * (A2 * Z12 + X1 * Z2 + X2 * Z1 ) ) ; const bigint& newX = M * t ; const bigint& newY = - ( t * (L + A1 * M) + Mz * (N + A3 * M )) ; const bigint& newZ = M * Mz ; ans.init(E, newX, newY, newZ); return ans; } Point Point::operator-(const Point& Q) const // P - Q { Point ans = (-Q) ; ans += (*this); return ans; } Point Point::twice(void) const // doubles P { // do trivial cases Point ans(E); if( Z==0) return ans; bigint A1,A2,A3,A4,A6; E->getai(A1,A2,A3,A4,A6); Point minusthis = -(*this); if(eq(*this,minusthis)) return ans; // order 2 const bigint& Zsq = Z * Z ; const bigint& L = 3 * X * X + 2 * A2 * X * Z + A4 * Zsq - A1 * Y * Z ; const bigint& M = 2 * Y + A1 * X + A3 * Z ; const bigint& Mz = M * Z ; const bigint& N = - X * X * X -A3 * Y * Zsq + A4 * X *Zsq + 2 * A6 * Z *Zsq ; const bigint& t = L * L + Mz * ( A1 * L - M * ( A2 * Z + 2 * X ) ); const bigint& newX = t * Mz ; const bigint& newY = - ( L * t + Mz * ( A1 * t+ M * ( N + A3 * Mz * Z) ) ); const bigint& newZ = Mz * Mz * Mz; ans.init(E, newX, newY, newZ) ; return ans; } Point Point::operator-(void) const // -Q { Point negation(*this); negation.Y = -Y - (E->a3)*Z - (E->a1)*X; return negation; } // calculates nP Point operator*(int n, const Point& P) { Point ans(*(P.E)); if(P.is_zero() || n == 0) return ans; int negative = (n < 0) ; if(negative) n = - n ; if(n == 1) { ans = P; if(negative) ans = -P; return ans ; } // now n >= 2 if(n == 2){ ans = P.twice() ; if(negative) ans = -ans; return ans ; } // now n >= 3 if(n&1) ans = P ; // else ans is ZERO Point Q = P ; while(n > 1){ Q = Q.twice() ; // 2^k P n /= 2 ; if(n&1) ans = ans + Q ; } if(negative) ans = -ans ; return ans ; } int order(Point& p) { // ASSUME that point is valid; check before calling if unknown if (p.ord) {return p.ord;} bigint eight, z=p.getZ(); eight=8; if (is_zero(z)) {p.ord = 1; return 1; } if (z>eight) {p.ord =-1; return -1;} Point q = p; long ord=1; while ( (sign(z)!=0) && (z<=eight) ) // (worst denom of a torsion point) {ord++; q+=p; z = q.getZ(); } if (sign(z)!=0) ord = -1; p.ord = ord; return ord; } int order(Point& p, vector& multiples) { #ifdef DEBUG_TORSION cout<<"In order() with p = "<getai(A1,A2,A3,A4,A6); const bigint& Lhs = Y*Z*(Y + A1*X + A3*Z) ; const bigint& Rhs = A6*pow(Z,3) + X*(A4*Z*Z + X*(A2*Z + X)) ; return Lhs == Rhs ; } } // Find all points with a given rational x-coordinate: vector points_from_x(Curvedata &E, const bigrational& x) { // cout<<"Trying to construct points with x="< ans; bigint xn = num(x), xd2=den(x), xd, xd4, s, t, yn; // cout<<"xd2 = "< ans = torsion_points(*this); ntorsion = ans.size(); #ifdef DEBUG_TORSION cout<<"torsion_points() returns "< two_torsion(Curvedata& E, int exact) { #ifdef DEBUG_TORSION cout<<"\nIn two_torsion() with curve "<<(Curve)E<<"\n"; #endif bigint a1, a2, a3, a4, a6, b2, b4, b6, b8; static const bigint zero(0), one(1), eight(8), sixteen(16); E.getai(a1,a2,a3,a4,a6); E.getbi(b2,b4,b6,b8); int scaled=0; if (odd(a1) || odd(a3)) { b4*=eight; b6*=sixteen; scaled=1; } else { b2=a2; b4=a4; b6=a6; } vector xlist = Introotscubic(b2,b4,b6); vector two_tors; if (!exact) two_tors.push_back(Point(E)) ; // zero point for( const auto& ei : xlist) { if(scaled) two_tors.push_back(Point(E,2*ei,-a1*ei-4*a3,eight)); else two_tors.push_back(Point(E,ei,zero,one)); } ::sort(two_tors.begin(), two_tors.end(), Point_cmp); #ifdef DEBUG_TORSION cout<<"\ntwo_torsion() returning "< three_torsion_x(Curvedata& E) { #ifdef DEBUG_TORSION cout<<"\nIn three_torsion_x() with curve "<<(Curve)E<<"\n"; #endif bigint b2, b4, b6, b8; E.getbi(b2,b4,b6,b8); vector xlist = Introotsquartic(b2,9*b4,27*b6,27*b8); // NB The implementation of Introosquartic() in marith.cc does not // fix the order of the roots, which depends on the order of the // factors in NTL's Z[X] factorization routine. HENCE the order of // the 3-torsion point x-coordinates (when there are two) is not // well-defined without the sorting done here. #ifdef DEBUG_TORSION cout<<"\nthree_torsion_x() finds unsorted xlist = "< three_torsion(Curvedata& E, int exact) { #ifdef DEBUG_TORSION cout<<"\nIn three_torsion() with curve "<<(Curve)E<<"\n"; #endif static const bigint two(2); bigint a1, a2, a3, a4, a6, b2, b4, b6, b8, d, rd; E.getai(a1,a2,a3,a4,a6); E.getbi(b2,b4,b6,b8); vector xlist = three_torsion_x(E); vector three_tors; if (!exact) three_tors.push_back(Point(E)) ; // zero point for( auto& xi : xlist) { if(xi%3==0) // 3-torsion must be integral { xi/=3; d = ((4*xi+b2)*xi+(2*b4))*xi+b6; if(isqrt(d,rd)) { Point P(E,2*xi,rd-(a1*xi+a3),two); three_tors.push_back(P); three_tors.push_back(-P); } } } ::sort(three_tors.begin(), three_tors.end(), Point_cmp); #ifdef DEBUG_TORSION cout<<"\nthree_torsion() returning "< m_torsion(Curvedata& E, long m, int exact) { #ifdef DEBUG_TORSION cout<<"\nIn m_torsion() with m="< m_tors; if (m==0) // not a valid input for this function return m_tors; if (!exact) m_tors.push_back(Point(E)) ; // zero point if (m==1) return m_tors; // Now m is at least 3, m-torsion points are integral. // Compute the integer roots of the m-division polynomial vector xs = introots(division_polynomial(&E, m)); #ifdef DEBUG_TORSION cout<<" integer roots of m-division polynomial: "< Ps = points_from_x(E, bigrational(xi)); #ifdef DEBUG_TORSION cout<<" x = "< torsion_points(Curvedata& E) { if ( E.isnull() ) return vector(0); #ifdef DEBUG_TORSION cout<<"\nIn torsion_points() with curve "<<(Curve)E<<"\n"; #endif // Find the two-torsion subgroup, of order nt2 = 1, 2 or 4: vector two_tors = two_torsion(E); int nt2=two_tors.size(); #ifdef DEBUG_TORSION cout<<"Size of 2-torsion subgroup = " << nt2 << endl; cout << two_tors << endl; #endif // Find the group exponent, and largest cyclic cubgroup, given 2-torsion: // NB In these lists we must put multiples first, i.e. 9 before 3 etc vector possible_exponents; switch (nt2) { case 1: default: // cyclic of this odd order possible_exponents = {5, 7, 9, 3}; break; case 2: // cyclic of this even order possible_exponents = {12, 6, 8, 4, 10}; break; case 4: // non-cyclic of double this even order possible_exponents = {8, 6, 4}; break; } int exponent = 0; // will set to n if a point of order n is found vector cycle; // will set to the list of n multiples if ditto for (auto ni = possible_exponents.begin(); (exponent==0)&&(ni!=possible_exponents.end()); ++ni) { vector n_torsion = m_torsion(E, *ni, /* exact= */ 1); if (n_torsion.size()) { exponent = *ni; order(n_torsion[0], cycle); } } #ifdef DEBUG_TORSION if (exponent==0) cout<<" no torsion of order >2"< all_torsion = cycle, coset(cycle.size()); std::transform(cycle.begin(), cycle.end(), coset.begin(), [T2] (const Point& P) {return T2+P;}); all_torsion.insert(all_torsion.end(), coset.begin(), coset.end()); ::sort(all_torsion.begin(), all_torsion.end(), Point_cmp); return all_torsion; } //#define DEBUG_DIVISION_POINTS 1 vector Point::division_points(int m) // list of Q s.t. n*Q=this { #ifdef DEBUG_DIVISION_POINTS cout << "Attempting to divide " << (*this) << " by " << m << endl; #endif vector ans; vector Qs; auto test = [this, m] (const Point& Q) {return m*Q==*this;}; if (is_torsion()) { Qs = torsion_points(*E); std::copy_if(Qs.begin(), Qs.end(), std::back_inserter(ans), test); return ans; } // Now in the non-torsion case ZPoly pol = division_points_X_pol(E->a1,E->a2,E->a3,E->a4,E->a6, m, X, Z); #ifdef DEBUG_DIVISION_POINTS cout << "division poly = " << pol << endl; #endif vector xQs = roots(pol); #ifdef DEBUG_DIVISION_POINTS cout << " with roots " << xQs << endl; #endif for( const auto& xQ : xQs) { Qs = points_from_x(*E, xQ); // will have length 0 or 2 since non-torsion; only one works if (Qs.empty()) continue; Point Q = Qs.front(); ans.push_back(test(Q)?Q:-Q); } return ans; } int Point::is_on_real_identity_component() const { if(is_zero()) // the identity is nonsingular return 1; if(getconncomp(*E)==1) // there is only one component return 1; bigint b2 = getb2(*E), b4 = getb4(*E); bigint FD = 6*X*X + b2*X*Z + b4*Z*Z; if (sign(FD)<0) return 0; bigint FDD = 12*X + b2*Z; if (sign(FDD)<0) // assumes Z>0 return 0; return 1; } // return 1 if P mod p is nonsingular (or for p=0 if it is on the real identity component): int Point::has_good_reduction(long p) const { if(is_zero()) // identity is nonsingular return 1; if(p==0) return is_on_real_identity_component(); bigint pp(p); return has_good_reduction(pp); } int Point::has_good_reduction(const bigint& p) const { if(div(p, Z)) // identity is nonsingular return 1; if(::is_zero(p)) return is_on_real_identity_component(); bigint a1,a2,a3,a4,a6; E->getai(a1,a2,a3,a4,a6); bigint FY = 2*Y + a1*X + a3*Z; // no need for factor of Z int ok = ndiv(p, FY); if (!ok) { bigint FX = a1*Y*Z - (3*X*X + 2*a2*X*Z + a4*Z*Z); ok = ndiv(p, FX); if (!ok) { bigint FZ = Y*(Y + a1*X + 2*a3*Z) - (a2*X*X + 2*a4*X*Z + 3*a6*Z*Z); ok = ndiv(p, FZ); } } // cout << "P = "<<(*this)<<" has "<<(ok?"good":"bad")<<" reduction at p="<& plist, bigint& p0, int check_real) const { static const bigint zero(0); if (check_real) if (!is_on_real_identity_component()) { p0 = zero; return 0; } auto it = std::find_if(plist.begin(), plist.end(), [this](const bigint& p) {return !has_good_reduction(p);}); if (it==plist.end()) return 1; else { p0 = *it; return 0; } } // end of file: points.cc eclib-20250122/libsrc/pointsmod.cc000066400000000000000000001020731474421343600166430ustar00rootroot00000000000000// pointsmod.cc: implementation of classes pointmodq and curvemodqbasis ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // curvemodqbasis is derived from curvemodq (see file curvemod.h) and // contains a Z-basis for the group of points // The baby-step-giant step algorithm in my_bg_algorithm was // originally adapted from LiDIA's bg_algorithm(); it has some changes. // The point-counting and group structure algorithm in // my_isomorphism_type() provide the same functionality as LiDIA's // isomorphism_type() but has been rewritten from scratch; a main // difference from the LiDIA version is the use of Weil pairing when // the group is not cyclic. This is only intended for use when q is // small-medium sized (NOT cryptographic!). The current // implementation is only for prime fields, but the same strategy // would work over arbitrary finite fields. #include // which includes pointsmod.h void set_order_point(pointmodq& P, const bigint& n) {P.set_order(n);} pointmodq::pointmodq(const gf_element&x, const curvemodq& EE) // a point with X=x or oo if none : order(0), E(EE) { set_x_coordinate(x); } // make a point with given x & return true, or return false if none int pointmodq::set_x_coordinate(const gf_element& x) { is0flag=1; order=0; gf_element two=to_ZZ_p(2); gf_element four=to_ZZ_p(4); gf_element a1,a2,a3,a4,a6; E.get_ai(a1,a2,a3,a4,a6); // cout<<"E = "<twice(); else return ans; // =oo } gf_element lambda = (Y-YQ)/(X-XQ); gf_element mu = Y-lambda*X; ans.X = lambda*(lambda+(E.a1))-(E.a2)-X-XQ; ans.Y = lambda*(ans.X)+mu; ans.is0flag=0; ans.order=0; if(!(ans.on_curve())) { cerr<<"error in pointmodq::operator+() adding "<<(*this)<<" to "<negate(); } pointmodq pointmodq::twice(void) const // doubles P { pointmodq ans(E); if(is0flag) return ans; // Do NOT make these static as the modulus might change! gf_element two=to_ZZ_p(2); gf_element three=to_ZZ_p(3); gf_element a1,a2,a3,a4,a6; E.get_ai(a1,a2,a3,a4,a6); gf_element den = two*Y+a1*X+a3; if(den==0) return ans; gf_element lambda=(three*X*X+two*a2*X+a4-a1*Y)/den; gf_element mu = Y-lambda*X; ans.X = lambda*(lambda+a1)-a2-two*X; ans.Y = lambda*(ans.X)+mu; ans.is0flag=0; ans.order=0; if(!(ans.on_curve())) { cerr<<"\nerror in pointmodq::twice() with P = "<<(*this)<<": "<<(ans)<<" not on "<= 2 if(n == 2){ ans = P.twice() ; return (negative? -ans : ans); } // now n >= 3 if(n&1) ans = P ; // (else ans is still 0 from initialization) pointmodq Q = P ; while(n > 1){ Q = Q.twice() ; // 2^k P n /= 2 ; if(n&1) ans = ans + Q ; } return (negative? -ans : ans); } // calculates nP for bigint n pointmodq operator*(const bigint& n, const pointmodq& P) // n*P { static bigint one(1); static bigint two(2); pointmodq ans(P.get_curve()); if(P.is0flag || is_zero(n)) return ans; int negative = (is_negative(n)) ; bigint nn = n; if(negative) nn = - n ; if(nn == one) { return (negative? -P : P); } // now nn >= 2 if(nn == two){ ans = P.twice() ; return (negative? -ans : ans); } // now nn >= 3 if(odd(nn)) ans = P ; // (else ans is still 0 from initialization) pointmodq Q = P ; while(nn > one){ Q = Q.twice() ; // 2^k P nn >>= 1 ; if(odd(nn)) ans = ans + Q ; } return (negative? -ans : ans); } pointmodq curvemodq::random_point() { gf_element x; pointmodq ans(*this); while(ans.is_zero()) { random(x); ans=pointmodq(x,*this); } return ans; } pointmodq reduce_point(const Point& P, const curvemodq& Emodq) { // cout<<"Reducing "< "<1) cout<<" gen 1 = "<1) cout<<" gen 2 = "<1) { pointmodq Q1=(n1/n2)*P1; // order n2 cout<<"Computing "< curvemodqbasis::get_pbasis(int p) { vector ans; if((n%p)!=0) return ans; #if 1 if((n1%p)==0) ans.push_back((n1/p)*P1); if((n2%p)==0) ans.push_back((n2/p)*P2); #else ans = get_pbasis_via_divpol(p); #endif return ans; } //#define DEBUG_PBASIS vector curvemodqbasis::get_pbasis_via_divpol(int p) { vector ans; if((n%p)!=0) return ans; FqPoly pdivpol = makepdivpol(*this, p); #ifdef DEBUG_PBASIS cout< curvemodqbasis::get_pbasis_via_divpol(int p, const ZPoly& pdivpol) { vector ans; if((n%p)!=0) return ans; galois_field Fq = get_field(*this); NewFqPoly(Fq,pdivpolmodq); long i, d = deg(pdivpol); SetDegree(pdivpolmodq,d); for (i=0; i<=d; i++) SetCoeff(pdivpolmodq,i,ZtoGF(Fq,coeff(pdivpol,i))); #ifdef DEBUG_PBASIS cout< curvemodqbasis::get_pbasis_from_roots(int p, const vector& xi) { vector ans; if(xi.size()==0) { #ifdef DEBUG_PBASIS // cout<<"no "< xjp; pointmodq Q=P; for(i=0; i upper bound"< MAX_BG_STEPS) h = MAX_BG_STEPS; number_baby=h; map HT; H2 = Q-lower*P; H = pointmodq(P.get_curve()); //****** Babysteps, store [x(i * P),i] ********************* if (info) cout << " (#Babysteps = " << number_baby << flush; for (i = 1; i <= number_baby; i++) { H+=P; // H = i*P and H2 = Q-lower*P if (H == H2) // i * P = Q - lower* P, solution = lower+i { if (info) cout<<") "<second; H3=i*P; if (H3 == H2) { h = lower + i + j * step_size; #ifdef DEBUG assert(h * P == Q); #endif if (h <= upper) return h; else return minus_one; } } // H2 is in table H2-=H; } // loop on j return minus_one; } bigint my_order_point(const pointmodq& P, const bigint& mult) { vector plist = pdivs(mult); bigint ans(1); if(P.is_zero()) return ans; for( const auto& p : plist) { bigint m = mult; divide_out(m,p); pointmodq Q = m*P; while(!Q.is_zero()) {Q=p*Q; ans*=p;} } return ans; } bigint my_order_point(const pointmodq& P, const bigint& lower, const bigint& upper) { return my_order_point(P,my_bg_algorithm(P,pointmodq(P.get_curve()),lower,upper)); } bigint my_order_point(const pointmodq& P) { bigint q = get_field(P.get_curve()).characteristic(); bigint lower, upper; set_hasse_bounds(q,lower,upper); return my_order_point(P,lower,upper); } // returns minimal m>0 s.t. m*Q is in

with m*Q=a*P; n is assumed // to be the order of P. Special case: if and

are disjoint, // then m=order(Q) and a=0. On input, m holds order(Q) if known, else 0 bigint linear_relation( pointmodq& P, pointmodq& Q, bigint& a) { static bigint zero(0); static bigint one(1); bigint n = order_point(P), m = order_point(Q), g,n1,m1,h; int debug_linear_relation=0; if(debug_linear_relation) cout<<"In linear_relation() with P = "<1) cout<<"Order(Q) divides order(P)" <1) cout<<"Order(Q) = "<< ordQ <1) cout<<"Order(P) divides order(Q)" <0) cout<<"Order(Q) divides n2=" <0) cout<<"Order(Q) does not divide n1="<0) cout<<"New P1 has order " <1) {P2 = pointmodq(P2.get_curve()); n2=1;} return; } // General Case 3: // We find a multiple a*P1 such that Q-a*P1 is killed by n2target so // we can apply the Weil Pairing of order n2target Q1 = n2target*Q; Q2 = n2target*P1; // has exact order n1/n2target bigint a = my_bg_algorithm(Q2,Q1,bigint(0),n1/n2target); if(a==bigint(-1)) // dlog failed, n1 must be wrong { if(debug_iso_type) { cout<<"Dlog of "< n2list(const bigint& n1, const bigint& lower, const bigint& upper, const bigint& q) { bigint n2min = lower/n1, n2max = upper/n1, n2, g = gcd(n1,q-1); if(n2min*n1 ans; for(n2=n2min; n2<=n2max; n2++) if(div(n2,g)) ans.push_back(n2); return ans; } // find a point of "large" order void one_generator(curvemodq& Cq, bigint& n1, pointmodq& P1) { galois_field Fq = get_field(Cq); bigint q = Fq.characteristic(); bigint upper, lower; // bounds on group order set_hasse_bounds(q,lower,upper); if(debug_iso_type) cout<<"Lower and upper bounds on group order: [" <1) { cout<<"now P1 = "<1) cout<<"Q = "<1) { cout<<"now P = "<= lower int count=0; while(n1*n25) { m = linear_relation(P1,Q,a); if(debug_iso_type) cout<<"linear relation gives m="<a) cout<<"Replacing second generator by "<1) { P3=(n1/n2)*P1; // so P2,P3 are a basis for n2-torsion set_order_point(P3,n2); if(debug_iso_type) cout<<"storing generator "<1) { m = linear_relation(P1,P3,a); if(debug_iso_type) cout<<"linear relation gives m="< FqPoly reduce(const ZPoly& f, const galois_field& Fq) { NewFqPoly(Fq,fmodq); SetDegree(fmodq,Degree(f)); for(int i=0; i<=Degree(f); i++) SetCoeff(fmodq,i,ZtoGF(Fq,PolyCoeff(f,i))); return fmodq; } vector roots(const FqPoly& f) { // make f monic: FqPoly f1=f; MakeMonic(f1); // reduce to distinct roots case: ZZ_pX X; SetX(X); ZZ_pX g = PowerXMod(ZZ_p::modulus(),f1)-X; vec_ZZ_p r; FindRoots(r,GCD(f1,g)); vectorans; for(int i=0; i rootsmod(const vector& coeffs, bigint q) { galois_field Fq(q); NewFqPoly(Fq,f); unsigned long i, deg = coeffs.size()-1; SetDegree(f,deg); for (i=0; i<=deg; i++) SetCoeff(f,i,ZtoGF(Fq,coeffs[i])); vector r = roots(f); vectorans; for(i=0; i roots(const ZPoly& f) { #ifdef TRACE_ROOTS cout<<"Finding rational roots of polynomial f = "< ans; int i; ZPoly g; bigrational root; ZZ c; vec_pair_ZZX_long factors; factor(c,factors,f); #ifdef TRACE_ROOTS cout<<"f has " << factors.length() << " factors" << endl; #endif for(i=0; i introots(const ZPoly& f) { #ifdef TRACE_ROOTS cout<<"Finding integer roots of polynomial f = "< ratroots = roots(f); vector ans; if (ratroots.size()==0) return ans; for( const auto& r : ratroots) if (den(r)==1) ans.push_back(num(r)); sort(ans.begin(), ans.end()); return ans; } vector roots(const vector& coeffs) { #ifdef TRACE_ROOTS cout<<"Finding rational roots of polynomial f with coefficients "< ans; int i, d = coeffs.size()-1; // degree if(d<1) return ans; for(i=0; i<=d; i++) SetCoeff(f,d-i,coeffs[i]); #ifdef TRACE_ROOTS cout<<"f = "< Introotscubic(const bigint& a, const bigint& b, const bigint& c) { ZZX f; SetCoeff(f,3); // sets it to 1 SetCoeff(f,2,a); SetCoeff(f,1,b); SetCoeff(f,0,c); return introots(f); } vector Introotsquartic(const bigint& a, const bigint& b, const bigint& c, const bigint& d) { ZZX f; vec_pair_ZZX_long factors; bigint cont; SetCoeff(f,4); // sets it to 1 SetCoeff(f,3,a); SetCoeff(f,2,b); SetCoeff(f,1,c); SetCoeff(f,0,d); return introots(f); } // find the number of roots of X^3 + bX^2 + cX + d = 0 (mod p) int nrootscubic(const bigint& b, const bigint& c, const bigint& d, const bigint& p) { vector coeffs; coeffs.push_back(d); coeffs.push_back(c); coeffs.push_back(b); coeffs.push_back(bigint(1)); return rootsmod(coeffs,p).size(); } eclib-20250122/libsrc/qc.cc000066400000000000000000000057331474421343600152370ustar00rootroot00000000000000// qc.cc: implementation of function for mapping quartic point to curve ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include //#define DEBUG void qc(quartic& g, const bigint& x0, const bigint& y0, const bigint& z0, Curvedata * E, Curvedata* IJ_curve, const bigint& tr_u, const bigint& tr_r, const bigint& tr_s, const bigint& tr_t, Point& P, int verbose) { bigint aa,bb,cc,dd,ee,p,q,r,t,xp,yp,zp; bigint a=g.a, b=g.b, c=g.c, d=g.d, e=g.e; #ifdef DEBUG cout << "In qc(...) with:\n"; cout << "IJ_curve = "<<(Curve)(*IJ_curve)<<"\n"; cout << "min curve = "<<(Curve)(*E)<<"\n"; cout << "[u,r,s,t] = ["< #include bigfloat safe_sqrt(const bigfloat& x) { static bigfloat zero=to_bigfloat(0); if(x>zero) return sqrt(x); return zero; } bigfloat cube_root(const bigfloat& x) { return is_real_zero(x)? x : sign(x)*exp(log(fabs(x))/3); } // coeff contains deg+1 reals starting with the leading coefficient // which must be nonzero // // we assume the roots are distinct //#define DEBUG_REALROOTS vector realroots( const vector& coeff ) { #ifdef DEBUG_REALROOTS cout<<"In realroots with coeff = "< tcoeff; unsigned int i=0; while(is_real_zero(coeff[i])) i++; while(i0) // one real root { #ifdef DEBUG_REALROOTS cout<<"one real root "< ans = {a0, a1, a2}; return ans; } vector type3_covar(const bigfloat& xa, const bigfloat& xb, const bigfloat& xH, const bigfloat& rphi, const bigcomplex& cphi, int Risneg) { bigfloat a0, a1, a2; bigfloat a4=4*xa; static bigfloat three(to_bigfloat(3)); bigcomplex r1 = sqrt((a4*cphi-xH)/three); bigfloat r3 = sqrt(abs(a4*rphi-xH)/three); if(Risneg) r3 = -r3; #ifdef DEBUG_REDUCE cout<<"r1, r3 = "< ans = {a0,a1,a2}; return ans; } // Compute the quadratic covariant of a real quartic: vector quadratic_covariant(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const bigint& e) { bigint ii = II(a,b,c,d,e); bigint jj = JJ(a,b,c,d,e); bigint disc = 4*pow(ii,3)-sqr(jj); bigint H = H_invariant(a,b,c), R = R_invariant(a,b,c,d); bigfloat xH = I2bigfloat(H); bigfloat xii = I2bigfloat(ii), xjj=I2bigfloat(jj); bigcomplex c1(to_bigfloat(0)), c2(-3*xii), c3(xjj); vector cphi = solvecubic( c1, c2, c3); #ifdef DEBUG_REDUCE cout<<"Three roots phi are initially "< hcoeffs; // will hold coeffs of covariant quadratic bigfloat realphi, phi; // will hold specific real roots if(is_positive(disc)) { // all the phi are real; order them so that a*phi[i] decreases bigfloat phi1 = real(cphi[0]); bigfloat phi2 = real(cphi[1]); bigfloat phi3 = real(cphi[2]); if(is_positive(a)) orderreal(phi1,phi2,phi3); else orderreal(phi3,phi2,phi1); #ifdef DEBUG_REDUCE cout<<"Three real phi are "<a*phi2>a*phi3 if((is_negative(H))&&(H*H>16*a*a*ii)) { realphi = phi2; phi = phi2; #ifdef DEBUG_REDUCE cout<<"Type = 2, phi = "< hcoeffs = quadratic_covariant(a,b,c,d,e); unimod m1 = reduce_quad(hcoeffs[1],hcoeffs[2]); // m1 contains the transform to reduce the quadratic; // now update the input transform and quartic: m*=m1; apply_transform(a,b,c,d,e,m1); #ifdef DEBUG_REDUCE quartic newg(a,b,c,d,e); cout << "reduced quartic has coefficients " << newg << endl; #endif #ifdef REDUCE_B // Now reduce b so -2a < b <= 2a: bigint newa4=a<<2; bigint bmod4a = mod(b,newa4); bigint alpha; divide_exact((bmod4a-b),newa4,alpha); if(!is_zero(alpha)) { xshift(alpha,a,b,c,d,e,m); #ifdef DEBUG_REDUCE newg.assign(a,b,c,d,e); cout << "after reducing b (shifting by "<h int one_step(const bigfloat& x0, const bigfloat& y0, const bigfloat& h, bigint& a, bigint& b, bigint& c, bigint& d); unimod reduce_quad_1(const bigfloat& b, const bigfloat& c); unimod reduce_quad_2(const bigfloat& b, const bigfloat& c); unimod reduce_quad(const bigfloat& b, const bigfloat& c) { return reduce_quad_1(b,c); } // Given a pos. def. quadratic x^2+b*x+c, returns a unimod which // reduces it (whose inverse takes its root into the fundamental // region). unimod reduce_quad_1(const bigfloat& bb, const bigfloat& cc) { bigfloat b=bb, c=cc; bigfloat dz = 4*c-b*b; // should be positive! bigfloat xz = -b/2; bigfloat yz = sqrt(abs(dz))/2; #ifdef DEBUG_REDUCE_QUAD bigfloat az = c; cout << "Before any reduction:\n"; cout << "Covariant quadratic has coefficients 1, "<1 if(g>1) {c/=g; d/=g;} #ifdef DEBUG_FIRSTSTEP cout<<"first_step returns (a,b;c,d) = ("<1) cout<<"done, now max prime = "<1) cout<<"Continuing with q="<2) cout<<"Trying q="<2) cout<<"Computing order mod q = "<2) cout<<"Setting order mod "<second; if (verbose>2) cout<<"reusing order mod "<2) cout<<"Order mod "<10)); Emodq[q] = Eq; sieve.assign(Eq); q_tally[q] = 0; } else { sieve.assign(Eqi->second); // cout<<"Using stored reduced curve mod "<1) cout<<"Using q = "<maxq) { maxq=q; maxp=p; } mat_l TLim = sieve.map_points(Plistx); if(verbose>2) { cout<<"Adding "<2) { cout<<"New rank = "<1) cout<<"rank increases by "<<(newTLrank-TLrank)<<" to "<1) cout<0: int saturator::enlarge() { if(TLrank==rank) return 0; // no enlargement; should not be called in this case vec_l ker = basis(pkernel(TLimage, p)).col(1); if(verbose>0) cout<<"possible kernel vector = "<0) cout<<"This point may be in "< newQlist = Q.division_points(p); if (newQlist.size()>0) { newQ = newQlist[0]; } else { flag = 0; } } if(!flag) { if(verbose>0) { cout<<"...but it isn't! (this may be due to insufficient precision)"; } return 0; } if(verbose>0) cout<<"...and it is! "<0) cout<<"Replacing old generator #"<<(keepi+1) <<" with new generator "<1) cout<<"Testing "<1) cout<<"Points not (yet) proved to be "<

1) cout<<" enlargement failed!"<1) cout<<"Points not (yet) proved to be "<

lv2iv(const vector& v) { vector ans(v.size()); transform(v.begin(),v.end(),ans.begin(), l2i); return ans; } int i2l(int i) {return (long)i;} vector iv2lv(const vector& v) { vector ans(v.size()); transform(v.begin(),v.end(),ans.begin(),i2l); return ans; } int saturator::do_saturation(vector plist, long& index, vector& unsat, int maxntries) { vectoriplist = lv2iv(plist), iunsat; int ans = do_saturation(iplist,index,iunsat,maxntries); unsat = iv2lv(iunsat); return ans; } int saturator::do_saturation(vector plist, long& index, vector& unsat, int maxntries) { int success=1; index=1; if(verbose) cout<<"Checking saturation at "<=0, -1 if failed if(pi<0) { cout<0) { cout<<"Points have successfully been "<

& unsat, long& index, long sat_bd, long sat_low_bd, int maxntries) { // Determine the primes at which saturation is necessary: all those // up to index bound (but truncated at sat_bd unless this is -1), // and also the "Tamagawa primes" if the egr option is set vector satprimes; primevar pr; while(pr.value() ib) && ((sat_bd==-1) || (tp <= sat_bd)));}); if (verbose) cout << "Saturation primes are now" << satprimes << endl; } // do the saturation. Will return ok iff we succeeded in saturating // at all p in satprimes, otherwise the failures will be in unsat. int sat_ok = do_saturation(satprimes, index, unsat, maxntries); return sat_ok; } void saturator::show_q_tally() { cout << "Summary of auxiliary primes used" < pCoTorsion(const vector& AllTorsion, int p) { long i, maxorder=0, ntorsion = AllTorsion.size(); vector ans; // Case 0: if(ndivides(p,ntorsion)) return ans; // empty // find point Q of maximal order: Point P,Q; for(i=0; (imaxorder) { Q=P; maxorder=order(Q); } } ans.push_back(Q); // Case 1: if((maxorder==ntorsion)||(p>2)) return ans; // p-torsion is cyclic, return Q (generator) // Now order is 4, 8, 12 and torsion is not cyclic: add either // 2-torsion point not a multiple of Q: Q = (maxorder/2)*Q; // the 2-torsion point to avoid for(i=0; i& points, long& index, vector& unsat, long sat_bd, long sat_low_bd, int egr, int verbose) { saturator sieve(&C, egr, verbose); sieve.set_points(points); int ans = sieve.saturate(unsat, index, sat_bd, sat_low_bd); points = sieve.getgens(); if (verbose>0) sieve.show_q_tally(); return ans; } // Bound for the index of saturation for the given set of points. If // egr is set it determines the egr subgroup of the group the points // generate and only searches for points with egr, This might be faster // in some cases... // // Flaw: the point search carried out in order to find a lower bound // for the height of non-torsion points might find points which gain // some index on the input points, but we do not use this. Of course // the caller can do their own points search first, in which case // there is no (or less) loss, except that the searching has been done // twice. Some redesign would be needed to optimize this -- for // example, index_bound could be part of the mw class. // // New version 08/08/06: uses class CurveHeightConst and strategy in // ANTS7 paper to find a lower bound for the height of egr non-torsion // points // bigint index_bound(vector& points, int egr, int verbose) { int npts = points.size(); if (npts==0) return bigint(1); Curvedata C = Curvedata(points[0].getcurve(), 0); if(verbose) cout<<"Entering index_bound("<<(Curve)(C)<<", egr="<max_search_bound) { cout<<"\n***Warning: search bound of "<hcx) lambda=hcx; if(verbose) cout<<"Using lambda = "< // for qsort #include #include //debug info printed out if DEBUG_QS is defined to 0; more info if defined to 1 //#define DEBUG_FORBIDDEN //#define DEBUG_QS 0 //#define DEBUG_QS 1 int compare_entries(const void *a, const void *b) { double diff = (((entry *)a)->r - ((entry *)b)->r); return (diff > 0) ? 1 : (diff < 0) ? -1 : 0; } // *********************************************************** // Class qsieve // *********************************************************** //char qsieve::init_made = 0; long qsieve::prime[QS_NUM_PRIMES] = {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,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251}; double qsieve::ratio1_def = 1000; double qsieve::ratios2[QS_MAX_DEGREE+1] = { 0, 2.5, 4, 5, 6.5, 7.5, 9, 10.5, 12, 14, 15.5 }; double qsieve::ratio1 = 0.0; double qsieve::ratio2 = 0.0; long qsieve::tech = QS_DEFAULT_TECH; void qsieve::init_data() { init_made=0; bits= new bit_array[QS_LONG_LENGTH]; squares= new char*[QS_NUM_PRIMES]; is_f_square= new char*[QS_NUM_PRIMES]; pnn= new long[QS_NUM_PRIMES]; kpa= new long[QS_NUM_PRIMES]; check_denom=1; use_squares=0; odd_nums=0; num_surv1=0; num_surv2=0; long i; for (i=0;i coeff, int verb) : curve(acurve), degree(deg), verbose(verb) { long i; for (i=0;i<=degree;i++) c[i]=coeff[i]; #ifdef DEBUG_QS cout<<"In qsieve constructor, degree = "< coeff, bigfloat h_limx, int verb) : curve(acurve), degree(deg), verbose(verb) { double h_lim; doublify(h_limx,h_lim); long i; for (i=0;i<=degree;i++) c[i]=coeff[i]; #ifdef DEBUG_QS cout<<"In qsieve constructor, degree = "< coeff, double h_lim, double up, double low, int verb) : verbose(verb), curve(acurve), degree(deg) { long i; for (i=0;i<=degree;i++) c[i]=coeff[i]; #ifdef DEBUG_QS cout<<"In qsieve constructor, degree = "< interv,int nb_bnd,int start_low,int pos_x_only) { #ifdef DEBUG_QS cout<<"Entering set_intervals with nb_bnd="<interv[i+1]"<=height) j=nb_bnd; //done else { domain[num_inter].up=interv[j]; num_inter++; uplow++; j++; //goto next lower bound } } else //lower bound { if ((num_inter>0) && (interv[j]interv[i+1]"<=height) j=nb_bnd; //done else { domain[num_inter].low=interv[j]; uplow++; j++; //goto next upper bound } } } } if (uplow&1) //finish last interval { domain[num_inter].up=height; num_inter++; } #ifdef DEBUG_QS cout<<"Number of intervals:"<= 0 && sieve_primes1 > sieve_primes2) sieve_primes1 = sieve_primes2; else { if(sieve_primes1 > QS_NUM_PRIMES) sieve_primes1 = QS_NUM_PRIMES; } } } void qsieve::set_sieve_primes2(long sp2) { sieve_primes2=sp2; if(sieve_primes2 < 0) sieve_primes2 = 0; else { if(sieve_primes1 >= 0 && sieve_primes1 > sieve_primes2) sieve_primes2 = sieve_primes1; else { if(sieve_primes2 > QS_NUM_PRIMES) sieve_primes2 = QS_NUM_PRIMES; } } } void qsieve::init_f() { // if (verbose) // cout<<"Entering init_f"<= 0 ; n--) { s *= a; s += coeffs_mod_p[pn][n]; s %= p; } if((is_f_square[pn][a]=squares[pn][s])) np++; //np is the number of a / f(a) is a square mod p } // Fill array with info for p prec[pn].p = p; prec[pn].n = pn; if(degree&1 || squares[pn][coeffs_mod_p[pn][degree]]) { prec[pn].r = ((double)(np*(p-1) + p))/((double)(p*p)); } else { prec[pn].r = (double)np/(double)p; /* denominator divisible by p is excluded */ if(check_denom && (p > 7)) { forbidden[fdc] = p; fdc++; } } } #ifdef DEBUG_FORBIDDEN cout<<"Forbidden divisors of the denominator (>7): fdc="<= 0) ? sieve_primes2-1 : QS_NUM_PRIMES-1; double prod; if(ratio1 == 0.0) ratio1 = ratio1_def; prod = ratio1; for(n = 0; n < m; n++) { prod *= prec[n].r; if(prod < 1.0) break; } sieve_primes1 = n + 1; } if(sieve_primes2 < 0) { long n; if(ratio2 == 0.0) ratio2 = ratios2[degree]; for(n = sieve_primes1; n < QS_NUM_PRIMES; n++) if(ratio2*(1.0 - prec[n].r) < 1.0) break; sieve_primes2 = n; } for(long n = 0; n < sieve_primes2; n++) { pnn[n] = prec[n].n; sieves[n].p = prime[pnn[n]]; } if (verbose) { cout<<"Using speed ratios "<0) { cout<<"Sieving primes:\n First stage: "; int i; for(i = 0; i < sieve_primes1; i++) cout< tech and k*p maximal <= tech otherwise if(p > tech) kp = p; else kp = (tech/p) * p; kpa[pn] = kp; //determine which quotients a/b are excluded mod p long bb = (b_high >= p) ? p : b_high + 1; for (b=0;b>QS_LONG_SHIFT; if(aa == 0) aa = 1; if(!odd_nums) { //initialize help[][] for(b = 0; b < bb; b++) for(a = 0; a <= aa; a++) help[b][a] = bit_zero; if(p < (long)QS_LONG_LENGTH) //small p for(a = 0; a < p; a++) { if(is_f_square[pnn[pn]][a]) for(b = 1; b < bb; b++) { long ab = (a * b) % p; for(i = 0; i <= (long)QS_LONG_LENGTH/p; i++) //repeat the pattern { help[b][ab>>QS_LONG_SHIFT] |= bits[ab & QS_LONG_MASK]; ab += p; } } } else for(a = 0; a < p; a++) { if(is_f_square[pnn[pn]][a]) for(b = 1; b < bb; b++) { long ab = (a * b) % p; help[b][ab>>QS_LONG_SHIFT] |= bits[ab & QS_LONG_MASK]; } } } if(odd_nums || use_opt) { // prepare help2 for(b = 0; b < bb; b++) for(a = 0; a <= aa; a++) help2[b][a] = bit_zero; if(p < (long)QS_LONG_LENGTH) for(a = 0; a < p; a++) { if(is_f_square[pnn[pn]][a]) for(b = 1; b < bb; b++) { long ab = (a * b) % p; ab = (ab&1) ? (ab-1)>>1 : (ab-1+p)>>1; for(i = 0; i <= (long)QS_LONG_LENGTH / p; i++) { help2[b][ab>>QS_LONG_SHIFT] |= bits[ab & QS_LONG_MASK]; ab += p; } } } else for(a = 0; a < p; a++) { if(is_f_square[pnn[pn]][a]) for(b = 1; b < bb; b++) { long ab = (a * b) % p; ab = (ab&1) ? (ab-1)>>1 : (ab-1+p)>>1; help2[b][ab>>QS_LONG_SHIFT] |= bits[ab & QS_LONG_MASK]; } } } if(!odd_nums) { //fill that bit pattern into sieve[pn][][] //sieve[pn][b][a0] has the same semantics as help[b][a0], but here, a0 runs from 0 to kp-1 and all bits are filled. for(b = 1; b < bb; b++) { bit_array *si = sieve[pn][b]; bit_array *he = help[b]; long p1 = (QS_LONG_LENGTH/p + 1) * p; long diff_shift = p1 & QS_LONG_MASK; long diff = QS_LONG_LENGTH - diff_shift; bit_array diff_mask = ~(all_ones<>QS_LONG_SHIFT; for(a = 0; a < wp; a++) si[a] = he[a]; long a1; for(a1 = a ; a < p; a++) { he[a1] |= (he[(a1 == wp) ? 0 : a1 + 1] & diff_mask)<>= diff; } } } if(odd_nums || use_opt) { //fill in sieve2 for the case of only odd numerators */ for(b = 1; b < bb; b++) { bit_array *si = sieve2[pn][b]; bit_array *he = help2[b]; long p1 = (QS_LONG_LENGTH/p + 1) * p; long diff_shift = p1 & QS_LONG_MASK; long diff = QS_LONG_LENGTH - diff_shift; bit_array diff_mask = ~(all_ones<>QS_LONG_SHIFT; //copy the first chunk from help2[b][] into sieve2[pn][b][] for(a = 0; a < wp; a++) si[a] = he[a]; //now keep repeating the bit pattern, rotating it in help2 long a1; for(a1 = a ; a < kp; a++) { he[a1] |= (he[(a1 == wp) ? 0 : a1 + 1] & diff_mask)<>= diff; } } } // implement check for denominator divisble by p { bit_array pattern = bit_zero; if((degree & 1L) || squares[pnn[pn]][coeffs_mod_p[pnn[pn]][degree]]) pattern = ~bit_zero; if(!odd_nums) for(a = 0; a < kp; a++) sieve[pn][0][a] = pattern; if(odd_nums || use_opt) for(a = 0; a < kp; a++) sieve2[pn][0][a] = pattern; } } } } long qsieve::sift(long b) //In M. Stoll's code: "The following procedure is the heart of the matter. The overall speed of the program highly depends on the quality of the code the compiler produces for the innermost loops. It is advisable to force the compiler to put the variables surv, siv0, siv1 into registers. With gcc-2.7.2.1, I got a speedup of more than 30% ! -- MS" //For now, the restrictions on the registers used on a ix86 machine have been removed. They consist in assigning surv to "%ecx", siv1 to "%ebx", i and siv0 to "%edi", j to "%esi". ("on an ix86 machine with sufficiently new gcc; this will produce much better code in the sift function, resulting in a considerable speedup (> 30% on my machine -- MS)") { #if DEBUG_QS>0 cout<<"\nEntering sift b="<0 cout<<"num_inter="< hb) return(total); low = (long)floor(b*inter.low); } if(inter.up >= hb) high = height; else { if(inter.up < -hb) high = -height-1; else high = (long)ceil(b*inter.up); } high++; } if(use_odd_nums) { low >>= 1; high--; high >>= 1; } #ifdef DEBUG_QS cout<<"low = "<0 cout<<"After calling process(), halt_flag = "<0 cout<<"After calling process(), halt_flag = " <0 cout<<"After calling process(), halt_flag = "< 0 && prec[0].r == 0.0) { cout<<"sieve_primes2 = "<0 cout<<"After calling sift(), total = "<1)&&(num_aux>0)) cout<<"finished sifter constructor"<& v) { int i,j=0, first=1; for(i=0; i sifter::eps(const bigint& x, const bigint& z2) { vector ans; ans.reserve(max_dim_im); for(int i=0; i>=1; ans.push_back(c&1); } } return ans; } void sifter::process(const vector& Plist) { for ( const auto& P : Plist) { if(verbose) cout<<"Processing point "< image = eps(x,z2); vector pivrow; if(verbose) { cout << "Image = \t"; vecout(image); } for(i=0; ioperator-=(lambda); this->reduce_mod_p(p); } void smat::reduce_mod_p(const scalar& p) { svec rowi; for(int i=1; i<=nro; i++) { rowi = row(i); rowi.reduce_mod_p(p); setrow(i,rowi); } } smat& smat::operator*=(scalar scal) { if(scal==0) cerr<<"Attempt to multiply smat by 0\n"<first), vi->second,p); int i = (vi.first)-1; // the row of A to use (from 0) scalar c = vi.second; // the coefficient to multiply it by int d = A.col[i][0]; // #nonzero entries in this row int *posi = A.col[i] +1; // pointer to array of columns scalar *values = A.val[i]; // pointer to array of values while (d--) prod.add_modp(*posi++,xmodmul(c,*values++,p),p); } } return svec(prod); } svec mult_mod_p( const smat& A, const svec& v, const scalar& p ) { svec w(A.nrows()); if( v.d != A.ncols() ) { cerr << "incompatible sizes in A*v\n"; cerr << "Dimensions "< 0 ) s << *veci++; while ( n-- ) s << "," << (*veci++); s << "]"; s << " positions: " << "["; if( d > 0 ) { s << *posi++; d = d-1; } while ( d-- ) { s << "," << (*posi++); } s << "] }" << endl; } return s; } istream& operator >> (istream& s, smat& sm) { int *pos = new int [ sm.nco ]; scalar *values = new scalar [ sm.nco ]; int r, k, count; for( r = 0; r < sm.nro; r++ ) { cout << "input row " << r+1 << endl; int *p = pos; scalar *v = values; s >> k; for( count = 0; k != 0; s >> k ) { *v++ = k; s >> k; if( k ) *p++ = k; else { cerr << "invalid entry value 0 in smat input"<>1); m = mm; m.reduce_mod_p(pr); if(trace) { cout << "Lifting mod-p smat" << endl; if (trace>1) cout << "smat mod "<1) cout << "Lifted smat = " << m.as_mat() << "\n"; cout << " Lift has denominator "< #if(0) // This special version only works modulo BIGPRIME, not a general modulus: inline scalar xmm0(scalar a, scalar b) { if (a==1) return b; if (a==-1) return -b; if (b==1) return a; if (b==-1) return -a; //return xmodmul(a,b,m); //return (a*b) % m; //return (scalar)(((long)a*(long)b) % (long)m); /* this works fine: return (a*(int64_t)b) % BIGPRIME; */ // the following should work faster (no divisions! Thanks to David Harvey) if(a<0) a+=BIGPRIME; if(b<0) b+=BIGPRIME; int64_t ab = a*(int64_t)b; int64_t r = ab-((INV_BIGPRIME*(ab>>30))>>32)*BIGPRIME; r -= ( ((r>=TWO_BIGPRIME)?BIGPRIME:0) + ((r>=BIGPRIME)?BIGPRIME:0) ); /* // check: scalar r2 = (a*(int64_t)b) % BIGPRIME; if (r!=r2) { cout << "Problem with "<X int i; #ifdef TRACE_FIND cout<<"\n\t\tfinding "< ind; r-- ) array[1] = *array--; // array[1] = X; type *source = list_array+num-1; type *dest = list_array+num; size_t n = sizeof(type)*(num-ind); memmove(dest, source, n); list_array[ind]=X; num++; } } #ifdef TRACE_LISTS cout<<", result is "<<(*this)<put( X ); } num = L.num; } else { type *new_array = new type [ maxsize + L.num ]; type *na = new_array; for( int r = 0, ind = 0; r < L.num; r++ ) { type X = L.next(); ind = find( X, num-1, ind ); if( list_array[ind] != X ) { while( index < ind ) *na++ = next(); *na++ = X; } } while( index < num ) *na++ = next(); delete [] list_array; list_array = new_array; maxsize += L.num; L.index = index = 0; num = na - new_array; } #ifdef TRACE_LISTS cout<<"Result is "<<(*this)<reduce_mod_p(modulus); // cout<<"smat_elim::init() after reducing:\n"<<(smat)(*this)<list::put(r); } // cout<<"At end of init(), columns are: \n"; // for( l = 0; l < nco; l++ ) // cout<<(l+1)<<": "< 0 ) // this is a pivotal column for row r { k++; // the k'th pivot is (r,c) pc[k] = c; // pc[k] is its column, c } else // non-pivotal column { npc[++ny] = c; // record c as a non-pivotal column } } #if TRACE_ELIM cout << "pivotal columns: "<=0; i--) // set B[i] { bij = bi = B[i]; bij_nz = bi_nz; ij_nz = i_nz; ir = elim_row[i]; int nv=0; // counts # non-zero v for(t=0; ti { v = -elem(ir+1, npc[j+1]); Rt = R + rank-1; Bt = B + rank-1; t = rank-1-i; while(t--) { rr = *Rt--; if (is_nonzero(rr)) { ss = (*Bt)[j]; if (is_nonzero(ss)) { v = mod(v - xmodmul(rr, ss, modulus), modulus); } } Bt--; // must be outside the if(rr) } *bij++ = v; if (is_nonzero(v)) { nv++; *bij_nz++ = v; *ij_nz++ = j+1; } } #if TRACE_ELIM cout<<" setting row "<< position[ir]-1 <<" (from 0) of basis: "<< nv <<" non-zero entries out of "< co[0]) // there are more entries in this row than the // constructor gave us { delete [] co; delete [] va; co = bas.col[ir] = new int[nv+1]; va = bas.val[ir] = new scalar[nv]; } *co++ = nv; size_t nbytes = nv*sizeof(int); memmove(co,i_nz,nbytes); nbytes = nv*sizeof(scalar); memmove(va,bi_nz,nbytes); #if TRACE_ELIM cout<<" finished setting row "<< ir << endl; #endif } /* release memory dynamically allocated in this function using new */ b = B; i = rank; while(i--) delete [] *b++; delete [] B; // delete [] elim_row_inv; delete [] R; delete [] bi_nz; delete [] i_nz; #if TRACE_ELIM stop_time(); cout<<"time for computing basis: "; show_time(); cout<0) { #if TRACE_ELIM cout<<"Starting back-substitution..."< -1 ) { pc[++k] = i; new_row[k-1] = elim_col[i-1]; } else { npc[++ny] = i; } } /* write basis for kernel */ #if TRACE_ELIM cout<<"Constructing basis for kernel..."<num<<" "; // cout<num == 1 ) {col1=col0+1; L.put(col1);} #if TRACE_ELIM cout<<"Step 1, list size = "<num < 1 ) continue; int row = (column+col0-1)->next(); normalize( row, col0 ); /* update column */ int *pos = col[row]; int d = *pos++; while( d-- ) { int c = *pos++ - 1; (column + c)->remove(row); if((column + c)->num == 1) {col1=c+1; L.put( col1 ); // cout<<"List size increases to "<=0; col0-- ) { int vali = (column+col0)->num; if( vali == 2 || vali == 1 ) {col1=col0+1; L.put(col1);} } while( (col0 = L.next()) != -1 ) { if( (column+col0-1)->num < 1 ) continue; int row = (column+col0-1)->next(); normalize( row, col0 ); clear_col( row, col0, L, 0, 1 ); eliminate( row, col0 ); free_space( col0 ); } } void smat_elim::step4 ( ) { int* lightness = new int[nco]; int M, i, wt, r, row; // Find maximum column weight int maxcolwt=0; for( i = 0; i < nco; i++ ) { wt = (column+i)->num; if( maxcolwt < wt) maxcolwt=wt; } int M0 = maxcolwt; // max(20, int(maxcolwt/10)); // 20; int Mstep = int(maxcolwt/100); if (Mstep==0) Mstep=1; #if TRACE_ELIM cout<<"Step 4, max column weight = "<= 4; M--) //for( M = M0; M >= 3; M*=Mscale) for( M = M0; M >= 3; M-=Mstep) { #if TRACE_ELIM cout<<"Step 4, M = "<num; if( 0 < wt && wt <= M ) {*l++ = 1; nlight++;} //light else *l++ = 0; //heavy; includes columns already eliminated } #if TRACE_ELIM cout<<", "<num; if( (wt>0) && (mincolwt > wt) ) {col0=i+1; mincolwt=wt;} } if (col0==-1) return; // this is how the while(1) is ended #if TRACE_ELIM // cout<<"... wt "<next(); normalize( row, col0 ); list temp(0); clear_col( row, col0, temp ); eliminate( row, col0 ); free_space( col0 ); } #if TRACE_ELIM cout << "Finished elimination in sparse structure, density is now " << active_density() <num; int d = col[row][0]; int *pos1 = col[row]+1; if( numRow == 1 ) { for( int s = 0; s < d; s++ ) { int c = pos1[s] - 1; (column + c)->remove(row); if( fc ) check_col( c, L ); // check condition for cols if( M ) { int l = (column+c)->num; if( 0 < l && l <= M ) li[c] = 1; // col is light else li[c] = 0; // heavy; } } return; } list::listsize = numRow; /* for the d cols in col[row], these lists will contain rows to be taken * in/out of column */ list *list_row_out = new list [d]; list *list_row_in = new list [d]; if( !list_row_out ) {cerr << "memory exhausted in elim::clear_col"<index = 0; //reset index for iteration for( int l = 0; l < numRow; l++ ) { int row2 = (column+col0-1)->next(); if( row2 == row ) continue; int *pos2 = col[row2]; int d2 = *pos2++; int ind = find(col0, pos2, d2-1); if( pos2[ind] != col0 ) { cerr << "error in clear_col"<remove(row); column[c].remove(list_row_out[t]); (column+c)->put(list_row_in[t]); if( fc ) check_col( c, L ); // check condition for cols if( M ) { int l = (column+c)->num; if( 0 < l && l <= M ) li[c] = 1; // col is light else li[c] = 0; // heavy; } } delete [] list_row_out; delete [] list_row_in; } void smat_elim::free_space( int col0 ) { (column+col0-1)->clear(); } void smat_elim::check_row (int d, int row2, list& L ) { if( *col[row2] < 3 ) { if( *col[row2] == 0 ) position[row2] = 0; //if d <= 2 then row2 was already in the list, so else if( d > 2 ) L.put(row2); } } void smat_elim::check_col( int c, list& L ) { int vali = (column+c)->num; if( vali == 2 || vali == 1 ) {L.put(c+1);} } int smat_elim::get_weight( int row, const int* lightness ) { int wt = 0; int *pos = col[row]; int d = *pos++; while( d-- ) wt += lightness[ *pos++ - 1 ]; return wt; } int smat_elim::has_weight_one( int row, const int* lightness ) { int wt = 0; int *pos = col[row]; int d = *pos++; while( d-- ) { wt += lightness[ *pos++ - 1 ]; if (wt>1) return 0; } return (wt==1); } int smat_elim::n_active_cols() // number of active columns { // Remaining cols are those with positive column weight int j, nrc; for(j=nrc=0; jnum)>0) nrc++; return nrc; } int smat_elim::n_active_rows() // number of active rows { // Remaining rows are those with "position" code -1 or those which are empty int i, nrr; for(i=nrr=0; i0) && (position[i] == -1) ) nrr++; return nrr; } long smat_elim::n_active_entries() // number of active entries { // Remaining cols are those with positive column weight int j; long n=0; for(j=0; jnum); return n; } double smat_elim::active_density() // density of non-eliminated part { double d = n_active_entries(); int n = n_active_cols(); if (!n) return 0; d /= n; n = n_active_rows(); if (!n) return 0; d /= n; return d; } void smat_elim::report() { cerr << n_active_entries() << " active entries in (" << n_active_rows() << "," << n_active_cols() << ") active (rows, cols). Active density = " << active_density() << endl; cerr<<"Rank so far = "< remaining_rows, remaining_cols; // Remaining rows are those with "position" code -1 or those which are empty int i, j; for(i=0; i0) && (position[i] == -1) ) remaining_rows.push_back(i+1); int nrr = remaining_rows.size(); // Remaining cols are those with positive column weight for(j=0; jnum)>0) remaining_cols.push_back(j+1); int nrc = remaining_cols.size(); #if TRACE_DENSE cout< #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef SCALAR_OPTION #define scalar int #define vec vec_i #define mat mat_i #define subspace subspace_i #define svec svec_i #define smat smat_i #define SCALAR_OPTION 1 #include "smat.cc" #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef SCALAR_OPTION #define scalar long #define vec vec_l #define mat mat_l #define subspace subspace_l #define svec svec_l #define smat smat_l #define SCALAR_OPTION 2 #include "smat.cc" #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef SCALAR_OPTION #define scalar bigint #define vec vec_m #define mat mat_m #define subspace subspace_m #define svec svec_m #define smat smat_m #define smat_elim smat_m_elim #include "smat.cc" #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim eclib-20250122/libsrc/smatrix_elim.cc000066400000000000000000000041351474421343600173240ustar00rootroot00000000000000// smatrix_elim.cc: implementation of class smat_elim ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // Original version by Luiz Figueiredo #include #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim #undef ssubspace #define scalar int #define vec vec_i #define mat mat_i #define subspace subspace_i #define svec svec_i #define smat smat_i #define smat_elim smat_i_elim #define ssubspace ssubspace_i #include "smat_elim.cc" #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim #undef ssubspace #define scalar long #define vec vec_l #define mat mat_l #define subspace subspace_l #define svec svec_l #define smat smat_l #define smat_elim smat_l_elim #define ssubspace ssubspace_l #include "smat_elim.cc" #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim #undef ssubspace #define scalar bigint #define vec vec_m #define mat mat_m #define subspace subspace_m #define svec svec_m #define smat smat_m #define smat_elim smat_m_elim #define ssubspace ssubspace_m #include "smat_elim.cc" #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim #undef ssubspace eclib-20250122/libsrc/sqfdiv.cc000066400000000000000000000131701474421343600161220ustar00rootroot00000000000000// sqfdiv.cc : implementation of class sqfdiv for managing square-free divisors ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #include //#define DEBUG sqfdiv::sqfdiv(const bigint& dd, int posd, vector* plist) :primebase(plist), d(1), np(0), positive(posd), factor(0) { bigint p; for(unsigned long i=0; isize(); i++) if(p=(*primebase)[i],div(p,dd)) {d*=p; np++;} maxnsub=2<size(); (i>0)&&(!valp); i--) { p=(*primebase)[i-1]; if(div(p,d)) {valp=val(p,e); newpiv=i-1;} } // now if valp!=0, p|d and p|e to an odd power if(valp) {d/=p; np--; factor++; pivs[ngens++]=newpiv;} else if((e<0)&& !positive) {positive=1; factor++; pivs[ngens++]=-1;} //else e is square over the support of d so should have returned earlier! #ifdef DEBUG cout << "New gens: " << vector(gens.begin(),gens.begin()+ngens) << endl; cout << "New pivs: " << vector(pivs.begin(),pivs.begin()+ngens) << endl; cout << "New subgroup: " << vector(subgp.begin(),subgp.begin()+nsub) << endl; #endif } vector sqfdiv::getdivs() const { long nd=1<0; j--) { int jj = npcols[j]; basis(jj,j) = 1; for(int i=rank; i>0; i--) { scalar temp = -m(i,jj); for(int t=rank; t>i; t--) { int tt=pcols[t]; temp -= xmodmul(m(i,tt),basis(tt,j),pr); temp = xmod(temp,pr); } basis(pcols[i],j) = mod(temp,pr); } } return subspace(basis, npcols, scalar(1)); } subspace pimage(const mat& m, const scalar& pr) { vec_i p,np; long rank, nullity; const mat& b = transpose(echmodp(transpose(m),p,np,rank,nullity,pr)); return subspace(b,p,scalar(1)); } subspace peigenspace(const mat& m1, const scalar& lambda, const scalar& pr) { const mat& m = addscalar(m1,-lambda); return pkernel(m,pr); } subspace psubeigenspace(const mat& m1, const scalar& l, const subspace& s, const scalar& pr) { const mat& m = prestrict(m1,s,pr); const subspace& ss = peigenspace(m, l*(denom(s)),pr); return pcombine(s,ss,pr); } //Attempts to lift from a mod-p subspace to a normal Q-subspace by expressing //basis as rational using modrat and clearing denominators // int lift(const subspace& s, const scalar& pr, subspace& ans) { scalar dd; mat m; int ok = liftmat(s.basis,pr,m,dd); if (!ok) cerr << "Failed to lift subspace from mod "< #undef scalar #undef vec #undef mat #undef subspace #define scalar int #define vec vec_i #define mat mat_i #define subspace subspace_i #include "sub.cc" #undef scalar #undef vec #undef mat #undef subspace #define scalar long #define vec vec_l #define mat mat_l #define subspace subspace_l #include "sub.cc" #undef scalar #undef vec #undef mat #undef subspace #define scalar bigint #define vec vec_m #define mat mat_m #define subspace subspace_m #include "sub.cc" #undef scalar #undef vec #undef mat #undef subspace eclib-20250122/libsrc/svec.cc000066400000000000000000000244011474421343600155650ustar00rootroot00000000000000// svec.cc: implementation of sparse integer vector class svec ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // ONLY to be included by svector.cc // Definitions of member operators and functions: svec::svec(const vec& v) :d(dim(v)) { for(int i = 1; i <= d; i++ ) { scalar vi = v[i]; if(is_nonzero(vi)) entries[i]=vi; } } vec svec::as_vec( ) const { vec v(d); // initializes to 0 for (const auto& wi : entries) v[wi.first] = wi.second; return v; } scalar svec::elem(int i) const // returns i'th entry { auto vi = entries.find(i); if(vi==entries.end()) return scalar(0); return vi->second; } void svec::set(int i, const scalar& a) { if(is_nonzero(a)) entries[i]=a; } void svec::erase(int i) { auto vi = entries.find(i); if(vi==entries.end()) { cerr<<"Error in svec::erase(): cannot delete missing entry #"<first]=wi->second; wi++; } } else { if((vi->first)<(wi->first)) {vi++;} else if((wi->first)<(vi->first)) { entries[wi->first]=wi->second; wi++; } else { scalar sum = (vi->second) + (wi->second); if(is_nonzero(sum)) {vi->second = sum; vi++;} else {vi++; entries.erase(wi->first);} wi++; } } } return *this; } svec& svec::operator-=(const svec& w) { this -> operator+=(-w); return *this; } svec& svec::add_scalar_times(const svec& w, const scalar& a) { if (d!=w.d) { cerr << "Incompatible svecs in svec::add_scalar_times()"<first]=a*(wi->second); wi++; } } else { if((vi->first)<(wi->first)) {vi++;} else if((wi->first)<(vi->first)) { entries[wi->first]=a*(wi->second); wi++; } else { scalar sum = (vi->second) + a* (wi->second); if(is_nonzero(sum)) {vi->second = sum; vi++;} else {vi++; entries.erase(wi->first);} wi++; } } } return *this; } svec& svec::operator*=(const scalar& scal) { for ( auto& vi : entries) (vi.second)*=scal; return *this; } void svec::reduce_mod_p(const scalar& p) { auto vi = entries.begin(); while( vi != entries.end() ) { scalar a = mod(vi->second,p); if(is_nonzero(a)) { (vi->second)=a; vi++; } else { vi = entries.erase(vi); } } } svec& svec::mult_by_scalar_mod_p(const scalar& scal, const scalar& p) { scalar s = mod(scal,p); if(!is_one(s)) for( auto& vi : entries) (vi.second)=xmodmul(vi.second,s,p); return *this; } svec& svec::add_scalar_times_mod_p(const svec& w, const scalar& scal, const scalar& p) { if (d!=w.d) { cerr << "Incompatible svecs in svec::add_scalar_times()"<first]=xmodmul(a,(wi->second),p); wi++; } } else { if((vi->first)<(wi->first)) {vi++;} else if((wi->first)<(vi->first)) { entries[wi->first]=xmodmul(a,(wi->second),p); wi++; } else { scalar sum = xmod((vi->second) + xmodmul(a, (wi->second),p),p); if(is_nonzero(sum)) {vi->second = sum; vi++;} else {vi++; entries.erase(wi->first); } wi++; } } } // reduce_mod_p(p); return *this; } svec& svec::add_scalar_times_mod_p(const svec& w, const scalar& scal, std::set& ons, std::set& offs, const scalar& p) { ons.clear(); offs.clear(); if (d!=w.d) { cerr << "Incompatible svecs in svec::add_scalar_times()"<first]=xmodmul(a,(wi->second),p); ons.insert(wi->first); wi++; } } else { if((vi->first)<(wi->first)) {vi++;} else if((wi->first)<(vi->first)) { entries[wi->first]=xmodmul(a,(wi->second),p); ons.insert(wi->first); wi++; } else { scalar sum = xmod((vi->second) + xmodmul(a, (wi->second),p),p); if(is_nonzero(sum)) {vi->second = sum; vi++;} else {vi++; entries.erase(wi->first); offs.insert(wi->first);} wi++; } } } // reduce_mod_p(p); return *this; } svec& svec::add_mod_p(const svec& w, const scalar& p) { if (d!=w.d) { cerr << "Incompatible svecs in svec::add_scalar_times()"<first]=wi->second; wi++; } } else { if((vi->first)<(wi->first)) {vi++;} else if((wi->first)<(vi->first)) { entries[wi->first]=wi->second; wi++; } else { scalar sum = xmod((vi->second) + (wi->second),p); if(is_nonzero(sum)) {vi->second = sum; vi++;} else {vi++; entries.erase(wi->first); } wi++; } } } return *this; } svec& svec::sub_mod_p(const svec& w, const scalar& p) { add_mod_p(-w, p); return *this; } svec& svec::operator/=(const scalar& scal) { if(is_zero(scal)) cerr<<"Attempt to divide svec by 0"<& vi) {return xmod((vi.second)-(v2.elem(vi.first)),p)!=0;})) return 0; if (std::any_of(v2.entries.begin(), v2.entries.end(), [v1,p] (const pair& vi) {return xmod((vi.second)-(v1.elem(vi.first)),p)!=0;})) return 0; return 1; } int operator==(const svec& v1, const vec& v2) { if(v1.d!=dim(v2)) return 0; for(int i=1; i<=v1.d; i++) if(v2[i]!=v1.elem(i)) return 0; return 1; } ostream& operator << (ostream& s, const svec& v) { s<<"["; for(auto vi=v.entries.begin(); vi!=v.entries.end(); vi++) { if(vi!=v.entries.begin()) s<<","; s << "("<first<<":"<second<<")"; } s<<"]"; return s; } scalar operator*(const svec& v, const svec& w) //dot prod { scalar ans(0); if((v.entries.size()==0)||(w.entries.size()==0)) return ans; auto vi=v.entries.begin(), wi=w.entries.begin(); while((vi!=v.entries.end())&&(wi!=w.entries.end())) { if((vi->first)<(wi->first)) {vi++;} else if((wi->first)<(vi->first)) {wi++;} else { ans+=(vi->second)*(wi->second); vi++; wi++; } } return ans; } scalar operator*(const svec& v, const vec& w) //dot prod { scalar ans(0); if((v.entries.size()==0)) return ans; for( const auto& vi : v.entries) ans+=(vi.second)* w[vi.first]; return ans; } scalar dotmodp(const svec& v, const vec& w, const scalar& pr) { scalar ans(0); for( const auto& vi : v.entries) ans=mod(ans+xmodmul(vi.second,w[vi.first],pr),pr); return ans; } scalar dotmodp(const svec& v, const svec& w, const scalar& pr) { scalar ans(0); if((v.entries.size()==0)||(w.entries.size()==0)) return ans; auto vi=v.entries.begin(), wi=w.entries.begin(); while((vi!=v.entries.end())&&(wi!=w.entries.end())) { if((vi->first)<(wi->first)) {vi++;} else if((wi->first)<(vi->first)) {wi++;} else { ans=mod(ans+xmodmul(vi->second,wi->second,pr),pr); vi++; wi++; } } return ans; } scalar content(const svec& v) { scalar g(0); for( const auto & vi : v.entries) { g=gcd(g,vi.second); if (is_one(g)) return g; } return g; } scalar make_primitive(svec& v) // divides by & returns content { scalar c=content(v); v/=c; return c; } eclib-20250122/libsrc/svector.cc000066400000000000000000000033601474421343600163130ustar00rootroot00000000000000// svector.cc: implementation of class svec (sparse integer vectors) ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #include #undef scalar #undef vec #undef mat #undef subspace #undef svec #define scalar int #define vec vec_i #define mat mat_i #define subspace subspace_i #define svec svec_i #include "svec.cc" #undef scalar #undef vec #undef mat #undef subspace #undef svec #define scalar long #define vec vec_l #define mat mat_l #define subspace subspace_l #define svec svec_l #include "svec.cc" #undef scalar #undef vec #undef mat #undef subspace #undef svec #define scalar bigint #define vec vec_m #define mat mat_m #define subspace subspace_m #define svec svec_m #define smat smat_m #define smat_elim smat_m_elim #include "svec.cc" #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim eclib-20250122/libsrc/symb.cc000066400000000000000000000130321474421343600155750ustar00rootroot00000000000000// FILE SYMB.CC: Implementations for symbols ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include // Friend of class symb: ostream& operator<< (ostream& s, const symb& sy) { s << "(" << sy.c << ":" << sy.d << ")"; return s; } //#define DEBUG_NORMALIZE symb symb::normalize() const { #ifdef DEBUG_NORMALIZE cout<<"Normalizing symbol "<<(*this)<modulus; long u=N->unitdiv(c); #ifdef DEBUG_NORMALIZE cout<<"scaling by u = "<reduce(xmodmul(c,u,n)); long dd=N->reduce(xmodmul(d,u,n))%(n/cc); #ifdef DEBUG_NORMALIZE cout<<"new c = "<(c,d)]=num; num++; // cout<<"Adding symbol "<(c,d)); if(j==hashtable.end()) return -1; // cout<<" is "<second<second; } symb symblist::item(long n) const { if ((n>num)||(n<0)) { cerr<<"Error in symblist::item: index out of range!"<0) { long ic,id,d; symb s; //N.B. dlist include d=1 at 0 and d=mod at end, which we don't want here for (ic=1; (ic0) // d invertible, with inverse kd return reduce(xmodmul(c,kd,modulus)); // (c:d) = (c*kd:1) else { long kc = code(c); if (kc>0) // (c:d) = (1:kc*d) if c invertible return modulus-code(xmodmul(kc,d,modulus)); else { long start = dstarts[noninvdlist[-kc]]; symb s(c,d,this); long ind = specials.index(s,start); if(ind<0) { cout<<"error in index(): symbol "<" << s << "-->" << j << "\n"; ok=0; } } if (ok) cout << "symbols check OK!\n"; else cout << "symbols check found errors!\n"; } modsym jumpsymb(const symb& s1, const symb& s2) { //Assuming s1==s2, returns closed modular symbol {g1(0),g2(0)} where gi<->si long c1=s1.cee(), c2=s2.cee(), d1=s1.dee(), d2=s2.dee(); return modsym(rational(-invmod(c1,d1),d1),rational(-invmod(c2,d2),d2)); } eclib-20250122/libsrc/threadpool.cc000066400000000000000000000106371474421343600167740ustar00rootroot00000000000000// FILE threadpool.cc : Implementation of member functions for class threadpool ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 Marcus Mo // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// /** * threadpool.cc * * Simple, no-frills threadpool for Boost threads. * Some features have been made available specifically for ECLIB. * * These include use of verbosity level in constructor, to be * used for logging. Tasks must also have an overloaded * operator() which describes what each thread must perform on * that object. The return value of the task must be * void, i.e. nothing is returned. */ // Compile this only if Boost is installed #ifdef ECLIB_MULTITHREAD // Include header files #include "eclib/threadpool.h" /** * Threadpool() * * Default constructor. Must call start() before using threadpool. */ threadpool::threadpool() : maxThreads_( 0 ), threadCount_( 0 ), verbose_( -1 ), work_( new boost::asio::io_service::work( io_service_ ) ) {} /** * threadpool() * * Main constructor. */ threadpool::threadpool( unsigned int numThreads, int verbose ) : work_( new boost::asio::io_service::work( io_service_ ) ) { start( numThreads, verbose ); } /** * ~Threadpool() * * Desctructor. Simply calls close() */ threadpool::~threadpool() { close(); } /** * start(); * * Must be called after constructor, and allows for threadpool * to be restarted after a call to close(). */ void threadpool::start( unsigned int numThreads, int verbose ) { // Store verbosity verbose_ = verbose; // Store maximum number of threads system can support maxThreads_ = boost::thread::hardware_concurrency(); // Store actual number of threads to be used. // If not specified, we use the system limit. threadCount_ = ( numThreads > 0 ) ? numThreads : maxThreads_; // We limit the number of threads to the system limit. // Note: it is best to not use all available threads if( threadCount_ > maxThreads_ ) { // Reset limit threadCount_ = maxThreads_; // Notify if( verbose_ ) std::cout << "Requested more threads than available." << std::endl; } // Declare the final number of threads to be used if( verbose_ > 1 ) std::cout << "Threadpool will be using " << threadCount_ << " threads from a total of " << maxThreads_ << " threads." << std::endl; // Create threads and add to threadpool for( unsigned int i = 0; i < threadCount_-1; i++ ) { threads_.create_thread( boost::bind( &boost::asio::io_service::run, &io_service_ ) ); } } /** * close() * * Closes io_service_ to prevent further * jobs added to job queue. Joins all threads in * threadpool; currently running jobs are completed * before returning control to calling thread. * * This blocking method exists in case we wish * to close the threadpool before end-of-scope, * or to detect when all previously posted * jobs have finished. */ void threadpool::close() { // We destroy the work class on the io_service object // so that we can exit once all jobs posted have finished work_.reset(); // run() blocks until all posted jobs have finished io_service_.run(); // We close the threadpool and join all threads io_service_.stop(); threads_.join_all(); } /** * getThreadCount() * * Returns number of threads initiated * in threadpool. */ unsigned int threadpool::getThreadCount() { return threadCount_; } /** * getMaxThreads() * * Returns maximum number of threads available. * Provides easier access. */ unsigned int threadpool::getMaxThreads() { return maxThreads_; } #endif // ECLIB_MULTITHREAD eclib-20250122/libsrc/timer.cc000066400000000000000000000162301474421343600157460ustar00rootroot00000000000000// timer.cc: implementations of timer functions ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // Marcus Mo (timer class) // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #ifndef CLK_TCK #define CLK_TCK CLOCKS_PER_SEC #endif double starttime,stoptime; void init_time() { ;} void start_time() { starttime = GetTime();} void stop_time() { stoptime = GetTime();} void show_time(ostream& s) { s<<" ("<<(stoptime-starttime)<<" seconds)" << flush; } // Implementation of timer class // (essentially the same as above and more) /** * timer() * * Default constructor. */ timer::timer() : s_( NULL ) { // Set up default stream to standard-out stream(); } /** * timer() * * Constructor. Output filename given. */ timer::timer( string filename ) : s_( NULL ) { // Set up stream stream( filename ); } /** * ~timer() * * Destructor. Flush the stream before * destroying object. */ timer::~timer() { s_ -> flush(); // Close file, if ever opened // Do not reference s_ _ever_. We do not // want to close std::cout nonetheless. if( file_.is_open() ) { file_.close(); } } /** * stream() * * Initialise stream for current instance. * If called again, new stream will replace old stream, * which will be flushed and closed safely, if required. */ void timer::stream( string filename ) { // Flush current stream if defined, just to be safe if( s_ != NULL ) { s_ -> flush(); } // First check if a filename was given if( !filename.size() ) { // Default stream to standard-out s_ = &cout; } else { // Open new file file_.open(filename.c_str(),ios::out|ios::trunc); // Check is file successfully opened if( !file_.is_open() ) { cout << "File " << filename << " could not be opened ... using stout" << endl; s_ = &cout; } else { // Point main reference to newly opened file s_ = &file_; } } } /** * add() * * Create additional subtimers, referenced by unique * name, which we check for and notify before any alterations. * * This function essentially does nothing apart from * check timer names for validity. */ void timer::add( string name ) { // Check if default timer is being added if( name.compare("default") == 0 ) { cout << "Timer of name `default' cannot be used. " << "Try another name ... ignoring" << endl; return; } // Existence based on length of vector if( times_[name].size() != 0 ) { cout << "Subtimer " << name << " already exists. " << "Erasing, and starting again." << endl; // Clear timer times_[name].clear(); } } /** * start() * * Stores current time into timer storage. * Start time positioned at index 0. * Purely semanitc function - Can use split() * which will perform the same action on an empty vector. */ void timer::start( string name ) { split( name ); } /** * split() * * Logs the current time for specified timer. */ void timer::split( string name ) { times_[name].push_back( getWallTime() ); } /** * stop() * * Store current time into timer storage. * Purely semantic. */ void timer::stop( string name ) { split( name ); } /** * stopAll() * * Stop all timers. */ void timer::stopAll() { // TODO Check if timer is active via flags for ( const auto& t : times_) stop(t.first); } /** * write() * * Write given message to output stream * defined upon construction of instance. */ void timer::write( string message ) { s_ -> write( message.c_str(), message.size() ); s_ -> flush(); } /** * show() * * Display time to specified stream. * Time interval length is defined by two indexes, * which default to 0 and 1. * Allow option to add newline character to stream * for accessibility. */ void timer::show( int nline, string name, int idx1, int idx2 ) { // Set second index to end of list if( idx2 == -1 ) { idx2 = times_[name].size() - 1; } // Calculate difference in time double diff = times_[name][idx2] - times_[name][idx1]; // Compose message string message = name + " (" + toString( diff ) + " seconds)\t"; // Add newline if( nline ) message += "\n"; s_ -> write( message.c_str(), message.size() ); s_ -> flush(); } /** * showAll() * * Loop through all timers, and write out. */ void timer::showAll( int nline ) { for (const auto& t : times_) show( nline, t.first ); } /** * clear() * * Removes all times from a subtimer. */ void timer::clear( string name ) { times_[name].clear(); } /** * clearAll() * * Removes all times from all subtimers. */ void timer::clearAll() { for (const auto& t : times_) clear( t.first ); } /** * list() * * List names of all available timers */ void timer::list() { string message; for (const auto& t : times_) message += t.first + " "; message += "\n"; s_ -> write( message.c_str(), message.size() ); s_ -> flush(); } /** * count() * * Returns number times stores in specified timer, * i.e. size of vector */ int timer::count( string name ) { return times_[name].size(); } /** * total() * * Return total time of a given timer. */ double timer::total( string name ) { return std::accumulate(times_[name].begin(), times_[name].end(), 0); // double total = 0; // for ( const auto& t : times_[name]) // total += t; // return total; } /** * average() * * Return average time of a given timer. */ double timer::average( string name ) { return total( name ) / times_[name].size(); } /** * getWallTime() * * Returns the real time in seconds. Only use this method * to find elapsed time. Do not base calculations on this * method. Subject to changes in system time. * Accuracy varies over different systems. */ double timer::getWallTime() { #ifdef _WIN32 // Windows real time clock FILETIME tm; ULONGLONG t; GetSystemTimeAsFileTime( &tm ); t = ((ULONGLONG)tm.dwHighDateTime << 32) | (ULONGLONG)tm.dwLowDateTime; return (double) t / 10000000.0; #else // POSIX real time clock struct timeval tm; gettimeofday( &tm, NULL ); return (double) tm.tv_sec + (double) tm.tv_usec / 1000000.0; #endif } /** * toString() * * Convert anything to string. * Templated function, so possible to * pass through any typed variable, but * mainly used to convert numbers to string type. */ template< typename T > string timer::toString( T el ) { stringstream s; s << el; return s.str(); } eclib-20250122/libsrc/tlss.cc000066400000000000000000000141741474421343600156200ustar00rootroot00000000000000// tlss.cc: implementation of class TLSS for sieving E(Q)/pE(Q) at one prime q ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // NB: TLSS = Tate--Lichtenbaum--Samir-Siksek: we use a simple // discrete log a la Siksek when the p-torsion in E(F_q) is cyclic, // else use the Tate-Lichtenbaum pairing #include void TLSS::init(int pp, int verb) { verbose=verb; p=pp; Pi=Emodq.get_pbasis(p); rank=Pi.size(); if((verbose>1)&&(rank>0)) { cout<<"Generators of "< TLSS::map1point(const Point& P) const { #ifdef debugTL cout<<"Applying TLSS::map1point (q="< "< #include bigint g_content(const bigint& ga, const bigint& gb, const bigint& gc, const bigint& gd, const bigint& ge) // returns largest SQUARE which divides all { // first find the content: bigint ans=abs(ga); if(ans==1) return ans; ans=gcd(ans,gb); if(ans==1) return ans; ans=gcd(ans,gc); if(ans==1) return ans; ans=gcd(ans,gd); if(ans==1) return ans; ans=gcd(ans,ge); if(ans==1) return ans; // if content non-trivial, get its divisors whose square divides // (as we alreasy have this function to hand...) vector cdivs = sqdivs(ans); // and return the last in the list, which is the biggest: return cdivs[(cdivs.size())-1]; } void apply_transform(bigint& a, bigint& b, bigint& c, bigint& d, bigint& e, const unimod& m) { bigint m11=m(1,1), m12=m(1,2), m21=m(2,1), m22=m(2,2); bigint m112=sqr(m11); bigint m113=m112*m11; bigint m114=m113*m11; bigint m212=sqr(m21); bigint m213=m212*m21; bigint m214=m213*m21; bigint m222=sqr(m22); bigint m223=m222*m22; bigint m224=m223*m22; bigint m122=sqr(m12); bigint m123=m122*m12; bigint m124=m123*m12; bigint newa = m214*e + m11*m213*d + m112*m212*c + m113*m21*b + m114*a; bigint newe = m224*e + m12*m223*d + m122*m222*c + m123*m22*b + m124*a; bigint newb = 4*m213*m22*e + (3*m11*m212*m22+m12*m213)*d + 2*(m112*m21*m22+m11*m12*m212) * c + (3*m112*m12*m21+m113*m22)*b + 4*m113*m12*a; bigint newd = 4*m21*m223*e + (3*m12*m21*m222+m11*m223)*d + 2*(m122*m21*m22+m11*m12*m222)*c + (m123*m21+ 3*m11*m122*m22)*b + 4*m11*m123*a; bigint newc = 6*m212*m222*e + 3*(m12*m212*m22+m11*m21*m222) * d + (m122*m212+ 4*m11*m12*m21*m22+m112*m222) * c + 3*(m11*m122*m21+m112*m12*m22) * b + 6*m112*m122*a; a=newa; b=newb; c=newc; d=newd; e=newe; } void apply_transform(bigint& a, bigint& b, bigint& c, bigint& d, bigint& e, const scaled_unimod& m) { apply_transform(a,b,c,d,e,(unimod)m); bigint u2=sqr(m.scale_factor()); if(u2>1) { divide_exact(a,u2,a); divide_exact(b,u2,b); divide_exact(c,u2,c); divide_exact(d,u2,d); divide_exact(e,u2,e); } } void xshift(const bigint& alpha, const bigint& a, bigint& b, bigint& c, bigint& d, bigint& e, unimod& m) { e += alpha*(d+alpha*( c+alpha*( b+ alpha*a))); d += alpha*(2*c+alpha*(3*b+4*alpha*a)); c += alpha*(3*b+6*alpha*a); b += 4*alpha*a; m.x_shift(alpha); } void zshift(const bigint& gamma, bigint& a, bigint& b, bigint& c, bigint& d, const bigint& e, unimod& m) { a += gamma*(b+gamma*( c+gamma*( d+ gamma*e))); b += gamma*(2*c+gamma*(3*d+4*gamma*e)); c += gamma*(3*d+6*gamma*e); d += 4*gamma*e; m.y_shift(gamma); } void m_invert(bigint& a, bigint& b, bigint& c, bigint& d, bigint& e, unimod& m) { swap(a,e); swap(b,d); ::negate(b); ::negate(d); m.invert(); } void m_invert(bigint& a, bigint& b, bigint& c, bigint& d, bigint& e, scaled_unimod& m) { swap(a,e); swap(b,d); ::negate(b); ::negate(d); m.invert(); } int check_transform(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const bigint& e, const unimod& m, const bigint& xa, const bigint& xb, const bigint& xc, const bigint& xd, const bigint& xe) { bigint aa(a), bb(b), cc(c), dd(d), ee(e); apply_transform(aa,bb,cc,dd,ee,m); if(aa!=xa) return 0; if(bb!=xb) return 0; if(cc!=xc) return 0; if(dd!=xd) return 0; if(ee!=xe) return 0; return 1; } int check_transform(const bigint& a, const bigint& b, const bigint& c, const bigint& d, const bigint& e, const scaled_unimod& m, const bigint& xa, const bigint& xb, const bigint& xc, const bigint& xd, const bigint& xe) { bigint aa(a), bb(b), cc(c), dd(d), ee(e); apply_transform(aa,bb,cc,dd,ee,m); if(aa!=xa) return 0; if(bb!=xb) return 0; if(cc!=xc) return 0; if(dd!=xd) return 0; if(ee!=xe) return 0; return 1; } eclib-20250122/libsrc/twoadic.cc000066400000000000000000000233071474421343600162630ustar00rootroot00000000000000// twoadic.cc: implementation of functions for existence of 2-adic points ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include // The following due to Michael Stoll: /* try1(poly), with poly a deg 3 polynomial in x, determines if */ /* there is a 2-adic integer a such that poly(a) is a square */ /* in Q_2. Returns 1 if successful, 0 otherwise. */ long try1(long poly[4]) { long c, v, sq, j, k; /* see if we can lift to obtain a zero of poly. */ /* the condition is val(poly[0]) > 2*val(poly[1]). */ #ifdef SHOW_POLY cout<<"("< 2*val(poly[1])) { // cout<<" has a 2-adic root via Hensel"< 2*val(poly[1])) && (2*val(poly[0]) + val(poly[3]) > 3*val(poly[1]))) { // cout<<" has a 2-adic root via Newton Polygon"< OK */ if((v & 0x1) == 0) { c >>= v; c &= 0x7; if(c == 1) return 1; sq = (((c & 0x3) == 3) ? 2 : 3) + v; } else sq = v+1; /* if not, see if we can already read off that it's impossible */ /* to have a point with integral 2-adic x-coordinate. */ for(j = 1; j <= 3; j++) if(val(poly[j]) < sq) goto refine; return 0; refine: /* now we must refine */ { long newpoly[4]; /* construct poly(2x+1) */ for(j = 0; j < 4; j++) newpoly[j] = poly[j]; for(j = 0; j < 4; j++) { long h = newpoly[3]; for(k = 2; k >= j; k--) h = newpoly[k] += h; newpoly[j] <<= j; } if(try1(newpoly)) return 1; /* success with 2x */ /* construct poly(2x) */ for(j = 0; j < 4; j++) newpoly[j] = poly[j]< val(poly[1]) and a vertex of the Newton polygon at 1, i.e., val(poly[0]) + val(poly[2]) > 2*val(poly[1]) and 2*val(poly[0]) + val(poly[3]) > 3*val(poly[1]) . The condition in the code comes from Hensel's lemma and implies the conditions given above. */ long try1(bigint poly[4]) { long c, v, sq, j, k; bigint mc; /* see if we can lift to obtain a zero of poly. */ /* the condition is val(poly[0]) > 2*val(poly[1]). */ #ifdef SHOW_POLY cout<<"("< 2*val(poly[1])) { // cout<<" has a 2-adic root via Hensel"< 2*val(poly[1])) && (2*val(poly[0]) + val(poly[3]) > 3*val(poly[1]))) { // cout<<" has a 2-adic root via Newton Polygon"< OK */ if((v & 0x1) == 0) { mc >>= v; c = posmod(mc,8); //& 0x7; if(c == 1) return 1; sq = (((c & 0x3) == 3) ? 2 : 3) + v; } else sq = v+1; /* if not, see if we can already read off that it's impossible */ /* to have a point with integral 2-adic x-coordinate. */ for(j = 1; j <= 3; j++) if(val(poly[j]) < sq) goto refine; return 0; refine: /* now we must refine */ { bigint newpoly[4]; /* construct poly(2x) */ for(j = 0; j < 4; j++) newpoly[j] = poly[j]<= j; k--) h = newpoly[k] += h; newpoly[j] <<= j; } if(try1(newpoly)) return 1; /* success with 2x */ return 0; } } long case1(long a, long b) // A=4a, B=4b { // cout<<"In case1() with a="<>=2; c >>=1; a <<=1; } else // any solution x must be odd { d = a+b+c/2+(d+2)/4; c = 3*a+2*b+c/2+1; b = 3*a+b; a = 2*a; } } } //JC's version: /* long case2(long a, long b) // A=4a+1, B=4b+2 { // cout<<"In case2() with a="<>=2; c >>=1; a <<=1; } } } */ //MS's version: long case2(long a, long b) // A=4a+1, B=4b+2 { long c=a+1, d=a+b+1; // The polynomial in 4x+1 is (16, 12, 4*c, d) long d8=d&7, c2=c&1; long d4=d8&3; if((d4==2)||(d4==3)) return 0; if(d4==1) return (c2==0||(d8==1)); if(c2==1) return 1; // Now, d = 0 mod 4. Divide by 4 and replace c,d by c/2,d/4 // to get (4, 3, 2*c, d) d>>=2; c>>=1; a=1; b=0; // The polynomial is (4*a, 3*(4*b+1), 2*c, d) while(1) { d8=d&7; d4=d8&3; if(c&1) // c odd { switch(d4){ case 0: return 1; break; case 2: return 0; break; case 1: return (d8==1); break; case 3: { // replace f(x) by f(2x+1)/4 and loop d = a + 3*b + (c+1)/2 + (d+1)/4 ; c = 3*a + 6*b + (c+3)/2; b += a ; a <<= 1; } } } else // c even { switch(d4){ case 1: return 1; break; case 3: return 0; break; case 2: return (((d8+4*(a+b)+2*c+2)&7) == 0); case 0: { // replace f(x) by f(2x)/4 and loop d >>= 2; c >>= 1; a <<= 1; } } } } } // bigint versions of case1() and case2(): long case1(bigint a, bigint b) // A=4a, B=4b { // cout<<"In case1() with a="<>=2; c >>=1; a <<=1; } else // any solution x must be odd { d = a+b+c/2+(d+2)/4; c = 3*a+2*b+c/2+1; b = 3*a+b; a = 2*a; } } } long case2(bigint a, bigint b) // A=4a+1, B=4b+2 { bigint c=a+1, d=a+b+1; // The polynomial in 4x+1 is (16, 12, 4*c, d) long d8=posmod(d,8), c2=posmod(c,2); long d4=d8&3; if((d4==2)||(d4==3)) return 0; if(d4==1) return (c2==0||(d8==1)); if(c2==1) return 1; // Now, d = 0 mod 4. Divide by 4 and replace c,d by c/2,d/4 // to get (4, 3, 2*c, d) d>>=2; c>>=1; a=1; b=0; // The polynomial is (4*a, 3*(4*b+1), 2*c, d) while(1) { d8=posmod(d,8); d4=d8&3; c2=posmod(c,2); if(c2) // c odd { switch(d4){ case 0: return 1; break; case 2: return 0; break; case 1: return (d8==1); break; case 3: { // replace f(x) by f(2x+1)/4 and loop d = a + 3*b + (c+1)/2 + (d+1)/4 ; c = 3*a + 6*b + (c+3)/2; b += a ; a <<= 1; } } } else // c even { switch(d4){ case 1: return 1; break; case 3: return 0; break; case 2: return ((posmod(-4*(a+b)-2*c-2,8)) == d8); case 0: { // replace f(x) by f(2x)/4 and loop d >>= 2; c >>= 1; a <<= 1; } } } } } eclib-20250122/libsrc/unimod.cc000066400000000000000000000027301474421343600161210ustar00rootroot00000000000000// file unimod.cc: implementation of functions in unimod.h ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include unimod operator*(const unimod& a, const unimod& b) { return unimod( a.m11*b.m11 + a.m12*b.m21, a.m11*b.m12 + a.m12*b.m22, a.m21*b.m11 + a.m22*b.m21, a.m21*b.m12 + a.m22*b.m22 ); } scaled_unimod operator*(const scaled_unimod& a, const scaled_unimod& b) { return scaled_unimod( a.m00*b.m00, a.m11*b.m11 + a.m12*b.m21, a.m11*b.m12 + a.m12*b.m22, a.m21*b.m11 + a.m22*b.m21, a.m21*b.m12 + a.m22*b.m22 ); } eclib-20250122/libsrc/vec.cc000066400000000000000000000233451474421343600154100ustar00rootroot00000000000000// vec.cc: implementation of integer vector classes ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // Only to be included by vector.cc // Definitions of member operators and functions: vec::vec(long n) { entries.resize(n, scalar(0)); } vec::vec(const vector& arr) :entries(arr) {} vec::vec(const vec& v) :entries(v.entries) {} // copy constructor void vec::init(long n) // (re)-initializes { entries.resize(n, scalar(0)); } vec& vec::operator=(const vec& v) // assignment { if (this==&v) return *this; entries = v.entries; return *this; } scalar& vec::operator[](long i) { return entries.at(i-1); } scalar vec::operator[](long i) const { return entries.at(i-1); } vec& vec::operator+=(const vec& w) { std::transform(w.entries.begin(), w.entries.end(), entries.begin(), entries.begin(), [](const scalar& wi, const scalar& vi) { return vi + wi;}); return *this; } void vec::addmodp(const vec& w, const scalar& pr) { std::transform(w.entries.begin(), w.entries.end(), entries.begin(), entries.begin(), [pr](const scalar& wi, const scalar& vi) { return mod(wi+vi,pr);}); } vec& vec::operator-=(const vec& w) { std::transform(w.entries.begin(), w.entries.end(), entries.begin(), entries.begin(), [](const scalar& wi, const scalar& vi) { return vi - wi;}); return *this; } vec& vec::operator*=(const scalar& scal) { std::transform(entries.begin(), entries.end(), entries.begin(), [scal](const scalar& vi) {return vi * scal;}); return *this; } vec& vec::operator/=(const scalar& scal) { std::transform(entries.begin(), entries.end(), entries.begin(), [scal](const scalar& vi) {return vi / scal;}); return *this; } vec vec::slice(long first, long last) const // returns subvector { if (last==-1) {last=first; first=1;} vec ans(last-first+1); std::copy(entries.begin()+first-1, entries.begin()+last, ans.entries.begin()); return ans; } vec vec::operator[](const vec_i& index) const // returns v[index[j]] { vec w(dim(index)); const vector& vi = index.get_entries(); std::transform(vi.begin(), vi.end(), w.entries.begin(), [this](const int& i) {return entries.at(i-1);}); return w; } vec vec::operator[](const vec_l& index) const // returns v[index[j]] { vec w(dim(index)); const vector& vi = index.get_entries(); std::transform(vi.begin(), vi.end(), w.entries.begin(), [this](const int& i) {return entries.at(i-1);}); return w; } scalar vec::sub(long i) const { return entries.at(i-1); } void vec::set(long i, const scalar& x) { entries.at(i-1) = x; } void vec::add(long i, const scalar& x) { entries.at(i-1) += x; } void vec::add_modp(long i, const scalar& x, const scalar& p) { entries.at(i-1) = mod(entries.at(i-1)+x,p); } void vec::red_modp(const scalar& p) { if (p==0) return; std::transform(entries.begin(), entries.end(), entries.begin(), [p](const scalar& vi) {return mod(vi,p);}); } vec vec::iota(long n) { vec v(n); std::iota(v.entries.begin(), v.entries.end(), scalar(1)); return v; } // Definitions of non-member, friend operators and functions scalar operator*(const vec& v, const vec& w) { return std::inner_product(v.entries.begin(), v.entries.end(), w.entries.begin(), scalar(0)); } int operator==(const vec& v, const vec& w) { return v.entries == w.entries; } int trivial(const vec& v) { return std::all_of(v.entries.begin(), v.entries.end(), [](const scalar& vi) {return vi==0;}); } ostream& operator<<(ostream& s, const vec& v) { s << "["; long i=0; for ( const auto& vi : v.entries) { if(i++) s<<","; s<>(istream& s, vec& v) { for (scalar& vi : v.entries) s>>vi; return s; } // Definition of non-friend operators and functions scalar content(const vec& v) { return v.entries.empty()? scalar(1) : std::accumulate(v.entries.begin(), v.entries.end(), scalar(0), [](const scalar& x, const scalar& y) {return gcd(x,y);}); } scalar maxabs(const vec& v) { return v.entries.empty()? scalar(0) : std::accumulate(v.entries.begin(), v.entries.end(), scalar(0), [](const scalar& x, const scalar& y) {return max(x,abs(y));}); } void swapvec(vec& v, vec& w) { std::swap(v.entries, w.entries); } int member(const scalar& a, const vec& v) { return std::find(v.entries.begin(), v.entries.end(), a) != v.entries.end(); } vec reverse(const vec& order) { vec ans(order); std::reverse(ans.entries.begin(), ans.entries.end()); return ans; } vec express(const vec& v, const vec& v1, const vec& v2) { scalar v1v1 = v1 * v1; scalar v1v2 = v1 * v2; scalar v2v2 = v2 * v2; scalar vv1 = v * v1; scalar vv2 = v * v2; vec ans({vv1*v2v2 - vv2*v1v2, vv2*v1v1 - vv1*v1v2, v1v1*v2v2 - v1v2*v1v2}); makeprimitive(ans); if (ans[3]*v!=ans[1]*v1+ans[2]*v2) cerr << "Error in express: v is not in "<>1)-1; scalar maxallowed = 10*lim; #ifdef DEBUG_LIFT cout<<"Lifting vector v = "<lim, and works as long as // (1) there is a lift with all entries at most 10*lim, (2) at least // one entry has the correct denominator, which is equaivalent to // requiring that in the primitive rescaling, there is an entry // coprime to the first non-zero entry. ans = reduce_modp(v, pr); // starts as a copy, and will be rescaled in place #ifdef DEBUG_LIFT cout<<"After reduce_modp: v = "< #include #include "random.cc" #undef scalar #undef vec #undef mat #undef subspace #define scalar int #define vec vec_i #define mat mat_i #define subspace subspace_i #include "vec.cc" #undef scalar #undef vec #undef mat #undef subspace #define scalar long #define vec vec_l #define mat mat_l #define subspace subspace_l #include "vec.cc" #undef scalar #undef vec #undef mat #undef subspace #define scalar bigint #define vec vec_m #define mat mat_m #define subspace subspace_m #define svec svec_m #define smat smat_m #define smat_elim smat_m_elim #include "vec.cc" #undef scalar #undef vec #undef mat #undef subspace #undef svec #undef smat #undef smat_elim vec_m to_vec_m(const vec_i& v) { const vector & vi = v.get_entries(); vector w(vi.size()); std::transform(vi.begin(), vi.end(), w.begin(), [](const int& x) {return bigint(x);}); return vec_m(w); } vec_m to_vec_m(const vec_l& v) { const vector & vi = v.get_entries(); vector w(vi.size()); std::transform(vi.begin(), vi.end(), w.begin(), [](const long& x) {return bigint(x);}); return vec_m(w); } vec_i to_vec_i(const vec_m& v) { const vector & vi = v.get_entries(); auto toint = [](const bigint& a) {return is_int(a)? I2int(a) : int(0);}; vector w(vi.size()); std::transform(vi.begin(), vi.end(), w.begin(), toint); return vec_i(w); } vec_l to_vec_l(const vec_m& v) { const vector & vi = v.get_entries(); auto tolong = [](const bigint& a) {return is_long(a)? I2long(a) : long(0);}; vector w(vi.size()); std::transform(vi.begin(), vi.end(), w.begin(), tolong); return vec_l(w); } eclib-20250122/libsrc/version.cc000066400000000000000000000042241474421343600163130ustar00rootroot00000000000000// version.cc: implementation of functions show_version(), eclib_version() ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #include string eclib_version() { string v = VERSION; // defined by autotools, of the form v

return v; } vector eclib_date() { vector date; string v = eclib_version(); // 8 chars long, yyyymmdd date.push_back(atoi(v.substr(0,4).c_str())); // chars 0-4 date.push_back(atoi(v.substr(4,2).c_str())); // chars 5-6 date.push_back(atoi(v.substr(6,2).c_str())); // chars 7-8 return date; } void show_version(ostream& os) { os << "eclib version " << VERSION << ", "; #ifdef NO_MPFP os << "using NTL bigints but no multiprecision floating point"; #else os << "using NTL bigints and NTL real and complex multiprecision floating point"; #endif os << endl; } int sgn(int a) {return (a==0? 0: (a>0? 1: -1));} int compare_eclib_version(int y, int m, int d) { vector date = eclib_date(); int s; // compare years s = sgn(date[0] - y); if (s!=0) // different years, OK if y is smaller return s; // same year, compare months s = sgn(date[1] - m); if (s!=0) // different months, OK if m is smaller return s; // same year and month, compare days return sgn(date[2] - d); } eclib-20250122/libsrc/xsplit.cc000066400000000000000000000463741474421343600161650ustar00rootroot00000000000000// xsplit.cc: implementation of class form_finder ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // Marcus Mo (parallel code) // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include // for unlink() (not needed on linux) #define USE_SPARSE 1 #define ECLIB_INT_NUM_THREADS 8 #define ECLIB_RECURSION_DIM_LIMIT 5821 //#define ECLIB_MULTITHREAD_DEBUG #include #include #include subspace sparse_combine(const subspace& s1, const subspace& s2); mat sparse_restrict(const mat& m, const subspace& s); smat restrict_mat(const smat& m, const subspace& s); // CLASS FORM_FINDER (was called splitter) form_finder::form_finder(splitter_base* hh, int plus, int maxd, int mind, int dualflag, int bigmatsflag, int v) :h(hh), plusflag(plus), dual(dualflag), bigmats(bigmatsflag), verbose(v), gnfcount(0), maxdepth(maxd), mindepth(mind) { eclogger::setLevel( verbose ); denom1 = h->matden(); dimen = h->matdim(); // Create and initialise new data object as root node // passing a constant pointer of current form_finder object // to data class constructor root = new ff_data( this ); // Set initial values // form_finder class is a friend of ff_data class // so may access private members root -> subdim_ = dimen; targetdim = 1; if( !plusflag ) { // full conjmat not needed when plusflag is true targetdim=2; if( bigmats ) root -> conjmat_ = h -> s_opmat(-1,dual); } } form_finder::~form_finder(void) { // Decendants of root node will be recursively deleted // if they have not already been deleted during find() // All dynamically created objects (subspaces) held // in each data node will also be deleted. delete root; } // This is only used when bigmats==1 and we compute opmats on the entire ambient space: void form_finder::make_opmat(long i, ff_data &data) { data.the_opmat_ = h -> s_opmat(i,dual,verbose); } void form_finder::make_submat( ff_data &data ) { // Cache current data node depth long depth = data.depth_; if( bigmats ) { // fetch the_opmat from file, or compute make_opmat(depth,data); if( depth == 0 ) data.submat_ = data.the_opmat_; else { ECLOG(1) << "restricting the_opmat to subspace..."; data.submat_ = restrict_mat(data.the_opmat_,*(data.abs_space_)); ECLOG(1) << "done." << endl; } data.the_opmat_ = smat(0,0); // releases its space } else { if( data.submat_.nrows() == 0 ) // else we have it already { if( depth == 0 ) data.submat_ = h -> s_opmat(depth,1,verbose); else { //data.submat_ = h -> s_opmat_restricted(depth,*(data.abs_space_),1,verbose); data.submat_ = make_nested_submat(depth,data); } } } } /** * make_nested_submat() * * Computes and returns the submat -- new nested version */ smat form_finder::make_nested_submat(long ip, ff_data &data) { long depth = data.depth_; // current depth long subdim = data.subdim_; // current dimension ff_data *d = &data; // Pointer to nodes ECLOG(1) << "Computing operator of size " << subdim << " at depth " << depth << "..." << flush; // first we go up the chain, composing pivotal indices vec jlist = vec::iota(subdim); smat b = d->rel_space_->bas(); int level = depth; while (level--) { ECLOG(2) << "["<rel_space_->pivs()[jlist]; d->parent_->child_ = d; d = d->parent_; if(level) b = mult_mod_p(d->rel_space_->bas(), b, MODULUS); } // now compute the matrix of images of the j'th generator for j in jlist ECLOG(2) << " basis done..." << flush; smat m = h -> s_opmat_cols(ip, jlist, 0); ECLOG(2) << " sub-opmat done..." << flush; m = mult_mod_p(m,b,MODULUS); ECLOG(1) <<" opmat done."< depth_ = depth + 1; SCALAR eig2 = eig*denom1; ECLOG(1) << "Increasing depth to " << depth+1 << ", " << "trying eig = " << eig << "..." << "after scaling, eig = " << eig2 << "..." << endl; ssubspace s(0); vector submat_dim = dim(data.submat_); stringstream submat_dim_ss; std::copy(submat_dim.begin(),submat_dim.end(),ostream_iterator(submat_dim_ss," ")); ECLOG(1) << "Using sparse elimination (size = [ " << submat_dim_ss.str() << "], density =" << density(data.submat_) << ")..." << flush; ECLOG(3) << "submat = " << data.submat_ << flush; s = eigenspace(data.submat_,eig2, DEFAULT_MODULUS); // the relative eigenspace // Increment data usage counter for parent node data.increaseSubmatUsage(); // Reset current submat if all children have used it // Save space (will recompute when needed) //if( ( depth == 0 ) // && ( dim(s) > 0 ) // && ( data.submat_.nrows() > 1000 ) // && ( data.submatUsage_ == data.numChildren_ ) ) { // data.submat_ = smat(0,0); //} ECLOG(1) << "done (dim = " << dim(s) << ")"< rel_space_ = new ssubspace(s); // if( depth == 0 ) // child -> abs_space_ = new ssubspace(s); // else // child -> abs_space_ = new ssubspace(combine( *(data.abs_space_),s )); // ECLOG(1) << "done." << endl; depth++; // Local depth increment (does not effect data nodes) child -> subdim_ = dim( *(child -> rel_space_) ); ECLOG(1) << "Eigenvalue " << eig << " has multiplicity " << child -> subdim_ << endl; if(child -> subdim_>0) { ECLOG(0) << " eig " << eig << " gives new subspace at depth " << depth << " of dimension " << child -> subdim_ << endl; } } void form_finder::go_up( ff_data &data ) { // Cache pointer to parent data node for access after current node is deleted ff_data *parent = data.parent_; #ifdef ECLIB_MULTITHREAD // Lock parent node with scoped lock boost::mutex::scoped_lock lock( parent -> go_up_lock_ ); #ifdef ECLIB_MULTITHREAD_DEBUG ECLOG(1) << "in go_up for eig=" << data.eigenvalue_ << " depth=" << data.depth_ <<" status=" << data.status_ << std::endl; #endif #endif // Erasing node via children array of parent which calls destructor // of object (ff_data), using eigenvalue as key parent -> childStatus( data.eigenvalue_, COMPLETE ); parent -> eraseChild( data.eigenvalue_ ); #ifdef ECLIB_MULTITHREAD lock.unlock(); // Only last child to complete will execute the following (Detects if parent is root node) if( parent -> complete() && parent -> parent_ != NULL ) go_up( *parent ); #endif } void form_finder::make_basis( ff_data &data ) { // Cache data values long depth = data.depth(); long subdim = data.subdim(); vector< long > eiglist = data.eiglist(); if( subdim != targetdim ) { cout << "error in form_finder::make_basis with eiglist = "; for(int i=0; i0 if( bigmats ) { ssubspace* s; s = data.abs_space_; // only used when depth>0 subconjmat = (depth) ? restrict_mat(data.conjmat_, *s) : data.conjmat_; // will only be a 2x2 in this case (genus 1 only!) } else { subconjmat = make_nested_submat(-1,data); } // C++11 loop over two variables (similar to python) // for( int b : { -1,+1 } ) { /* use b as -1 or +1 */ } for(long signeig=+1; signeig>-2; signeig-=2) { SCALAR seig; seig = eig; if(signeig<0) seig = -eig; if(depth) { spm_rel = new ssubspace(eigenspace(subconjmat,seig, DEFAULT_MODULUS)); //spm_abs = new ssubspace(combine(*s,*spm_rel)); } else { spm_rel = new ssubspace(eigenspace(subconjmat,seig, DEFAULT_MODULUS)); //spm_abs = spm_rel; } if(dim(*spm_rel)!=1) { cout << "error in form_finder::makebasis; "; cout << "\nfinal ("; if(signeig>0) cout << "+"; else cout << "-"; cout << ") subspace has dimension " << dim(*spm_rel) << endl; cout << "aborting this branch!" << endl; //delete spm_abs; delete spm_rel; return; } //vec v = getbasis1(spm_abs); vec w = make_basis2(data, spm_rel->bas().as_mat().col(1)); if(signeig>0) data.bplus_ = w; else data.bminus_ = w; //delete spm_abs; delete spm_rel; } } vec form_finder::make_basis2(ff_data &data, const vec& v) { ff_data *d = &data; int level = data.depth_; vec w = v; while (level--) { w = mult_mod_p(d->rel_space_->bas(), w, MODULUS); d = d->parent_; } return lift(w); } vec form_finder::make_basis1(ff_data &data) { vec v(1); v.set(1,1); return make_basis2(data, v); } vec getbasis1(const ssubspace* s) { return lift(basis(*s).as_mat().col(1)); } vec lift(const vec& v) { #ifdef MODULAR VEC b=v, bb; if(lift(b,MODULUS,bb)) b = bb; else cout << "Unable to lift eigenvector from mod " << MODULUS << endl; #else makeprimitive(b); #endif #ifdef MULTI scalar n=0; // dummy variable to gt the right type in next line return b.shorten(n); #else return b; #endif } void form_finder::recover(vector< vector > eigs) { for(unsigned int iform=0; iform10) n = 10; copy(eigs[iform].begin(), eigs[iform].begin() + n, ostream_iterator(cout, " ")); cout << "..." << endl; } splitoff(eigs[iform]); } // Clears all nodes. This cannot be done automatically since we // don't know how many eigs lists were to be splt off. root -> eraseChildren(); } void form_finder::splitoff(const vector& eigs) { // Always start at root node ff_data *current = root; // Temporary variables long depth = current -> depth_; long subdim = current -> subdim_; if( verbose ) { cout << "Entering form_finder, depth = " << depth << ", dimension " << subdim << endl; } // Walk down nodes (if any already created) for common branches while( current -> numChildren_ > 0 && current -> child(eigs[depth]) != NULL ) { // Update current node pointer current = current -> child(eigs[depth]); // Update data depth = current -> depth_; subdim = current -> subdim_; if (verbose) { cout << "...increasing depth to " << depth << ", dimension " << subdim << endl; } } // Current node is new branch point // We trim all sub-branches ... current -> eraseChildren(); if( verbose ) { cout << "restarting at depth = " << depth << ", " << "dimension " << subdim << endl; } // ... and grow a new branch down to required depth. while( (subdim > targetdim) && (depth < maxdepth) ) { // Get number of possible eigenvalues if( current -> numChildren_ <= 0 ) { vector t_eigs = h->eigrange(depth); current -> setChildren( t_eigs ); } // Create new child node ff_data *child = new ff_data( this ); // Configure data node ancestry current -> addChild( eigs[depth], *child ); // Create submat for current node make_submat( *current ); // Proceed to go down go_down(*current,eigs[depth],1); // Update to new values current = child; depth = current -> depth_; subdim = current -> subdim_; } // Creating newforms make_basis(*current); h->use(current->bplus_,current->bminus_,eigs); return; } void form_finder::find() { #ifdef ECLIB_MULTITHREAD // Set number of threads to use either through default // ECLIB_INT_NUM_THREADS macro defined above, or // ECLIB_EXT_NUM_THREADS environment variable. unsigned int eclib_num_threads = ECLIB_INT_NUM_THREADS; stringstream s; s << getenv("ECLIB_EXT_NUM_THREADS"); if( !s.str().empty() ) eclib_num_threads = atoi(s.str().c_str()); // Start job queue. We keep job queue local to ensure threads are // not kept busy for longer than necessary. pool.start( eclib_num_threads, verbose ); #endif // Proceed in recursive find, passing a node through find( *root ); #ifdef ECLIB_MULTITHREAD // Join all threads in threadpool to wait for all jobs to finish // Or detect when all branches of the tree has been traversed pool.close(); #endif // Clear all nodes. This should have been be done automatically but not all nodes are deleted when running in multithreaded mode. root -> eraseChildren(); // Now compute all newforms only if recursion has finished if(verbose>1) cout << "Now performing use() on all lists at once" << endl; for( int nf = 0; nf < gnfcount; nf++ ) { h-> use(gbplus[nf],gbminus[nf],gaplist[nf]); } } void form_finder::find( ff_data &data ) { // Cache values of current data long depth = data.depth(); long subdim = data.subdim(); vector< long > eiglist = data.eiglist(); vector subeiglist(eiglist.begin(),eiglist.begin()+depth); int dimold = h->dimoldpart(subeiglist); stringstream subeiglist_ss; std::copy(subeiglist.begin(),subeiglist.end(),ostream_iterator(subeiglist_ss," ")); ECLOG(0) << "In formfinder, depth = " << depth << ", aplist = [ " << subeiglist_ss.str() << "];\t" << "dimsofar=" << subdim << ", dimold=" << dimold << ", dimnew=" << subdim-dimold << "\n"; if( dimold == subdim ) { data.setStatus( ALL_OLD ); // Set status of current node ECLOG(0) << "Abandoning a common eigenspace of dimension " << subdim << " which is a sum of oldclasses." << endl; return; // This branch of the recursion ends: all is old } if( ( subdim == targetdim ) && ( depth > mindepth ) ) { data.setStatus( FOUND_NEW ); // Set status of current node make_basis( data ); store(data.bplus_,data.bminus_,subeiglist); return; } if( depth == maxdepth ) { data.setStatus( MAX_DEPTH ); if(1) { // we want to see THIS message whatever the verbosity level! cout << "\nFound a " << subdim << "D common eigenspace\n"; cout << "Abandoning, even though oldforms only make up "; cout << dimold << "D of this." << endl; } return; } // Pass data node through to make_submat() // NOTE originally called in go_down(), but relocated here since // it only needs to be called once per node. make_submat(data); // The recursive part: vector t_eigs = h->eigrange(depth); auto apvar = t_eigs.begin(); stringstream t_eigs_ss; std::copy(t_eigs.begin(),t_eigs.end(),ostream_iterator(t_eigs_ss," ")); ECLOG(0) << "Testing eigenvalues [ " << t_eigs_ss.str() << "] at level " << (depth+1) << endl; // Set children counter data.setChildren( t_eigs ); while( apvar != t_eigs.end() ) { ECLOG(1) << "Going down with ap = " << (*apvar) < ECLIB_RECURSION_DIM_LIMIT ) { // Post newly created child node to threadpool pool.post< ff_data >( *child ); } else { // Parallel granularity control. Continue in serial. go_down( data, eig, apvar==t_eigs.end() ); if( child -> subdim_ > 0 ) find( *child ); //if( child -> status_ != INTERNAL || child -> subdim_ == 0 ) go_up( *child ); } #else // Pass through current data node and new test eigenvalue to go_down() go_down( data, eig, apvar==t_eigs.end() ); // We pass new child node to find() if( child -> subdim_ > 0 ) find( *child ); go_up( *child ); #endif } #ifndef ECLIB_MULTITHREAD ECLOG(0) << "Finished at level " << (depth+1) << endl; #endif } void form_finder::store(vec bp, vec bm, vector eigs) { #ifdef ECLIB_MULTITHREAD // Lock function boost::mutex::scoped_lock lock( store_lock ); #endif // Store sub-bplus,bminus,eiglists in class level containers gbplus.push_back(bp); gbminus.push_back(bm); gaplist.push_back(eigs); // Increment global counter gnfcount++; // Inform about newform count ECLOG(1) << "Current newform subtotal count at " << gnfcount << endl; } #if (METHOD==2) subspace sparse_combine(const subspace& s1, const subspace& s2) { // we assume s1, s2 are subspace mod DEFAULT_MODULUS scalar d=denom(s1)*denom(s2); smat sm1(basis(s1)), sm2(basis(s2)); const mat& b = (sm1*sm2).as_mat(); const vec& p = pivots(s1)[pivots(s2)]; return subspace(b,p,d); // return COMBINE(s1,s2); } mat sparse_restrict(const mat& m, const subspace& s) { if(dim(s)==m.nrows()) return m; // trivial special case, s is whole space scalar dd = denom(s); // will be 1 if s is a mod-p subspace mat b(basis(s)); smat sm(m), sb(b); vec piv=pivots(s); smat smr = sm.select_rows(piv); smat ans = smr*sb; int check=0; if(check) { smat left = sm*sb; if(dd!=1) {cout<<"(dd="< go_down( *(this->parent_), eigenvalue_, 0 ); #ifdef ECLIB_MULTITHREAD_DEBUG ECLOG(1) << "Executing node (eig=" << eigenvalue_ << " depth=" < 0 ) ff_ -> find( *this ); // Call go_up() only if this branch has ended if( status_ != INTERNAL || subdim_ == 0 ) ff_ -> go_up( *this ); #ifdef ECLIB_MULTITHREAD_DEBUG ECLOG(1) << "Completed node (eig=" << eigenvalue_ << " depth=" < ff_data::eiglist() { // Return precomputed eiglist if available if( !eiglist_.empty() ) return eiglist_; // Root node (depth==0). Return empty vector. if( parent_ == NULL ) return vector< long >(); // Else, we concatenate lists from further up the tree. eiglist_ = parent_ -> eiglist(); eiglist_.push_back( eigenvalue_ ); return eiglist_; } /** * child() * * Returns pointer to child w.r.t. given eigenvalue. */ ff_data* ff_data::child( long eig ) { return children_[ map(eig) ]; } /** * numCompleteChildren() * * Returns number of completed children for current node. */ int ff_data::numCompleteChildren() { return std::count_if(completedChildren_.begin(), completedChildren_.end(), [](childstatus s) {return s!=NOT_COMPLETE;}); } /** * complete() * * Return true if all children complete. */ bool ff_data::complete() { return ( numCompleteChildren() == numChildren_ ) ? true : false; } /** * setStatus() * * Store status of current node. */ void ff_data::setStatus( nodestatus s ) { status_ = s; } /** * increaseDepth() * * Increases current depth. First check delta is positive. */ void ff_data::increaseDepth( long delta ) { assert( delta > 0 ); depth_ += delta; } /** * decreaseDepth() * * Decrease current depth. First check delta is positive. */ void ff_data::decreaseDepth( long delta ) { assert( delta > 0 ); depth_ -= delta; } /** * increaseSubmatUsage() * * Locked counter increment method. */ void ff_data::increaseSubmatUsage() { #ifdef ECLIB_MULTITHREAD boost::mutex::scoped_lock lock( submat_lock_ ); #endif #ifdef ECLIB_MULTITHREAD_DEBUG ECLOG(2) << "Increasing submat usage from " << submatUsage_ << " to " << submatUsage_+1 << " for node eig=" << eigenvalue_ << " depth=" << depth_ << endl; #endif ++submatUsage_; } /** * storeBplus() * * Copies given vector into object storage. * Use vec class overloaded operator=. */ void ff_data::storeBplus( vec bp ) { bplus_ = bp; } /** * storeBminus() * * Copies given vector into object storage. * Use vec class overloaded operator=. */ void ff_data::storeBminus( vec bm ) { bminus_ = bm; } /** * addChild() * * Adds a new data node to the children vector. */ void ff_data::addChild( long eig, ff_data &child ) { child.setParent( this ); child.setEigenvalue( eig ); children_[map(eig)] = &child; } /** * eraseChild() * * Calls the destructor for the data node corresponding to given eigenvalue. */ void ff_data::eraseChild( long eig ) { eraseChild( map(eig) ); } /** * eraseChild() * * Overloaded method. Main method for destroying children. */ void ff_data::eraseChild( int idx ) { #ifdef ECLIB_MULTITHREAD_DEBUG ECLOG(2) << "Deleting node (eig=" << children_[idx]->eigenvalue_ << " depth=" << depth_+1 << " status=" << children_[idx]->status_ << ")" << endl; #endif delete children_[ idx ]; children_[ idx ] = NULL; completedChildren_[ idx ] = DESTROYED; } /** * setParent() * * Stores pointer to parent data node. */ void ff_data::setParent( ff_data *parent ) { parent_ = parent; } /** * setEigenvalue() * * Stores eigenvalue. */ void ff_data::setEigenvalue( long eig ) { eigenvalue_ = eig; } /** * numChildren() * * Stores number of children and eigrange, and resize vectors to correct size. */ void ff_data::setChildren( vector eigs ) { numChildren_ = eigs.size(); eigrange_ = eigs; children_.resize( numChildren_, NULL ); completedChildren_.resize( numChildren_, NOT_COMPLETE ); } /** * childStatus() * * Sets value in map to 'flag', given a child node. * Monitors how many of a nodes children have completed. */ void ff_data::childStatus( long eig, childstatus flag ) { #ifdef ECLIB_MULTITHREAD boost::mutex::scoped_lock lock( childComplete_lock_ ); #endif completedChildren_[map(eig)] = flag; } /** * eraseChldren() * * Loops through containers and destroys all children. */ void ff_data::eraseChildren( ) { if( numChildren_ > 0 ) { for( int i = 0; i < numChildren_; i++ ) { if ( children_[i] != NULL) { children_[i] -> eraseChildren(); eraseChild( i ); } } } } /** * map() * * Hash function to map given eigenvalue * to an index value. Removes dependancy on unordered_map. * * N.B. This function no longer makes assumptions on the eigenvalues, * the number of which is numChildren_: in current practice, if * numChildren_==2, they are [-1,+1] while otherwise * numChildren_==2n+1 and they are [-n,...,-2,-1,0,1,2,...,n], but * this specific choice is no longer relied on. */ int ff_data::map( long eig ) { int i = (int)(find(eigrange_.begin(),eigrange_.end(),eig)-eigrange_.begin()); return i; } // end of XSPLIT_DATA.CC eclib-20250122/m4/000077500000000000000000000000001474421343600133575ustar00rootroot00000000000000eclib-20250122/m4/ax_boost_asio.m4000066400000000000000000000074731474421343600164650ustar00rootroot00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_boost_asio.html # =========================================================================== # # SYNOPSIS # # AX_BOOST_ASIO # # DESCRIPTION # # Test for Asio library from the Boost C++ libraries. The macro requires a # preceding call to AX_BOOST_BASE. Further documentation is available at # . # # This macro calls: # # AC_SUBST(BOOST_ASIO_LIB) # # And sets: # # HAVE_BOOST_ASIO # # LICENSE # # Copyright (c) 2008 Thomas Porschberg # Copyright (c) 2008 Pete Greenwell # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 16 AC_DEFUN([AX_BOOST_ASIO], [ AC_ARG_WITH([boost-asio], AS_HELP_STRING([--with-boost-asio@<:@=special-lib@:>@], [use the ASIO library from boost - it is possible to specify a certain library for the linker e.g. --with-boost-asio=boost_system-gcc41-mt-1_34 ]), [ if test "$withval" = "no"; then want_boost="no" elif test "$withval" = "yes"; then want_boost="yes" ax_boost_user_asio_lib="" else want_boost="yes" ax_boost_user_asio_lib="$withval" fi ], [want_boost="yes"] ) if test "x$want_boost" = "xyes"; then AC_REQUIRE([AC_PROG_CC]) CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS_SAVED="$LDFLAGS" LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS AC_CACHE_CHECK(whether the Boost::ASIO library is available, ax_cv_boost_asio, [AC_LANG_PUSH([C++]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ @%:@include ]], [[ boost::asio::io_service io; boost::system::error_code timer_result; boost::asio::deadline_timer t(io); t.cancel(); io.run_one(); return 0; ]])], ax_cv_boost_asio=yes, ax_cv_boost_asio=no) AC_LANG_POP([C++]) ]) if test "x$ax_cv_boost_asio" = "xyes"; then AC_DEFINE(HAVE_BOOST_ASIO,,[define if the Boost::ASIO library is available]) BN=boost_system BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` if test "x$ax_boost_user_asio_lib" = "x"; then for ax_lib in `ls $BOOSTLIBDIR/libboost_system*.so* $BOOSTLIBDIR/libboost_system*.dylib* $BOOSTLIBDIR/libboost_system*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_system.*\)\.so.*$;\1;' -e 's;^lib\(boost_system.*\)\.dylib.*$;\1;' -e 's;^lib\(boost_system.*\)\.a.*$;\1;' ` ; do AC_CHECK_LIB($ax_lib, main, [BOOST_ASIO_LIB="-l$ax_lib" AC_SUBST(BOOST_ASIO_LIB) link_thread="yes" break], [link_thread="no"]) done else for ax_lib in $ax_boost_user_asio_lib $BN-$ax_boost_user_asio_lib; do AC_CHECK_LIB($ax_lib, main, [BOOST_ASIO_LIB="-l$ax_lib" AC_SUBST(BOOST_ASIO_LIB) link_asio="yes" break], [link_asio="no"]) done fi if test "x$ax_lib" = "x"; then AC_MSG_ERROR(Could not find a version of the library!) fi if test "x$link_asio" = "xno"; then AC_MSG_ERROR(Could not link against $ax_lib !) fi fi CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" fi ]) eclib-20250122/m4/ax_boost_base.m4000066400000000000000000000257651474421343600164500ustar00rootroot00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_boost_base.html # =========================================================================== # # SYNOPSIS # # AX_BOOST_BASE([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # DESCRIPTION # # Test for the Boost C++ libraries of a particular version (or newer) # # If no path to the installed boost library is given the macro searchs # under /usr, /usr/local, /opt and /opt/local and evaluates the # $BOOST_ROOT environment variable. Further documentation is available at # . # # This macro calls: # # AC_SUBST(BOOST_CPPFLAGS) / AC_SUBST(BOOST_LDFLAGS) # # And sets: # # HAVE_BOOST # # LICENSE # # Copyright (c) 2008 Thomas Porschberg # Copyright (c) 2009 Peter Adolphs # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 26 AC_DEFUN([AX_BOOST_BASE], [ AC_ARG_WITH([boost], [AS_HELP_STRING([--with-boost@<:@=ARG@:>@], [use Boost library from a standard location (ARG=yes), from the specified location (ARG=), or disable it (ARG=no) @<:@ARG=no@:>@ ])], [ if test "$withval" = "no"; then want_boost="no" elif test "$withval" = "yes"; then want_boost="yes" ac_boost_path="" else want_boost="yes" ac_boost_path="$withval" fi ], [want_boost="no"]) AC_ARG_WITH([boost-libdir], AS_HELP_STRING([--with-boost-libdir=LIB_DIR], [Force given directory for boost libraries. Note that this will override library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located.]), [ if test -d "$withval" then ac_boost_lib_path="$withval" else AC_MSG_ERROR(--with-boost-libdir expected directory name) fi ], [ac_boost_lib_path=""] ) if test "x$want_boost" = "xyes"; then boost_lib_version_req=ifelse([$1], ,1.20.0,$1) boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([[0-9]]*\.[[0-9]]*\)'` boost_lib_version_req_major=`expr $boost_lib_version_req : '\([[0-9]]*\)'` boost_lib_version_req_minor=`expr $boost_lib_version_req : '[[0-9]]*\.\([[0-9]]*\)'` boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` if test "x$boost_lib_version_req_sub_minor" = "x" ; then boost_lib_version_req_sub_minor="0" fi WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor` AC_MSG_CHECKING(for boostlib >= $boost_lib_version_req) succeeded=no dnl On 64-bit systems check for system libraries in both lib64 and lib. dnl The former is specified by FHS, but e.g. Debian does not adhere to dnl this (as it rises problems for generic multi-arch support). dnl The last entry in the list is chosen by default when no libraries dnl are found, e.g. when only header-only libraries are installed! libsubdirs="lib" ax_arch=`uname -m` case $ax_arch in x86_64) libsubdirs="lib64 libx32 lib lib64" ;; ppc64|s390x|sparc64|aarch64|ppc64le) libsubdirs="lib64 lib lib64 ppc64le" ;; esac dnl allow for real multi-arch paths e.g. /usr/lib/x86_64-linux-gnu. Give dnl them priority over the other paths since, if libs are found there, they dnl are almost assuredly the ones desired. AC_REQUIRE([AC_CANONICAL_HOST]) libsubdirs="lib/${host_cpu}-${host_os} $libsubdirs" case ${host_cpu} in i?86) libsubdirs="lib/i386-${host_os} $libsubdirs" ;; esac dnl first we check the system location for boost libraries dnl this location ist chosen if boost libraries are installed with the --layout=system option dnl or if you install boost with RPM if test "$ac_boost_path" != ""; then BOOST_CPPFLAGS="-I$ac_boost_path/include" for ac_boost_path_tmp in $libsubdirs; do if test -d "$ac_boost_path"/"$ac_boost_path_tmp" ; then BOOST_LDFLAGS="-L$ac_boost_path/$ac_boost_path_tmp" break fi done elif test "$cross_compiling" != yes; then for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then for libsubdir in $libsubdirs ; do if ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$ac_boost_path_tmp/$libsubdir" BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include" break; fi done fi dnl overwrite ld flags if we have required special directory with dnl --with-boost-libdir parameter if test "$ac_boost_lib_path" != ""; then BOOST_LDFLAGS="-L$ac_boost_lib_path" fi CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS_SAVED="$LDFLAGS" LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH(C++) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ @%:@include ]], [[ #if BOOST_VERSION >= $WANT_BOOST_VERSION // Everything is okay #else # error Boost version is too old #endif ]])],[ AC_MSG_RESULT(yes) succeeded=yes found_system=yes ],[ ]) AC_LANG_POP([C++]) dnl if we found no boost with system layout we search for boost libraries dnl built and installed without the --layout=system option or for a staged(not installed) version if test "x$succeeded" != "xyes"; then CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" BOOST_CPPFLAGS= BOOST_LDFLAGS= _version=0 if test "$ac_boost_path" != ""; then if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` if test "$V_CHECK" = "1" ; then _version=$_version_tmp fi VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE" done dnl if nothing found search for layout used in Windows distributions if test -z "$BOOST_CPPFLAGS"; then if test -d "$ac_boost_path/boost" && test -r "$ac_boost_path/boost"; then BOOST_CPPFLAGS="-I$ac_boost_path" fi fi fi else if test "$cross_compiling" != yes; then for ac_boost_path in /usr /usr/local /opt /opt/local ; do if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` if test "$V_CHECK" = "1" ; then _version=$_version_tmp best_path=$ac_boost_path fi done fi done VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE" if test "$ac_boost_lib_path" = ""; then for libsubdir in $libsubdirs ; do if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done BOOST_LDFLAGS="-L$best_path/$libsubdir" fi fi if test "x$BOOST_ROOT" != "x"; then for libsubdir in $libsubdirs ; do if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'` stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'` stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'` V_CHECK=`expr $stage_version_shorten \>\= $_version` if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT) BOOST_CPPFLAGS="-I$BOOST_ROOT" BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir" fi fi fi fi CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS AC_LANG_PUSH(C++) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ @%:@include ]], [[ #if BOOST_VERSION >= $WANT_BOOST_VERSION // Everything is okay #else # error Boost version is too old #endif ]])],[ AC_MSG_RESULT(yes) succeeded=yes found_system=yes ],[ ]) AC_LANG_POP([C++]) fi if test "$succeeded" != "yes" ; then if test "$_version" = "0" ; then AC_MSG_NOTICE([[We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation.]]) else AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).]) fi # execute ACTION-IF-NOT-FOUND (if present): ifelse([$3], , :, [$3]) else AC_SUBST(BOOST_CPPFLAGS) AC_SUBST(BOOST_LDFLAGS) AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available]) # execute ACTION-IF-FOUND (if present): ifelse([$2], , :, [$2]) fi CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" fi ]) eclib-20250122/m4/ax_boost_system.m4000066400000000000000000000101341474421343600170420ustar00rootroot00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_boost_system.html # =========================================================================== # # SYNOPSIS # # AX_BOOST_SYSTEM # # DESCRIPTION # # Test for System library from the Boost C++ libraries. The macro requires # a preceding call to AX_BOOST_BASE. Further documentation is available at # . # # This macro calls: # # AC_SUBST(BOOST_SYSTEM_LIB) # # And sets: # # HAVE_BOOST_SYSTEM # # LICENSE # # Copyright (c) 2008 Thomas Porschberg # Copyright (c) 2008 Michael Tindal # Copyright (c) 2008 Daniel Casimiro # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 17 AC_DEFUN([AX_BOOST_SYSTEM], [ AC_ARG_WITH([boost-system], AS_HELP_STRING([--with-boost-system@<:@=special-lib@:>@], [use the System library from boost - it is possible to specify a certain library for the linker e.g. --with-boost-system=boost_system-gcc-mt ]), [ if test "$withval" = "no"; then want_boost="no" elif test "$withval" = "yes"; then want_boost="yes" ax_boost_user_system_lib="" else want_boost="yes" ax_boost_user_system_lib="$withval" fi ], [want_boost="yes"] ) if test "x$want_boost" = "xyes"; then AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_BUILD]) CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS_SAVED="$LDFLAGS" LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS AC_CACHE_CHECK(whether the Boost::System library is available, ax_cv_boost_system, [AC_LANG_PUSH([C++]) CXXFLAGS_SAVE=$CXXFLAGS AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], [[boost::system::system_category]])], ax_cv_boost_system=yes, ax_cv_boost_system=no) CXXFLAGS=$CXXFLAGS_SAVE AC_LANG_POP([C++]) ]) if test "x$ax_cv_boost_system" = "xyes"; then AC_SUBST(BOOST_CPPFLAGS) AC_DEFINE(HAVE_BOOST_SYSTEM,,[define if the Boost::System library is available]) BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` LDFLAGS_SAVE=$LDFLAGS if test "x$ax_boost_user_system_lib" = "x"; then for libextension in `ls -r $BOOSTLIBDIR/libboost_system* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'` ; do ax_lib=${libextension} AC_CHECK_LIB($ax_lib, exit, [BOOST_SYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_SYSTEM_LIB) link_system="yes"; break], [link_system="no"]) done if test "x$link_system" != "xyes"; then for libextension in `ls -r $BOOSTLIBDIR/boost_system* 2>/dev/null | sed 's,.*/,,' | sed -e 's,\..*,,'` ; do ax_lib=${libextension} AC_CHECK_LIB($ax_lib, exit, [BOOST_SYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_SYSTEM_LIB) link_system="yes"; break], [link_system="no"]) done fi else for ax_lib in $ax_boost_user_system_lib boost_system-$ax_boost_user_system_lib; do AC_CHECK_LIB($ax_lib, exit, [BOOST_SYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_SYSTEM_LIB) link_system="yes"; break], [link_system="no"]) done fi if test "x$ax_lib" = "x"; then AC_MSG_ERROR(Could not find a version of the library!) fi if test "x$link_system" = "xno"; then AC_MSG_ERROR(Could not link against $ax_lib !) fi fi CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" fi ]) eclib-20250122/m4/ax_boost_thread.m4000066400000000000000000000117751474421343600170010ustar00rootroot00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_boost_thread.html # =========================================================================== # # SYNOPSIS # # AX_BOOST_THREAD # # DESCRIPTION # # Test for Thread library from the Boost C++ libraries. The macro requires # a preceding call to AX_BOOST_BASE. Further documentation is available at # . # # This macro calls: # # AC_SUBST(BOOST_THREAD_LIB) # # And sets: # # HAVE_BOOST_THREAD # # LICENSE # # Copyright (c) 2009 Thomas Porschberg # Copyright (c) 2009 Michael Tindal # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 27 AC_DEFUN([AX_BOOST_THREAD], [ AC_ARG_WITH([boost-thread], AS_HELP_STRING([--with-boost-thread@<:@=special-lib@:>@], [use the Thread library from boost - it is possible to specify a certain library for the linker e.g. --with-boost-thread=boost_thread-gcc-mt ]), [ if test "$withval" = "no"; then want_boost="no" elif test "$withval" = "yes"; then want_boost="yes" ax_boost_user_thread_lib="" else want_boost="yes" ax_boost_user_thread_lib="$withval" fi ], [want_boost="yes"] ) if test "x$want_boost" = "xyes"; then AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_BUILD]) CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS LDFLAGS_SAVED="$LDFLAGS" LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" export LDFLAGS AC_CACHE_CHECK(whether the Boost::Thread library is available, ax_cv_boost_thread, [AC_LANG_PUSH([C++]) CXXFLAGS_SAVE=$CXXFLAGS if test "x$host_os" = "xsolaris" ; then CXXFLAGS="-pthreads $CXXFLAGS" elif test "x$host_os" = "xmingw32" ; then CXXFLAGS="-mthreads $CXXFLAGS" else CXXFLAGS="-pthread $CXXFLAGS" fi AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], [[boost::thread_group thrds; return 0;]])], ax_cv_boost_thread=yes, ax_cv_boost_thread=no) CXXFLAGS=$CXXFLAGS_SAVE AC_LANG_POP([C++]) ]) if test "x$ax_cv_boost_thread" = "xyes"; then if test "x$host_os" = "xsolaris" ; then BOOST_CPPFLAGS="-pthreads $BOOST_CPPFLAGS" elif test "x$host_os" = "xmingw32" ; then BOOST_CPPFLAGS="-mthreads $BOOST_CPPFLAGS" else BOOST_CPPFLAGS="-pthread $BOOST_CPPFLAGS" fi AC_SUBST(BOOST_CPPFLAGS) AC_DEFINE(HAVE_BOOST_THREAD,,[define if the Boost::Thread library is available]) BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` LDFLAGS_SAVE=$LDFLAGS case "x$host_os" in *bsd* ) LDFLAGS="-pthread $LDFLAGS" break; ;; esac if test "x$ax_boost_user_thread_lib" = "x"; then for libextension in `ls -r $BOOSTLIBDIR/libboost_thread* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'`; do ax_lib=${libextension} AC_CHECK_LIB($ax_lib, exit, [BOOST_THREAD_LIB="-l$ax_lib"; AC_SUBST(BOOST_THREAD_LIB) link_thread="yes"; break], [link_thread="no"]) done if test "x$link_thread" != "xyes"; then for libextension in `ls -r $BOOSTLIBDIR/boost_thread* 2>/dev/null | sed 's,.*/,,' | sed 's,\..*,,'`; do ax_lib=${libextension} AC_CHECK_LIB($ax_lib, exit, [BOOST_THREAD_LIB="-l$ax_lib"; AC_SUBST(BOOST_THREAD_LIB) link_thread="yes"; break], [link_thread="no"]) done fi else for ax_lib in $ax_boost_user_thread_lib boost_thread-$ax_boost_user_thread_lib; do AC_CHECK_LIB($ax_lib, exit, [BOOST_THREAD_LIB="-l$ax_lib"; AC_SUBST(BOOST_THREAD_LIB) link_thread="yes"; break], [link_thread="no"]) done fi if test "x$ax_lib" = "x"; then AC_MSG_ERROR(Could not find a version of the library!) fi if test "x$link_thread" = "xno"; then AC_MSG_ERROR(Could not link against $ax_lib !) else case "x$host_os" in *bsd* ) BOOST_LDFLAGS="-pthread $BOOST_LDFLAGS" break; ;; esac fi fi CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" fi ]) eclib-20250122/m4/ax_cxx_compile_stdcxx.m4000066400000000000000000000520731474421343600202270ustar00rootroot00000000000000# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html # =========================================================================== # # SYNOPSIS # # AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional]) # # DESCRIPTION # # Check for baseline language coverage in the compiler for the specified # version of the C++ standard. If necessary, add switches to CXX and # CXXCPP to enable support. VERSION may be '11', '14', '17', or '20' for # the respective C++ standard version. # # The second argument, if specified, indicates whether you insist on an # extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. # -std=c++11). If neither is specified, you get whatever works, with # preference for no added switch, and then for an extended mode. # # The third argument, if specified 'mandatory' or if left unspecified, # indicates that baseline support for the specified C++ standard is # required and that the macro should error out if no mode with that # support is found. If specified 'optional', then configuration proceeds # regardless, after defining HAVE_CXX${VERSION} if and only if a # supporting mode is found. # # LICENSE # # Copyright (c) 2008 Benjamin Kosnik # Copyright (c) 2012 Zack Weinberg # Copyright (c) 2013 Roy Stogner # Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov # Copyright (c) 2015 Paul Norman # Copyright (c) 2015 Moritz Klammler # Copyright (c) 2016, 2018 Krzesimir Nowak # Copyright (c) 2019 Enji Cooper # Copyright (c) 2020 Jason Merrill # Copyright (c) 2021 Jörn Heusipp # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. #serial 18 dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro dnl (serial version number 13). AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"], [$1], [14], [ax_cxx_compile_alternatives="14 1y"], [$1], [17], [ax_cxx_compile_alternatives="17 1z"], [$1], [20], [ax_cxx_compile_alternatives="20"], [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl m4_if([$2], [], [], [$2], [ext], [], [$2], [noext], [], [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true], [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], [$3], [optional], [ax_cxx_compile_cxx$1_required=false], [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) AC_LANG_PUSH([C++])dnl ac_success=no m4_if([$2], [], [dnl AC_CACHE_CHECK(whether $CXX supports C++$1 features by default, ax_cv_cxx_compile_cxx$1, [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], [ax_cv_cxx_compile_cxx$1=yes], [ax_cv_cxx_compile_cxx$1=no])]) if test x$ax_cv_cxx_compile_cxx$1 = xyes; then ac_success=yes fi]) m4_if([$2], [noext], [], [dnl if test x$ac_success = xno; then for alternative in ${ax_cxx_compile_alternatives}; do switch="-std=gnu++${alternative}" cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, $cachevar, [ac_save_CXX="$CXX" CXX="$CXX $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], [eval $cachevar=yes], [eval $cachevar=no]) CXX="$ac_save_CXX"]) if eval test x\$$cachevar = xyes; then CXX="$CXX $switch" if test -n "$CXXCPP" ; then CXXCPP="$CXXCPP $switch" fi ac_success=yes break fi done fi]) m4_if([$2], [ext], [], [dnl if test x$ac_success = xno; then dnl HP's aCC needs +std=c++11 according to: dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf dnl Cray's crayCC needs "-h std=c++11" dnl MSVC needs -std:c++NN for C++17 and later (default is C++14) for alternative in ${ax_cxx_compile_alternatives}; do for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}" MSVC; do if test x"$switch" = xMSVC; then dnl AS_TR_SH maps both `:` and `=` to `_` so -std:c++17 would collide dnl with -std=c++17. We suffix the cache variable name with _MSVC to dnl avoid this. switch=-std:c++${alternative} cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_${switch}_MSVC]) else cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) fi AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, $cachevar, [ac_save_CXX="$CXX" CXX="$CXX $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], [eval $cachevar=yes], [eval $cachevar=no]) CXX="$ac_save_CXX"]) if eval test x\$$cachevar = xyes; then CXX="$CXX $switch" if test -n "$CXXCPP" ; then CXXCPP="$CXXCPP $switch" fi ac_success=yes break fi done if test x$ac_success = xyes; then break fi done fi]) AC_LANG_POP([C++]) if test x$ax_cxx_compile_cxx$1_required = xtrue; then if test x$ac_success = xno; then AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.]) fi fi if test x$ac_success = xno; then HAVE_CXX$1=0 AC_MSG_NOTICE([No compiler with C++$1 support was found]) else HAVE_CXX$1=1 AC_DEFINE(HAVE_CXX$1,1, [define if the compiler supports basic C++$1 syntax]) fi AC_SUBST(HAVE_CXX$1) ]) dnl Test body for checking C++11 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 ) dnl Test body for checking C++14 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 ) dnl Test body for checking C++17 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17], _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 ) dnl Test body for checking C++20 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_20], _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 _AX_CXX_COMPILE_STDCXX_testbody_new_in_20 ) dnl Tests for new features in C++11 m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ // If the compiler admits that it is not ready for C++11, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" // MSVC always sets __cplusplus to 199711L in older versions; newer versions // only set it correctly if /Zc:__cplusplus is specified as well as a // /std:c++NN switch: // https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ #elif __cplusplus < 201103L && !defined _MSC_VER #error "This is not a C++11 compiler" #else namespace cxx11 { namespace test_static_assert { template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; } namespace test_final_override { struct Base { virtual ~Base() {} virtual void f() {} }; struct Derived : public Base { virtual ~Derived() override {} virtual void f() override {} }; } namespace test_double_right_angle_brackets { template < typename T > struct check {}; typedef check single_type; typedef check> double_type; typedef check>> triple_type; typedef check>>> quadruple_type; } namespace test_decltype { int f() { int a = 1; decltype(a) b = 2; return a + b; } } namespace test_type_deduction { template < typename T1, typename T2 > struct is_same { static const bool value = false; }; template < typename T > struct is_same { static const bool value = true; }; template < typename T1, typename T2 > auto add(T1 a1, T2 a2) -> decltype(a1 + a2) { return a1 + a2; } int test(const int c, volatile int v) { static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == false, ""); auto ac = c; auto av = v; auto sumi = ac + av + 'x'; auto sumf = ac + av + 1.0; static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == true, ""); return (sumf > 0.0) ? sumi : add(c, v); } } namespace test_noexcept { int f() { return 0; } int g() noexcept { return 0; } static_assert(noexcept(f()) == false, ""); static_assert(noexcept(g()) == true, ""); } namespace test_constexpr { template < typename CharT > unsigned long constexpr strlen_c_r(const CharT *const s, const unsigned long acc) noexcept { return *s ? strlen_c_r(s + 1, acc + 1) : acc; } template < typename CharT > unsigned long constexpr strlen_c(const CharT *const s) noexcept { return strlen_c_r(s, 0UL); } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("1") == 1UL, ""); static_assert(strlen_c("example") == 7UL, ""); static_assert(strlen_c("another\0example") == 7UL, ""); } namespace test_rvalue_references { template < int N > struct answer { static constexpr int value = N; }; answer<1> f(int&) { return answer<1>(); } answer<2> f(const int&) { return answer<2>(); } answer<3> f(int&&) { return answer<3>(); } void test() { int i = 0; const int c = 0; static_assert(decltype(f(i))::value == 1, ""); static_assert(decltype(f(c))::value == 2, ""); static_assert(decltype(f(0))::value == 3, ""); } } namespace test_uniform_initialization { struct test { static const int zero {}; static const int one {1}; }; static_assert(test::zero == 0, ""); static_assert(test::one == 1, ""); } namespace test_lambdas { void test1() { auto lambda1 = [](){}; auto lambda2 = lambda1; lambda1(); lambda2(); } int test2() { auto a = [](int i, int j){ return i + j; }(1, 2); auto b = []() -> int { return '0'; }(); auto c = [=](){ return a + b; }(); auto d = [&](){ return c; }(); auto e = [a, &b](int x) mutable { const auto identity = [](int y){ return y; }; for (auto i = 0; i < a; ++i) a += b--; return x + identity(a + b); }(0); return a + b + c + d + e; } int test3() { const auto nullary = [](){ return 0; }; const auto unary = [](int x){ return x; }; using nullary_t = decltype(nullary); using unary_t = decltype(unary); const auto higher1st = [](nullary_t f){ return f(); }; const auto higher2nd = [unary](nullary_t f1){ return [unary, f1](unary_t f2){ return f2(unary(f1())); }; }; return higher1st(nullary) + higher2nd(nullary)(unary); } } namespace test_variadic_templates { template struct sum; template struct sum { static constexpr auto value = N0 + sum::value; }; template <> struct sum<> { static constexpr auto value = 0; }; static_assert(sum<>::value == 0, ""); static_assert(sum<1>::value == 1, ""); static_assert(sum<23>::value == 23, ""); static_assert(sum<1, 2>::value == 3, ""); static_assert(sum<5, 5, 11>::value == 21, ""); static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); } // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function // because of this. namespace test_template_alias_sfinae { struct foo {}; template using member = typename T::member_type; template void func(...) {} template void func(member*) {} void test(); void test() { func(0); } } } // namespace cxx11 #endif // __cplusplus >= 201103L ]]) dnl Tests for new features in C++14 m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[ // If the compiler admits that it is not ready for C++14, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201402L && !defined _MSC_VER #error "This is not a C++14 compiler" #else namespace cxx14 { namespace test_polymorphic_lambdas { int test() { const auto lambda = [](auto&&... args){ const auto istiny = [](auto x){ return (sizeof(x) == 1UL) ? 1 : 0; }; const int aretiny[] = { istiny(args)... }; return aretiny[0]; }; return lambda(1, 1L, 1.0f, '1'); } } namespace test_binary_literals { constexpr auto ivii = 0b0000000000101010; static_assert(ivii == 42, "wrong value"); } namespace test_generalized_constexpr { template < typename CharT > constexpr unsigned long strlen_c(const CharT *const s) noexcept { auto length = 0UL; for (auto p = s; *p; ++p) ++length; return length; } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("x") == 1UL, ""); static_assert(strlen_c("test") == 4UL, ""); static_assert(strlen_c("another\0test") == 7UL, ""); } namespace test_lambda_init_capture { int test() { auto x = 0; const auto lambda1 = [a = x](int b){ return a + b; }; const auto lambda2 = [a = lambda1(x)](){ return a; }; return lambda2(); } } namespace test_digit_separators { constexpr auto ten_million = 100'000'000; static_assert(ten_million == 100000000, ""); } namespace test_return_type_deduction { auto f(int& x) { return x; } decltype(auto) g(int& x) { return x; } template < typename T1, typename T2 > struct is_same { static constexpr auto value = false; }; template < typename T > struct is_same { static constexpr auto value = true; }; int test() { auto x = 0; static_assert(is_same::value, ""); static_assert(is_same::value, ""); return x; } } } // namespace cxx14 #endif // __cplusplus >= 201402L ]]) dnl Tests for new features in C++17 m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[ // If the compiler admits that it is not ready for C++17, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201703L && !defined _MSC_VER #error "This is not a C++17 compiler" #else #include #include #include namespace cxx17 { namespace test_constexpr_lambdas { constexpr int foo = [](){return 42;}(); } namespace test::nested_namespace::definitions { } namespace test_fold_expression { template int multiply(Args... args) { return (args * ... * 1); } template bool all(Args... args) { return (args && ...); } } namespace test_extended_static_assert { static_assert (true); } namespace test_auto_brace_init_list { auto foo = {5}; auto bar {5}; static_assert(std::is_same, decltype(foo)>::value); static_assert(std::is_same::value); } namespace test_typename_in_template_template_parameter { template typename X> struct D; } namespace test_fallthrough_nodiscard_maybe_unused_attributes { int f1() { return 42; } [[nodiscard]] int f2() { [[maybe_unused]] auto unused = f1(); switch (f1()) { case 17: f1(); [[fallthrough]]; case 42: f1(); } return f1(); } } namespace test_extended_aggregate_initialization { struct base1 { int b1, b2 = 42; }; struct base2 { base2() { b3 = 42; } int b3; }; struct derived : base1, base2 { int d; }; derived d1 {{1, 2}, {}, 4}; // full initialization derived d2 {{}, {}, 4}; // value-initialized bases } namespace test_general_range_based_for_loop { struct iter { int i; int& operator* () { return i; } const int& operator* () const { return i; } iter& operator++() { ++i; return *this; } }; struct sentinel { int i; }; bool operator== (const iter& i, const sentinel& s) { return i.i == s.i; } bool operator!= (const iter& i, const sentinel& s) { return !(i == s); } struct range { iter begin() const { return {0}; } sentinel end() const { return {5}; } }; void f() { range r {}; for (auto i : r) { [[maybe_unused]] auto v = i; } } } namespace test_lambda_capture_asterisk_this_by_value { struct t { int i; int foo() { return [*this]() { return i; }(); } }; } namespace test_enum_class_construction { enum class byte : unsigned char {}; byte foo {42}; } namespace test_constexpr_if { template int f () { if constexpr(cond) { return 13; } else { return 42; } } } namespace test_selection_statement_with_initializer { int f() { return 13; } int f2() { if (auto i = f(); i > 0) { return 3; } switch (auto i = f(); i + 4) { case 17: return 2; default: return 1; } } } namespace test_template_argument_deduction_for_class_templates { template struct pair { pair (T1 p1, T2 p2) : m1 {p1}, m2 {p2} {} T1 m1; T2 m2; }; void f() { [[maybe_unused]] auto p = pair{13, 42u}; } } namespace test_non_type_auto_template_parameters { template struct B {}; B<5> b1; B<'a'> b2; } namespace test_structured_bindings { int arr[2] = { 1, 2 }; std::pair pr = { 1, 2 }; auto f1() -> int(&)[2] { return arr; } auto f2() -> std::pair& { return pr; } struct S { int x1 : 2; volatile double y1; }; S f3() { return {}; } auto [ x1, y1 ] = f1(); auto& [ xr1, yr1 ] = f1(); auto [ x2, y2 ] = f2(); auto& [ xr2, yr2 ] = f2(); const auto [ x3, y3 ] = f3(); } namespace test_exception_spec_type_system { struct Good {}; struct Bad {}; void g1() noexcept; void g2(); template Bad f(T*, T*); template Good f(T1*, T2*); static_assert (std::is_same_v); } namespace test_inline_variables { template void f(T) {} template inline T g(T) { return T{}; } template<> inline void f<>(int) {} template<> int g<>(int) { return 5; } } } // namespace cxx17 #endif // __cplusplus < 201703L && !defined _MSC_VER ]]) dnl Tests for new features in C++20 m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_20], [[ #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 202002L && !defined _MSC_VER #error "This is not a C++20 compiler" #else #include namespace cxx20 { // As C++20 supports feature test macros in the standard, there is no // immediate need to actually test for feature availability on the // Autoconf side. } // namespace cxx20 #endif // __cplusplus < 202002L && !defined _MSC_VER ]]) eclib-20250122/m4/ax_pthread.m4000066400000000000000000000326761474421343600157560ustar00rootroot00000000000000# =========================================================================== # http://www.gnu.org/software/autoconf-archive/ax_pthread.html # =========================================================================== # # SYNOPSIS # # AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) # # DESCRIPTION # # This macro figures out how to build C programs using POSIX threads. It # sets the PTHREAD_LIBS output variable to the threads library and linker # flags, and the PTHREAD_CFLAGS output variable to any special C compiler # flags that are needed. (The user can also force certain compiler # flags/libs to be tested by setting these environment variables.) # # Also sets PTHREAD_CC to any special C compiler that is needed for # multi-threaded programs (defaults to the value of CC otherwise). (This # is necessary on AIX to use the special cc_r compiler alias.) # # NOTE: You are assumed to not only compile your program with these flags, # but also link it with them as well. e.g. you should link with # $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS # # If you are only building threads programs, you may wish to use these # variables in your default LIBS, CFLAGS, and CC: # # LIBS="$PTHREAD_LIBS $LIBS" # CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # CC="$PTHREAD_CC" # # In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant # has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name # (e.g. PTHREAD_CREATE_UNDETACHED on AIX). # # Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the # PTHREAD_PRIO_INHERIT symbol is defined when compiling with # PTHREAD_CFLAGS. # # ACTION-IF-FOUND is a list of shell commands to run if a threads library # is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it # is not found. If ACTION-IF-FOUND is not specified, the default action # will define HAVE_PTHREAD. # # Please let the authors know if this macro fails on any platform, or if # you have any other suggestions or comments. This macro was based on work # by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help # from M. Frigo), as well as ac_pthread and hb_pthread macros posted by # Alejandro Forero Cuervo to the autoconf macro repository. We are also # grateful for the helpful feedback of numerous users. # # Updated for Autoconf 2.68 by Daniel Richard G. # # LICENSE # # Copyright (c) 2008 Steven G. Johnson # Copyright (c) 2011 Daniel Richard G. # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the # Free Software Foundation, either version 3 of the License, or (at your # option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General # Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 21 AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) AC_DEFUN([AX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_LANG_PUSH([C]) ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) AC_TRY_LINK_FUNC([pthread_join], [ax_pthread_ok=yes]) AC_MSG_RESULT([$ax_pthread_ok]) if test x"$ax_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) # -pthreads: Solaris/gcc # -mthreads: Mingw32/gcc, Lynx/gcc # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads too; # also defines -D_REENTRANT) # ... -mt is also the pthreads flag for HP/aCC # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case ${host_os} in solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (We need to link with -pthreads/-mt/ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather # a function called by this macro, so we could check for that, but # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" ;; darwin*) ax_pthread_flags="-pthread $ax_pthread_flags" ;; esac # Clang doesn't consider unrecognized options an error unless we specify # -Werror. We throw in some extra Clang-specific options to ensure that # this doesn't happen for GCC, which also accepts -Werror. AC_MSG_CHECKING([if compiler needs -Werror to reject unknown flags]) save_CFLAGS="$CFLAGS" ax_pthread_extra_flags="-Werror" CFLAGS="$CFLAGS $ax_pthread_extra_flags -Wunknown-warning-option -Wsizeof-array-argument" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([int foo(void);],[foo()])], [AC_MSG_RESULT([yes])], [ax_pthread_extra_flags= AC_MSG_RESULT([no])]) CFLAGS="$save_CFLAGS" if test x"$ax_pthread_ok" = xno; then for flag in $ax_pthread_flags; do case $flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; -*) AC_MSG_CHECKING([whether pthreads work with $flag]) PTHREAD_CFLAGS="$flag" ;; pthread-config) AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) if test x"$ax_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) AC_MSG_CHECKING([for the pthreads library -l$flag]) PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS $ax_pthread_extra_flags" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. AC_LINK_IFELSE([AC_LANG_PROGRAM([#include static void routine(void *a) { a = 0; } static void *start_routine(void *a) { return a; }], [pthread_t th; pthread_attr_t attr; pthread_create(&th, 0, start_routine, 0); pthread_join(th, 0); pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_cleanup_pop(0) /* ; */])], [ax_pthread_ok=yes], []) LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" AC_MSG_RESULT([$ax_pthread_ok]) if test "x$ax_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$ax_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. AC_MSG_CHECKING([for joinable pthread attribute]) attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], [int attr = $attr; return attr /* ; */])], [attr_name=$attr; break], []) done AC_MSG_RESULT([$attr_name]) if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], [$attr_name], [Define to necessary symbol if this constant uses a non-standard name on your system.]) fi AC_MSG_CHECKING([if more special flags are required for pthreads]) flag=no case ${host_os} in aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";; osf* | hpux*) flag="-D_REENTRANT";; solaris*) if test "$GCC" = "yes"; then flag="-D_REENTRANT" else # TODO: What about Clang on Solaris? flag="-mt -D_REENTRANT" fi ;; esac AC_MSG_RESULT([$flag]) if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], [ax_cv_PTHREAD_PRIO_INHERIT], [ AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[int i = PTHREAD_PRIO_INHERIT;]])], [ax_cv_PTHREAD_PRIO_INHERIT=yes], [ax_cv_PTHREAD_PRIO_INHERIT=no]) ]) AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"], [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])]) LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: compile with *_r variant if test "x$GCC" != xyes; then case $host_os in aix*) AS_CASE(["x/$CC"], [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], [#handle absolute path differently from PATH based program lookup AS_CASE(["x$CC"], [x/*], [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])], [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])]) ;; esac fi fi test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" AC_SUBST([PTHREAD_LIBS]) AC_SUBST([PTHREAD_CFLAGS]) AC_SUBST([PTHREAD_CC]) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$ax_pthread_ok" = xyes; then ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1]) : else ax_pthread_ok=no $2 fi AC_LANG_POP ])dnl AX_PTHREAD eclib-20250122/man/000077500000000000000000000000001474421343600136125ustar00rootroot00000000000000eclib-20250122/man/Makefile.am000066400000000000000000000000311474421343600156400ustar00rootroot00000000000000dist_man_MANS = mwrank.1 eclib-20250122/man/mwrank.1000066400000000000000000000031201474421343600151670ustar00rootroot00000000000000.TH MWRANK "1" "May 2012" "mwrank 2012-07-30" "User Commands" .SH NAME mwrank \- determines the rank of an elliptic curve E over Q by 2-descent and generating points for E(Q) modulo torsion .SH DESCRIPTION mwrank is organized as a loop where the user enters curves one by one and the program displays what it can compute about them. An elliptic curve is entered by giving its Weierstrass coefficients (which may be integers or rationals, either as [a1,a2,a3,a4,a6] or as a1 a2 a3 a4 a6. Here are mwrank command line options (can be in any order): .PP .HP \fB\-h\fR help prints this info and quits .IP .HP \fB\-q\fR quiet turns OFF banner display .IP .HP \fB\-v\fR n verbosity sets verbosity to n (default=1) .IP .HP \fB\-o\fR PARI/GP output turns ON extra PARI/GP short output (default is OFF) .IP .HP \fB\-p\fR n precision sets precision to n decimals (default=15) .IP .HP \fB\-b\fR n quartic bound bound on quartic point search (default=10) .IP .HP \fB\-x\fR n n aux number of aux primes used for sieving (default=6) .IP .HP \fB\-l\fR list turns ON listing of points (default ON unless v=0) .IP .HP \fB\-t\fR trace turns ON trace of quartic equivalence testing (debugging only) .IP .HP \fB\-s\fR selmer_only if set, computes Selmer rank only (default: not set) .IP .HP \fB\-d\fR skip_2nd_descent if set, skips the second descent for curves with 2\-torsion (default: not set) .IP .HP \fB\-S\fR n sat_bd upper bound on saturation primes (default=1000, \fB\-1\fR for automatic) eclib-20250122/progs/000077500000000000000000000000001474421343600141715ustar00rootroot00000000000000eclib-20250122/progs/Makefile.am000066400000000000000000000106301474421343600162250ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in prog_input_dir = $(srcdir)/in if NO_MPFP prog_output_dir = $(srcdir)/out_no_ntl MPFP_SWITCH="-DNO_MPFP" else prog_output_dir = $(srcdir)/out_ntl MPFP_SWITCH= endif LDFLAGS_BOOST = $(BOOST_LDFLAGS) $(BOOST_ASIO_LDFLAGS) $(BOOST_THREAD_LDFLAGS) BOOST_LIBS = $(BOOST_ASIO_LIB) $(BOOST_THREAD_LIB) AM_CPPFLAGS = -I$(top_srcdir)/libsrc $(FLINT_CFLAGS) $(NTL_CFLAGS) $(PARI_CFLAGS) $(BOOST_CPPFLAGS) $(MPFP_SWITCH) $(PTHREAD_CFLAGS) AM_LDFLAGS = $(FLINT_LDFLAGS) $(NTL_LDFLAGS) $(PARI_LDFLAGS) $(LDFLAGS_BOOST) $(PTHREAD_CFLAGS) $(PTHREAD_LDFLAGS) LIBS = $(top_builddir)/libsrc/libec.la $(FLINT_LIBS) $(PARI_LIBS) $(NTL_LIBS) $(BOOST_LIBS) $(PTHREAD_LIBS) check_run = echo -n "Testing $${prog}..."; ./$${prog}$(EXEEXT) < $(prog_input_dir)/$${prog}.in > $${prog}.testout 2>/dev/null && echo "$${prog} completed" && diff $${prog}.testout $(prog_output_dir)/$${prog}.out || exit $$? ################ PROCS (conics & cubics programs) ################# PROCS_PROGS = solve_conic solve_legendre reduce_cubics list_cubics cubics PROCS_PROGS_SUFFIXED = $(PROCS_PROGS:=$(EXEEXT)) procs_progs: $(PROCS_PROGS_SUFFIXED) solve_conic_SOURCES=solve_conic.cc solve_legendre_SOURCES=solve_legendre.cc reduce_cubics_SOURCES=reduce_cubics.cc list_cubics_SOURCES=list_cubics.cc cubics_SOURCES=cubics.cc check_procs: procs_progs @echo Checking conics and cubics programs... for prog in $(PROCS_PROGS); do $(check_run); done ################ QCURVES (elliptic curves programs, excluding two-descent) ################# QCURVES_PROGS = point_search indep_test QCURVES_PROGS_SUFFIXED = $(QCURVES_PROGS:=$(EXEEXT)) qcurves_progs: $(QCURVES_PROGS_SUFFIXED) point_search_SOURCES=point_search.cc indep_test_SOURCES=indep_test.cc check_qcurves: qcurves_progs @echo Checking qcurves programs... for prog in $(QCURVES_PROGS); do $(check_run); done ################ QCURVES (elliptic curves two-descent programs) ################# # When allprogs is disabled the only binary to be built and installed # is mwrank, but we want "make check" to build and test all. QRANK_PROGS = mwrank reduce_quartics quartic_points QRANK_CHECK_PROGS = reduce_quartics quartic_points QRANK_PROGS_SUFFIXED = $(QRANK_PROGS:=$(EXEEXT)) QRANK_CHECK_PROGS_SUFFIXED = $(QRANK_CHECK_PROGS:=$(EXEEXT)) qrank_progs: $(QRANK_PROGS_SUFFIXED) mwrank_SOURCES=mwrank.cc reduce_quartics_SOURCES=reduce_quartics.cc quartic_points_SOURCES=quartic_points.cc check_qrank: qrank_progs @echo Checking qrank programs... for prog in $(QRANK_PROGS); do $(check_run); done rm -f PRIMES 1 ################ G0N (modular symbols programs) ################# G0N_PROGS = ecnf nfhpcurve nfhpmcurve h1first h1clist h1bsdcurisog qexp h1bsd h1curve pcurve checkap moreap nfcount aplist G0N_PROGS_SUFFIXED = $(G0N_PROGS:=$(EXEEXT)) g0n_progs: $(G0N_PROGS_SUFFIXED) h1bsd_SOURCES=h1bsd.cc h1curve_SOURCES=h1curve.cc pcurve_SOURCES=pcurve.cc nfhpcurve_SOURCES=nfhpcurve.cc nfhpmcurve_SOURCES=nfhpmcurve.cc h1clist_SOURCES=h1clist.cc checkap_SOURCES=checkap.cc h1bsdcurisog_SOURCES=h1bsdcurisog.cc nfcount_SOURCES=nfcount.cc ecnf_SOURCES=ecnf.cc h1first_SOURCES=h1first.cc moreap_SOURCES=moreap.cc qexp_SOURCES=qexp.cc aplist_SOURCES=aplist.cc # This is the name of a directory which will be used for newform # input/output in the "make check" tests and removed afterwards. # This does not work without the export! export NF_DIR:=nftmp export SNF_DIR:=snftmp export TCURVE_DIR:=tcurves check_g0n: g0n_progs @echo Checking g0n programs... rm -rf $(NF_DIR) rm -rf $(SNF_DIR) rm -rf $(TCURVE_DIR) mkdir $(NF_DIR) mkdir $(SNF_DIR) mkdir $(TCURVE_DIR) for prog in $(G0N_PROGS); do $(check_run); done rm -rf $(NF_DIR) rm -rf $(SNF_DIR) rm -rf $(TCURVE_DIR) ################################################################################# check: $(MAKE) check_procs check_qcurves check_qrank check_g0n rm -f *.testout PRIMES 1 # When allprogs is disabled the only binary to be built and installed # is mwrank, but we want "make check" to build and test all. if ALLPROGS bin_PROGRAMS=$(PROCS_PROGS) $(QCURVES_PROGS) $(QRANK_PROGS) $(G0N_PROGS) check_PROGRAMS= else bin_PROGRAMS=mwrank$(EXEEXT) check_PROGRAMS=$(PROCS_PROGS) $(QCURVES_PROGS) $(QRANK_CHECK_PROGS) $(G0N_PROGS) endif # We list here the directories in and out which contain the test input # and expected output files for the tests run by "make check". EXTRA_DIST = in out_ntl out_no_ntl ACLOCAL_AMFLAGS = -I m4 eclib-20250122/progs/aplist.cc000066400000000000000000000116031474421343600157750ustar00rootroot00000000000000// FILE APLIST.CC: program for listing ap ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #include #include #include // for nf_filename #define BOOKORDER // if defined, sorts newforms & curves into order // in the Book (relevant up to 500 only) #include int main() { string filename; cout<<"Enter output filename: "; cin>>filename; ofstream output(filename.c_str()); int n1,n2; cout<<"Enter first and last values of n: "; cin>>n1>>n2; for (int n=n1; n<=n2; n++) { string data = nf_filename(n,'x'); ifstream datafile(data.c_str()); if (!datafile) cout<<"No file "< > aqtable; for(ic=0; ic(naq)); for (iq=0; iq > aptable; vector bigptable; for(ic=0; ic(25+nbigprimes)); for (ip=0; ip<25; ip++) for (ic=0; ic100) if any: int nn=n; ip=25; // index into aptable jp=26; // current prime being considered p=prime_number(jp); for (int kp=0; kp<25; kp++) { int pk = prime_number(kp+1); while (nn%pk==0) nn/=pk; } while (nn>1) // then there are primes>100 dividing n { while (nn%p!=0) // skip over data for p & increment p { datafile.read((char*)batch,nnf*sizeof(short)); p=prime_number(++jp); } // now p is a "large" prime divisor of n bigptable.push_back(p); while (nn%p==0) nn/=p; datafile.read((char*)batch,nnf*sizeof(short)); batchptr=batch; for(ic=0; ic8) output<<" "; if(ap==1) output<<" +"; else output<<" -"; } else // T_p-eig { if (kp>8) output< using namespace std; #include #include // for nf_filename const long MAXNAP = 100000; int main(void) { long firstn, lastn, n, nnf, naq, nap, i, j, p; int allok=1; cout<<"Enter first and last N: "; cin>>firstn>>lastn; for(n=firstn; n<=lastn; n++) { int ok=1; string name = nf_filename(n,'x'); ifstream datafile(name.c_str()); if(!datafile.is_open()) { cout<<"\nFile "<0) { // skip over extra data for each newform long ntotal = 16*nnf; int* batch_i = new int[ntotal]; datafile.read((char*)batch_i,ntotal*sizeof(int)); delete[] batch_i; // skip over aq for each newform ntotal = naq*nnf; short* batch = new short[ntotal]; datafile.read((char*)batch,ntotal*sizeof(short)); // read and check ap for each newform ntotal = nap*nnf; delete[] batch; batch = new short[ntotal]; datafile.read((char*)batch,ntotal*sizeof(short)); short* batchptr = batch; primevar pr; for(j=0; j4*p) { cout << "\nError: N = " << n << ", form # " << (j+1) << ", p = " << p << " has ap = " << ap << flush; ok=0; } } } delete[] batch; } // ends if(nnf>0) } // ends if(datafile) datafile.close(); if(ok) cout << n << " "; else { cout << "\nN = " << n << ": errors found!\n"; allok=0; } if(n%10==0) cout< #include #include #include int main() { initprimes("PRIMES"); bigint disc; int verbose=0, include_reducibles=1, gl2=0; cerr << "Verbosity level (0, 1 or 2): "; cin >> verbose; while(cerr << "Enter discriminant (positive or negative, 0 to stop): ", cin >> disc, !is_zero(disc)) { cerr << "Include reducible cubics? (0 or 1): "; cin >> include_reducibles; cerr << "Use GL(2,Z)-equivalence instead of SL(2,Z)? (0 or 1): "; cin >> gl2; vector glist = reduced_cubics(disc, include_reducibles, gl2, verbose); if (glist.size()==0) { cout<< "No "; if (!include_reducibles) cout << "irreducible"; cout << " cubics with discriminant " << disc << endl; } else { cout << glist.size(); if (!include_reducibles) cout << " irreducible"; cout << " reduced cubics with discriminant " << disc; cout << " (up to " << (gl2?"GL":"SL") << "(2,Z)-equivalence)"; if (glist.size()>0) cout<< " : " << glist; cout << endl; } } } eclib-20250122/progs/ecnf.cc000066400000000000000000000105241474421343600154150ustar00rootroot00000000000000// FILE ECNF.CC: program for newform construction from an elliptic curve ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // // #include #include #include #include #include #include #include #include #include #include // defining to be 1 this causes display_modular_symbol_map() to be // called with the check option on, which takes a lot longer but // checks that the algebraic modular symbols agree with numerical // ones, even in their sign. #define DEBUG 0 int main(void) { int verbose=0; vector ai(5); bigint v; // Read in curves, minimise and construct CurveRed (needed for // conductor and Traces of Frobenius etc.) while (getcurve(ai,verbose)) { Curvedata CD(ai,v); CurveRed CR(CD); bigint N = getconductor(CR); int n = I2int(N); cout << ">>> Level = conductor = " << n << " <<<" << endl; cout << "Minimal curve = " << (Curve)(CR) << endl; cout<>sign; newforms nf(n,verbose); // Create the newform from the curve (first create the homspace, // then split off the eigenspace) nf.createfromcurve(sign,CR); // Display newform info cout << "Newform information:"<> base_at_infinity; string base = (base_at_infinity?"oo":"0"); cout << "Values of {" << base << ",r} for rational r:"<>ws; if(cin.eof()) {cout<> nu >> de; r=rational(nu,de); if((nu==0)&&(de==0)) {cout< "<< nf.plus_modular_symbol(r, 0, base_at_infinity)< "<< nf.minus_modular_symbol(r, 0, base_at_infinity)< s = nf.full_modular_symbol(r, 0, base_at_infinity); cout<<"{"< ("<< s.first << "," << s.second << ")" <> dmax; for(de=1; de<=dmax; de++) for(nu=0; nu "<< nf.plus_modular_symbol(r, 0, base_at_infinity)< "<< nf.minus_modular_symbol(r, 0, base_at_infinity)< s = nf.full_modular_symbol(r, 0, base_at_infinity); cout<<"{"< ("<< s.first << "," << s.second << ")" < #include #include #include #include #include //from qcurves, for computing conductors #include #include #include #define AUTOLOOP int main(void) { set_precision(60); int limit,n=1; #ifdef AUTOLOOP cout<<"Enter first and last N: ";cin>>n>>limit; n--; cout<1) { cout<<"Enter level: "; cin>>n; #endif if (n>1) { newforms nf(n,0); int noldap=25; nf.createfromdata(1,noldap,0); // do not create from scratch if data absent for(int xi=0; xi> verbose; cerr << "Limits on naive height in point search? "; cerr << "(searches up to first limit on all curves, up to second limit only if rank is deficient after that): "; cin>>hlim1>>hlim2; string genfile; cerr << "filename for dumping generators? "; cin >> genfile; ofstream genout; genout.open(genfile.c_str()); if(!genout.is_open()) {cerr<<"Unable to open file " << genfile << endl; exit(1);} #endif #ifdef AUTOLOOP long limit; cerr<<"Enter first and last N: ";cin>>n>>limit; n--; cerr<1) { cerr<<"Enter level: "; cin>>n; #endif if (n>1) { nn=n; // Temporary code: check that n is square-free #ifdef SQUAREFREE_ONLY longlist plist=pdivs(n); int sqfree=1; for(int i=0; (i clist = icl.getcurves(); long ic, nc = clist.size(); for(ic=0; ic0.01) { cout<<" ***!!!*** mismatch in L/P values: "; cout<<"analytic L/P = "< shortlist = two_d.getpbasis(); mwbasis.process(shortlist); mwr = mwbasis.getrank(); if(verbose) cout<<"After 2-descent, rank of points is "< gens = mwbasis.getbasis(); if(r!=mwr) { cout << "RS = " << RS <<"\t"; cout<<"Warning: points found have rank " << mwr << ", not " << r << ", with hlim2="<0.1) cout << " ***!!!***"; else { long rootS=(long)(sqrt((double)roundS)+0.1); int squareS=(roundS==rootS*rootS); if(!squareS) cout << " ***!!!***"; } cout << endl; } // Dump to genfile: genout << n << "\t" << code << "\t" << ic+1; genout << "\t" << (Curve)CDi ; genout << "\t" << r ; for(int ip=0; ip #include #include #include #include #include //from qcurves, for computing conductors #include #include #include #define AUTOLOOP #include #define LMFDB_ORDER // if defined, sorts newforms into LMFDB order before output // otherwise, sorts newforms into Cremona order before output #define CURVE_IS_ONE_FIELD // outputs [a1,a2,a3,a4,a6] // else outputs a1 a2 a3 a4 a6 int main(void) { int prec0 = 100; int maxprec = 300; int prec = prec0; int delta_prec = 50; set_precision(prec); int limit,n=1; string code; #ifdef AUTOLOOP cerr<<"Enter first and last N: ";cin>>n>>limit; n--; cerr<1) { cout<<"Enter level: "; cin>>n; #endif if (n>1) { newforms nf(n,0); int noldap=25; nf.createfromdata(1,noldap,0); // do not create from scratch if data absent int nnf = nf.n1ds; // int inf = 1; if(nnf>0) { // cout<<"****************************"< #include #include #include #include #include #include #include //from qcurves #include //from qcurves, for computing conductors #include #include #ifndef SINGLE // so Makefile can override #define AUTOLOOP #endif #define LMFDB_ORDER // if defined, sorts newforms into LMFDB order before output // otherwise, sorts newforms into Cremona order before output // If this is defined, the fisc6 output is placed in subdirectory // fixc6 in file fixc6/fixc6.N (one per level); otherwise it is all // put in ./fixc6.extra //#define FIXC6_OUTPUT_TO_SUBDIR #include vector > bad_ones; // holds bad (n,i) list int checkap(const level* iN, const newform& nf, CurveRed& CR, long pmax=100); int main(void) { int prec0 = 100; int maxprec = 500; int prec = prec0; int delta_prec = 50; set_precision(prec); int verb=0; #ifdef SINGLE verb=1; #else cout<<"See detail? "; cin>>verb; #endif long n=1; #ifdef AUTOLOOP int limit; cout<<"Enter first and last N: ";cin>>n>>limit; n--; cout<1) { cout<<"Enter level: "; cin>>n; #endif if (n>1) { newforms nf(n,verb); int noldap=25; nf.createfromdata(1,noldap,0); // do not create from scratch if data absent #ifdef LMFDB_ORDER nf.sort_into_LMFDB_label_order(); #else nf.sort_into_Cremona_label_order(); #endif int nnf = nf.n1ds; int inf = 0; #ifndef SINGLE if(verb>1) nf.display(); #else // if(nnf>1) { cout << "Enter form number (between 1 and "<>inf; if((inf<1)||(inf>nnf)) { cout << "Not in range!\n"; inf=1; nnf=0; } else { nnf=inf; inf--; } } #endif for(int xi=inf; xi(n,i+1)); } else { if(getdiscr(Curvedata(C,0))!=getdiscr(CD)) { cout << "Non-minimal curve = \t" << C << ", minimal curve = \t"; } else if(verb) cout << "Curve = \t"; cout << (Curve)CD << "\t"; cout << "N = " << nc; if(n!=nc) { cout<<" ------WRONG CONDUCTOR!"; } else { if(!checkap(&nf, nf.nflist[i], CR)) cout<<" ----- a_p do not agree!"; // else // cout<<" ----- a_p agree for p<100"; } cout<0) { cout<<"\nNumber of bad curves: "< aplist = nf.aplist; vector primelist = primes(aplist.size()); unsigned int i; bigint ap, p=bigint(0); int ok=1; for(i=0; (i>verbose; cerr << "Output updated newform data? "; cin>>output; cerr << "Output updated curve file? (0/1) "; cin >> curve_output; string curve_filename; #ifdef AUTOLOOP int limit=210; cerr<<"Enter first and last N: ";cin>>n>>limit; n--; while (n1) #endif { cout<<"\n\nEnter level: "; cin>>n; #endif if (n>1) { if (curve_output) curve_filename=single_curve_filename(n); else curve_filename="no"; if(verbose) cout << "\n\n"; cout << ">>>Level " << n << "<<<" << endl; newforms nf(n,verbose>1); if(verbose) { cout << "Reading newform data from file..." << flush; } nf.createfromdata(1,0,0); long nnf = nf.n1ds; if(verbose) { cout << "done: " << nnf << " newforms." << endl; } if(nnf==0) { cout << "No newforms.\n"; cout << "Finished level "<>inf; while((inf>0)&&(inf<=nnf)) { nf.nf_subset.push_back(inf-1); // actually count from 0 despite UI using 1 as base cin>>inf; } nnf = nf.nf_subset.size(); cout << endl; #endif if(verbose) { cout << "Working on " << nnf << " newforms: " << nf.nf_subset << " ..." << endl; cout << "Finding +1 eigenvectors..." << flush; } nf.makebases(1, all_nf); if(verbose) { cout << "done.\nNow finding -1 eigenvectors..." << flush; } nf.set_sign(-1); nf.makebases(1, all_nf); if(verbose) { cout << "done.\nNow filling in data for newforms..."< forms; if (all_nf) { for(int i=0; i failures = nf.showcurves(forms,0,curve_filename); if(failures.size()>0) { cout<<"No curve found for "< #include int main() { set_precision(100); initprimes("PRIMES",0); int verbose = 1; cout<<"verbose (0/1)? "; cin>>ws; if(cin.eof()) {cout<>verbose; while (1) { cout<<"\nInput a curve: "; cin>>ws; if(cin.eof()) {cout<> E; if ( E.isnull() ) exit(0); Curvedata C(E, 0); cout << "Curve " << (Curve)C << endl; Point P(C); cout<<"enter number of points: "; cin>>ws; if(cin.eof()) {cout<> npts; vector points; points.reserve(npts); int j=0; while(j>ws; if(cin.eof()) {cout<> P; if ( P.isvalid() ) {points.push_back(P); j++;} else {cout<<"point "<>ws; if(cin.eof()) {cerr<>naux; sifter box(&C, naux, verbose); box.process(points); long rank = box.getrank(); if(rank==npts) cout<<"Points are all independent, their rank is "< #include #include #include void output_cubics(const bigint& disc, int include_reducibles=1, int gl2=0, int verbose=0) { vector glist = reduced_cubics(disc, include_reducibles, gl2, verbose); if (glist.size()==0) { if(verbose>1) { cout<< "No "; if (!include_reducibles) cout << "irreducible"; cout << " cubics with discriminant " << disc << endl; } } else { if (verbose) cout << glist.size() << " with discriminant "; cout << disc << " " << glist << endl; } } int main() { initprimes("PRIMES"); bigint disc, absdisc, maxdisc; int verbose=0, include_reducibles=1, gl2=0, single=0; cerr << "Verbosity level (0, 1 or 2): "; cin >> verbose; cerr << "Single discriminants (1) or a range (0)? "; cin >> single; if (single) { cerr << "Include reducible cubics? (0 or 1): "; cin >> include_reducibles; cerr << "Use GL(2,Z)-equivalence instead of SL(2,Z)? (0 or 1): "; cin >> gl2; while(cerr << "Enter discriminant (positive or negative, 0 to stop): ", cin >> disc, !is_zero(disc)) { if (verbose) { cout << (include_reducibles? "Cubics": "Irreducible cubics") << " with discriminant "; cout << disc; cout << " up to " << (gl2?"GL":"SL") << "(2,Z)-equivalence"; cout << endl; } output_cubics(disc, include_reducibles, gl2, verbose); } } else { while(cerr << "Enter discriminant bound (positive or negative, 0 to stop): ", cin >> maxdisc, !is_zero(maxdisc)) { cerr << "Include reducible cubics? (0 or 1): "; cin >> include_reducibles; cerr << "Use GL(2,Z)-equivalence instead of SL(2,Z)? (0 or 1): "; cin >> gl2; int neg=(maxdisc<0); cout << (include_reducibles? "Cubics with ": "Irreducible cubics with "); cout << (neg? "negative discriminant down to ": "positive discriminant up to "); cout << maxdisc; cout << ", up to " << (gl2? "GL": "SL") << "(2,Z)-equivalence"; cout << endl; if (neg) ::negate(maxdisc); for(absdisc=1; absdisc<=maxdisc; absdisc++) { disc=absdisc; if(neg) ::negate(disc); output_cubics(disc, include_reducibles, gl2, verbose); } cout< #include #include #include #include #include #include //from qcurves, for computing conductors #include //#define AUTOLOOP int main(void) { int n=1; int stopp, output, showeigs, showforms, findcurves; int nnf, nap; cout << "Program moreap\n"; cout << "---------------\n\n"; cout << "For each N, assumes that the file newforms/xN exists, and computes more\n"; cout << "Hecke eigenvalues.\n"; cout << "Output new eigs to file (1/0)? "; cin>>output; cout << "Output new eigs to screen (1/0)? "; cin>>showeigs; cout << "Display newforms (1/0)? "; cin>>showforms; cout << "Attempt curve construction (1/0)? "; cin>>findcurves; #ifdef MPFP if(findcurves) set_precision(60); #endif #ifdef AUTOLOOP int lastn; cout << "How many primes for Hecke eigenvalues? "; cin >> stopp; cout << endl; cout<<"Enter first and last N: ";cin>>n>>lastn; n--; while (n>n, n>1) { cout << "How many primes for Hecke eigenvalues? "; cin >> stopp; cout << endl; #endif cout << "\n>>>Level " << n << "\t"; newforms nf(n,showforms); nf.createfromdata(1,0,0); if (showforms) nf.newforms::display(); nnf = nf.n1ds; if(nnf==0) { cout<<"No newforms."<=stopp) { cout<<"Already have "< forms; for(inf=0; inf failures = nf.showcurves(forms,0,"no"); if(failures.size()>0) { cout<<"No curve found for "< #include #include #include #include #include #define MAX_HEIGHT 20 // will never search for points on curve of naive // logarithmic height greater than this #define SEARCH_METHOD 0 // 0 for Stoll sieve (fastest) // 1, 2, 3 for JC's sieve int main(int argc, char **argv) { mrank_options opt; opt.set(argc, argv); int verbose = (opt.get_verbose()); //opt.show(); if(!opt.get_quiet()) {opt.banner(cerr); show_version(cerr);} #ifdef MPFP long bit_precision=opt.get_precision(); set_precision(bit_precision); if(verbose) cerr<<"Using multiprecision floating point with " << bit_precision <<" bits precision.\n"; #else cout.precision(15); cerr.precision(15); #endif initprimes("PRIMES",0); cin.flags( cin.flags() | ios::dec ); init_time(); long sat_bd = opt.get_saturation_bound(); int selmer_only = (opt.get_selmer_only()); int second_descent = (opt.get_second_descent()); long hlimq = (opt.get_hlimq()); long hlimq0 = hlimq; if(hlimq0!=0) hlimq0=10; Curvedata CD; vector ai; // while ( getcurve(CD,!opt.get_quiet()) ) while ( getcurve(ai,!opt.get_quiet()) ) { cout << "Curve "<< "["< #include #include // for nf_filename int main(void) { int limit,n=1,count=0,firstn, verbose; cout << "Verbose? (0/1) " << endl; cin >> verbose; cout<<"Enter first and last N: ";cin>>firstn>>limit; n=firstn-1; cout<1) { if(verbose) cout << ">>> Level " << n << " <<< "; int num=0, nap=0, naq=0; string name = nf_filename(n,'x'); ifstream in(name.c_str()); int eig_file_exists = in.is_open(); if(!eig_file_exists) { cout<<"Unable to open file "<0)&&(nap<25)) cout<<" !!!"; if(!eig_file_exists) cout<<" [No eig file exists]"; cout<< endl; } } // end of if(n) } // end of while() cout << "\n" << count << " newform(s) in range " << firstn << "..." << limit << endl; } // end of main() eclib-20250122/progs/nfhpcurve.cc000066400000000000000000000214601474421343600165030ustar00rootroot00000000000000// FILE nfhpcurve.cc main newform- and curve-finding program ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include #include #include //from qcurves, for computing conductors #include #include #include #include //#define AUTOLOOP #define LMFDB_ORDER // if defined, sorts newforms into LMFDB order before output // otherwise, sorts newforms into Cremona order before output #define MAXNY 10000 #define MAXD 10 #define MAXNAP 20000 #define BITPREC0 100 // initial bit precision #define BITPRECX 20 // step-size for increasing bit precision #define BITPRECMAX 300 // maximum bit precision int main(void) { init_time(); start_time(); long n=2, stopp; // have a dud (but positive) value of n here to avoid mishaps int output, curve_output, verbose; long maxn = MAXNY; long dmax = MAXD; cout << "Program nfhpcurve. Using METHOD = " << METHOD << " to find newforms" << endl; set_precision(BITPREC0); #ifdef MODULAR cout << "MODULUS for linear algebra = " << MODULUS << endl; #endif cout << "Verbose output? "; cin>>verbose; cout << "How many primes for Hecke eigenvalues? "; cin >> stopp; cout << endl; output=curve_output=1; cout << "Output newforms to file? (0/1) "; cin >> output; cout << "Output curves to file? (0/1) "; cin >> curve_output; ofstream curve_out; string curve_out_filename; #ifdef AUTOLOOP int limit; cout<<"Enter first and last N: ";cin>>n>>limit; n--; while (n1) { cout<<"Enter level: "; cin>>n; cout<<"\n"; #endif if (n>1) { if (curve_output) { curve_out_filename = single_curve_filename(n); curve_out.open(curve_out_filename.c_str()); } cout << ">>>Level " << n; // Temporary code to skip non-square-free levels // // if(!is_squarefree(n)) {cout<<" --not square-free, skipping!\n"; continue;} // if(verbose)cout<1)) cout<<"c4 factor " << fac << endl; int* success=new int[nnf]; Curve* curves = new Curve[nnf]; long nsucc=0; for(inf=0; infdotplus=1; // This will have been set correctly nfi->dotminus=1; bigfloat x0=to_bigfloat(10), y0=to_bigfloat(10); int have_both = nf.find_matrix( inf, dmax, rp_known, x0, y0); if(!have_both) cout<<"Problem! find_matrix() returns 0!"<a<<","<b<<";"<c<<","<d<<"):\t"; cout << "dotplus = "<< nfi->dotplus << ", dotminus = "<< nfi->dotminus<< "\n"; cout << "Searching for scaling factors.\n"; } long nx, ny; long maxnx=maxn; if(rp_known) maxnx=1; int found = get_curve(n, fac, maxnx, maxn, x0, y0, nx, ny, nfi->type, verbose); if(found) { success[inf]=1; nsucc++; nfi->dotplus *= nx; nfi->dotminus *= ny; cout << "[(" <a<<","<b<<";"<c <<","<d<<"),"<dotplus<<","<dotminus <<";"<type<<"]"<MAXNAP) { cout<<"Cannot compute more ap, something must be wrong in newform data"<1) } // end of while(n>1) or while(n #include #include #include #include #include #include #include #include //from qcurves, for computing conductors #include #include #include #define AUTOLOOP #define LMFDB_ORDER // if defined, sorts newforms into LMFDB order before output // otherwise, sorts newforms into Cremona order before output #define MAXNAP 20000 #define BITPREC0 100 // initial bit precision #define BITPRECX 20 // step-size for increasing bit precision #define BITPRECMAX 300 // maximum bit precision int main(void) { init_time(); start_time(); long n=110, stopp, stopp0; long prec0=BITPREC0; int output, verbose; cout << "Program nfhpmcurve. Using METHOD = " << METHOD << " to find newforms" << endl; #ifdef MODULAR cout << "MODULUS for linear algebra = " << MODULUS << endl; #endif cout << "Verbose output? "; cin>>verbose; cout << "How many primes for Hecke eigenvalues? "; cin >> stopp0; cout << endl; output=1; cout << "Output newforms to file? (0/1) "; cin >> output; #ifdef AUTOLOOP int limit; cout<<"Enter first and last N: ";cin>>n>>limit; n--; while (n1) { cout<<"Enter level: "; cin>>n; #endif if (n>1) { cout << "\n>>>Level " << n; // Temporary code to skip non-square-free levels // // if(!is_squarefree(n)) {cout<<" --not square-free, skipping!\n"; continue;} // if(verbose)cout<1)) cout<<"c4 factor " << fac << endl; stopp = stopp0; // will be increased if necessary set_precision(prec0); vector forms; for(inf=0; inf0) { forms = nf.showcurves(forms,verbose,"no"); if(forms.size()==0) { cout<<"All curves found successfully!"<MAXNAP) { cout<<"Cannot compute more ap, something must be wrong in newform data"<1) } // end of while(n>1) or while(n>> Level = conductor = 11 <<< Minimal curve = [0,-1,1,-10,-20] Enter sign (1,-1,0 for both):Newform information: 1 newform(s) at level 11: p0=2 #ap= 500 1: aplist = [ -2 -1 1 -2 1 4 -2 0 -1 0 7 3 -8 -6 8 -6 5 12 -7 -3 ...] aq = [ -1 ] ap0 = -2, dp0 = 2, np0 = 5, pdot = -10 SFE = 1, L/P = 2/5 lplus = 1, mplus = 1 lminus = 3, mminus = 2 [(4,1;1,3),-1,1;1] Modular symbol map (+,-) (0:1) = {0,oo} -> (-2/5,0) (1:1) = {0,1} -> (0,0) (2:1) = {0,1/2} -> (-2,0) (3:1) = {0,1/3} -> (-1,1) (4:1) = {0,1/4} -> (1,1) (5:1) = {0,1/5} -> (2,0) (6:1) = {0,1/6} -> (2,0) (7:1) = {0,1/7} -> (1,-1) (8:1) = {0,1/8} -> (-1,-1) (9:1) = {0,1/9} -> (-2,0) (10:1) = {0,1/10} -> (0,0) (1:0) = {oo,0} -> (2/5,0) Computation of further modular symbols Base point? (enter 0 for 0, or 1 for oo) Values of {0,r} for rational r: Enter numerator and denominator of r: All modular symbols with bounded denominator Enter maximum denominator (0 for none): {0,0} -> (0,0) {0,1/2} -> (-2,0) {0,1/3} -> (-1,1) {0,2/3} -> (-1,-1) {0,1/4} -> (1,1) {0,3/4} -> (1,-1) {0,1/5} -> (2,0) {0,2/5} -> (-3,1) {0,3/5} -> (-3,-1) {0,4/5} -> (2,0) >>> Level = conductor = 11 <<< Minimal curve = [0,-1,1,-10,-20] Enter sign (1,-1,0 for both):Newform information: 1 newform(s) at level 11: p0=2 #ap= 500 1: aplist = [ -2 -1 1 -2 1 4 -2 0 -1 0 7 3 -8 -6 8 -6 5 12 -7 -3 ...] aq = [ -1 ] ap0 = -2, dp0 = 2, np0 = 5, pdot = -10 SFE = 1, L/P = 2/5 lplus = 1, mplus = 1 [(-5,1;-1,2),-2,0;?] Modular symbol map (+) (0:1) = {0,oo} -> -2/5 (1:1) = {0,1} -> 0 (2:1) = {0,1/2} -> -2 (3:1) = {0,1/3} -> -1 (4:1) = {0,1/4} -> 1 (5:1) = {0,1/5} -> 2 (6:1) = {0,1/6} -> 2 (7:1) = {0,1/7} -> 1 (8:1) = {0,1/8} -> -1 (9:1) = {0,1/9} -> -2 (10:1) = {0,1/10} -> 0 (1:0) = {oo,0} -> 2/5 Computation of further modular symbols Base point? (enter 0 for 0, or 1 for oo) Values of {0,r} for rational r: Enter numerator and denominator of r: All modular symbols with bounded denominator Enter maximum denominator (0 for none): {0,0} -> 0 {0,1/2} -> -2 {0,1/3} -> -1 {0,2/3} -> -1 {0,1/4} -> 1 {0,3/4} -> 1 {0,1/5} -> 2 {0,2/5} -> -3 {0,3/5} -> -3 {0,4/5} -> 2 >>> Level = conductor = 11 <<< Minimal curve = [0,-1,1,-10,-20] Enter sign (1,-1,0 for both):Newform information: 1 newform(s) at level 11: p0=2 #ap= 500 1: aplist = [ -2 -1 1 -2 1 4 -2 0 -1 0 7 3 -8 -6 8 -6 5 12 -7 -3 ...] aq = [ -1 ] ap0 = -2, dp0 = 2, np0 = 5, pdot = -10 SFE = 1, L/P = 2/5 lplus = 1, mplus = 1 lminus = 3, mminus = 2 [(4,1;1,3),-1,1;1] Modular symbol map (+,-) (0:1) = {0,oo} -> (-2/5,0) (1:1) = {0,1} -> (0,0) (2:1) = {0,1/2} -> (-2,0) (3:1) = {0,1/3} -> (-1,1) (4:1) = {0,1/4} -> (1,1) (5:1) = {0,1/5} -> (2,0) (6:1) = {0,1/6} -> (2,0) (7:1) = {0,1/7} -> (1,-1) (8:1) = {0,1/8} -> (-1,-1) (9:1) = {0,1/9} -> (-2,0) (10:1) = {0,1/10} -> (0,0) (1:0) = {oo,0} -> (2/5,0) Computation of further modular symbols Base point? (enter 0 for 0, or 1 for oo) Values of {oo,r} for rational r: Enter numerator and denominator of r: All modular symbols with bounded denominator Enter maximum denominator (0 for none): {oo,0} -> (2/5,0) {oo,1/2} -> (-8/5,0) {oo,1/3} -> (-3/5,1) {oo,2/3} -> (-3/5,-1) {oo,1/4} -> (7/5,1) {oo,3/4} -> (7/5,-1) {oo,1/5} -> (12/5,0) {oo,2/5} -> (-13/5,1) {oo,3/5} -> (-13/5,-1) {oo,4/5} -> (12/5,0) >>> Level = conductor = 11 <<< Minimal curve = [0,-1,1,-10,-20] Enter sign (1,-1,0 for both):Newform information: 1 newform(s) at level 11: p0=2 #ap= 500 1: aplist = [ -2 -1 1 -2 1 4 -2 0 -1 0 7 3 -8 -6 8 -6 5 12 -7 -3 ...] aq = [ -1 ] ap0 = -2, dp0 = 2, np0 = 5, pdot = -10 SFE = 1, L/P = 2/5 lplus = 1, mplus = 1 [(-5,1;-1,2),-2,0;?] Modular symbol map (+) (0:1) = {0,oo} -> -2/5 (1:1) = {0,1} -> 0 (2:1) = {0,1/2} -> -2 (3:1) = {0,1/3} -> -1 (4:1) = {0,1/4} -> 1 (5:1) = {0,1/5} -> 2 (6:1) = {0,1/6} -> 2 (7:1) = {0,1/7} -> 1 (8:1) = {0,1/8} -> -1 (9:1) = {0,1/9} -> -2 (10:1) = {0,1/10} -> 0 (1:0) = {oo,0} -> 2/5 Computation of further modular symbols Base point? (enter 0 for 0, or 1 for oo) Values of {oo,r} for rational r: Enter numerator and denominator of r: All modular symbols with bounded denominator Enter maximum denominator (0 for none): {oo,0} -> 2/5 {oo,1/2} -> -8/5 {oo,1/3} -> -3/5 {oo,2/3} -> -3/5 {oo,1/4} -> 7/5 {oo,3/4} -> 7/5 {oo,1/5} -> 12/5 {oo,2/5} -> -13/5 {oo,3/5} -> -13/5 {oo,4/5} -> 12/5 >>> Level = conductor = 11 <<< Minimal curve = [0,-1,1,0,0] Enter sign (1,-1,0 for both):Newform information: 1 newform(s) at level 11: p0=2 #ap= 500 1: aplist = [ -2 -1 1 -2 1 4 -2 0 -1 0 7 3 -8 -6 8 -6 5 12 -7 -3 ...] aq = [ -1 ] ap0 = -2, dp0 = 2, np0 = 5, pdot = -10 SFE = 1, L/P = 2/5 lplus = 1, mplus = 1 lminus = 3, mminus = 2 [(4,1;1,3),-1,1;1] Modular symbol map (+,-) (0:1) = {0,oo} -> (-2/25,0) (1:1) = {0,1} -> (0,0) (2:1) = {0,1/2} -> (-2/5,0) (3:1) = {0,1/3} -> (-1/5,1) (4:1) = {0,1/4} -> (1/5,1) (5:1) = {0,1/5} -> (2/5,0) (6:1) = {0,1/6} -> (2/5,0) (7:1) = {0,1/7} -> (1/5,-1) (8:1) = {0,1/8} -> (-1/5,-1) (9:1) = {0,1/9} -> (-2/5,0) (10:1) = {0,1/10} -> (0,0) (1:0) = {oo,0} -> (2/25,0) Computation of further modular symbols Base point? (enter 0 for 0, or 1 for oo) Values of {0,r} for rational r: Enter numerator and denominator of r: All modular symbols with bounded denominator Enter maximum denominator (0 for none): {0,0} -> (0,0) {0,1/2} -> (-2/5,0) {0,1/3} -> (-1/5,1) {0,2/3} -> (-1/5,-1) {0,1/4} -> (1/5,1) {0,3/4} -> (1/5,-1) {0,1/5} -> (2/5,0) {0,2/5} -> (-3/5,1) {0,3/5} -> (-3/5,-1) {0,4/5} -> (2/5,0) >>> Level = conductor = 11 <<< Minimal curve = [0,-1,1,-7820,-263580] Enter sign (1,-1,0 for both):Newform information: 1 newform(s) at level 11: p0=2 #ap= 500 1: aplist = [ -2 -1 1 -2 1 4 -2 0 -1 0 7 3 -8 -6 8 -6 5 12 -7 -3 ...] aq = [ -1 ] ap0 = -2, dp0 = 2, np0 = 5, pdot = -10 SFE = 1, L/P = 2/5 lplus = 1, mplus = 1 lminus = 3, mminus = 2 [(4,1;1,3),-1,1;1] Modular symbol map (+,-) (0:1) = {0,oo} -> (-2,0) (1:1) = {0,1} -> (0,0) (2:1) = {0,1/2} -> (-10,0) (3:1) = {0,1/3} -> (-5,1) (4:1) = {0,1/4} -> (5,1) (5:1) = {0,1/5} -> (10,0) (6:1) = {0,1/6} -> (10,0) (7:1) = {0,1/7} -> (5,-1) (8:1) = {0,1/8} -> (-5,-1) (9:1) = {0,1/9} -> (-10,0) (10:1) = {0,1/10} -> (0,0) (1:0) = {oo,0} -> (2,0) Computation of further modular symbols Base point? (enter 0 for 0, or 1 for oo) Values of {0,r} for rational r: Enter numerator and denominator of r: All modular symbols with bounded denominator Enter maximum denominator (0 for none): {0,0} -> (0,0) {0,1/2} -> (-10,0) {0,1/3} -> (-5,1) {0,2/3} -> (-5,-1) {0,1/4} -> (5,1) {0,3/4} -> (5,-1) {0,1/5} -> (10,0) {0,2/5} -> (-15,1) {0,3/5} -> (-15,-1) {0,4/5} -> (10,0) >>> Level = conductor = 37 <<< Minimal curve = [0,0,1,-1,0] Enter sign (1,-1,0 for both):Newform information: 1 newform(s) at level 37: p0=2 #ap= 608 1: aplist = [ -2 -3 -2 -1 -5 -2 0 0 2 6 -4 -1 -9 2 -9 1 8 -8 8 9 ...] aq = [ 1 ] ap0 = -2, dp0 = 0, np0 = 5 SFE = -1, L/P = 0 lplus = 5, mplus = 4 lminus = 3, mminus = 2 [(14,1;3,8),1,-1;2] Modular symbol map (+,-) (0:1) = {0,oo} -> (0,0) (1:1) = {0,1} -> (0,0) (2:1) = {0,1/2} -> (0,0) (3:1) = {0,1/3} -> (0,1) (4:1) = {0,1/4} -> (0,1) (5:1) = {0,1/5} -> (1,0) (6:1) = {0,1/6} -> (0,0) (7:1) = {0,1/7} -> (1,0) (8:1) = {0,1/8} -> (1,-1) (9:1) = {0,1/9} -> (0,-1) (10:1) = {0,1/10} -> (0,0) (11:1) = {0,1/11} -> (0,0) (12:1) = {0,1/12} -> (0,-1) (13:1) = {0,1/13} -> (0,-1) (14:1) = {0,1/14} -> (-1,-1) (15:1) = {0,1/15} -> (-1,0) (16:1) = {0,1/16} -> (-1,0) (17:1) = {0,1/17} -> (0,1) (18:1) = {0,1/18} -> (0,0) (19:1) = {0,1/19} -> (0,0) (20:1) = {0,1/20} -> (0,-1) (21:1) = {0,1/21} -> (-1,0) (22:1) = {0,1/22} -> (-1,0) (23:1) = {0,1/23} -> (-1,1) (24:1) = {0,1/24} -> (0,1) (25:1) = {0,1/25} -> (0,1) (26:1) = {0,1/26} -> (0,0) (27:1) = {0,1/27} -> (0,0) (28:1) = {0,1/28} -> (0,1) (29:1) = {0,1/29} -> (1,1) (30:1) = {0,1/30} -> (1,0) (31:1) = {0,1/31} -> (0,0) (32:1) = {0,1/32} -> (1,0) (33:1) = {0,1/33} -> (0,-1) (34:1) = {0,1/34} -> (0,-1) (35:1) = {0,1/35} -> (0,0) (36:1) = {0,1/36} -> (0,0) (1:0) = {oo,0} -> (0,0) Computation of further modular symbols Base point? (enter 0 for 0, or 1 for oo) Values of {0,r} for rational r: Enter numerator and denominator of r: All modular symbols with bounded denominator Enter maximum denominator (0 for none): >>> Level = conductor = 37 <<< Minimal curve = [0,0,1,-1,0] Enter sign (1,-1,0 for both):Newform information: 1 newform(s) at level 37: p0=2 #ap= 608 1: aplist = [ -2 -3 -2 -1 -5 -2 0 0 2 6 -4 -1 -9 2 -9 1 8 -8 8 9 ...] aq = [ 1 ] ap0 = -2, dp0 = 0, np0 = 5 SFE = -1, L/P = 0 lplus = 5, mplus = 4 [(15,1;2,5),1,0;?] Modular symbol map (+) (0:1) = {0,oo} -> 0 (1:1) = {0,1} -> 0 (2:1) = {0,1/2} -> 0 (3:1) = {0,1/3} -> 0 (4:1) = {0,1/4} -> 0 (5:1) = {0,1/5} -> 1 (6:1) = {0,1/6} -> 0 (7:1) = {0,1/7} -> 1 (8:1) = {0,1/8} -> 1 (9:1) = {0,1/9} -> 0 (10:1) = {0,1/10} -> 0 (11:1) = {0,1/11} -> 0 (12:1) = {0,1/12} -> 0 (13:1) = {0,1/13} -> 0 (14:1) = {0,1/14} -> -1 (15:1) = {0,1/15} -> -1 (16:1) = {0,1/16} -> -1 (17:1) = {0,1/17} -> 0 (18:1) = {0,1/18} -> 0 (19:1) = {0,1/19} -> 0 (20:1) = {0,1/20} -> 0 (21:1) = {0,1/21} -> -1 (22:1) = {0,1/22} -> -1 (23:1) = {0,1/23} -> -1 (24:1) = {0,1/24} -> 0 (25:1) = {0,1/25} -> 0 (26:1) = {0,1/26} -> 0 (27:1) = {0,1/27} -> 0 (28:1) = {0,1/28} -> 0 (29:1) = {0,1/29} -> 1 (30:1) = {0,1/30} -> 1 (31:1) = {0,1/31} -> 0 (32:1) = {0,1/32} -> 1 (33:1) = {0,1/33} -> 0 (34:1) = {0,1/34} -> 0 (35:1) = {0,1/35} -> 0 (36:1) = {0,1/36} -> 0 (1:0) = {oo,0} -> 0 Computation of further modular symbols Base point? (enter 0 for 0, or 1 for oo) Values of {0,r} for rational r: Enter numerator and denominator of r: All modular symbols with bounded denominator Enter maximum denominator (0 for none): >>> Level = conductor = 389 <<< Minimal curve = [0,1,1,-2,0] Enter sign (1,-1,0 for both):Newform information: 1 newform(s) at level 389: p0=2 #ap= 1972 1: aplist = [ -2 -2 -3 -5 -4 -3 -6 5 -4 -6 4 -8 -3 12 -2 -6 3 -8 -5 -10 ...] aq = [ -1 ] ap0 = -2, dp0 = 0, np0 = 5 SFE = 1, L/P = 0 lplus = 5, mplus = 8 lminus = 3, mminus = 4 [(-111,1;-2,7),1,-1;2] Modular symbol map (+,-) (0:1) = {0,oo} -> (0,0) (1:1) = {0,1} -> (0,0) (2:1) = {0,1/2} -> (0,0) (3:1) = {0,1/3} -> (0,2) (4:1) = {0,1/4} -> (0,0) (5:1) = {0,1/5} -> (2,0) (6:1) = {0,1/6} -> (0,0) (7:1) = {0,1/7} -> (1,-1) (8:1) = {0,1/8} -> (0,1) (9:1) = {0,1/9} -> (-1,-1) (10:1) = {0,1/10} -> (0,0) (11:1) = {0,1/11} -> (1,0) (12:1) = {0,1/12} -> (0,-1) (13:1) = {0,1/13} -> (0,-2) (14:1) = {0,1/14} -> (-1,1) (15:1) = {0,1/15} -> (0,0) (16:1) = {0,1/16} -> (1,-1) (17:1) = {0,1/17} -> (0,1) (18:1) = {0,1/18} -> (1,-1) (19:1) = {0,1/19} -> (0,-1) (20:1) = {0,1/20} -> (-1,0) (21:1) = {0,1/21} -> (0,-1) (22:1) = {0,1/22} -> (0,0) (23:1) = {0,1/23} -> (0,1) (24:1) = {0,1/24} -> (1,-1) (25:1) = {0,1/25} -> (-1,-1) (26:1) = {0,1/26} -> (0,0) (27:1) = {0,1/27} -> (1,1) (28:1) = {0,1/28} -> (1,-1) (29:1) = {0,1/29} -> (0,-1) (30:1) = {0,1/30} -> (0,-2) (31:1) = {0,1/31} -> (-1,-3) (32:1) = {0,1/32} -> (-2,-1) (33:1) = {0,1/33} -> (-2,-1) (34:1) = {0,1/34} -> (-1,0) (35:1) = {0,1/35} -> (-1,0) (36:1) = {0,1/36} -> (0,1) (37:1) = {0,1/37} -> (0,1) (38:1) = {0,1/38} -> (-1,1) (39:1) = {0,1/39} -> (0,0) (40:1) = {0,1/40} -> (1,0) (41:1) = {0,1/41} -> (0,-1) (42:1) = {0,1/42} -> (-1,-1) (43:1) = {0,1/43} -> (1,-1) (44:1) = {0,1/44} -> (-1,-1) (45:1) = {0,1/45} -> (0,-2) (46:1) = {0,1/46} -> (-1,-3) (47:1) = {0,1/47} -> (-2,1) (48:1) = {0,1/48} -> (-2,1) (49:1) = {0,1/49} -> (0,-1) (50:1) = {0,1/50} -> (0,1) (51:1) = {0,1/51} -> (0,-1) (52:1) = {0,1/52} -> (0,1) (53:1) = {0,1/53} -> (0,0) (54:1) = {0,1/54} -> (0,-1) (55:1) = {0,1/55} -> (-1,-1) (56:1) = {0,1/56} -> (-1,1) (57:1) = {0,1/57} -> (-1,-1) (58:1) = {0,1/58} -> (-1,-1) (59:1) = {0,1/59} -> (-2,2) (60:1) = {0,1/60} -> (0,2) (61:1) = {0,1/61} -> (0,1) (62:1) = {0,1/62} -> (0,2) (63:1) = {0,1/63} -> (0,0) (64:1) = {0,1/64} -> (2,0) (65:1) = {0,1/65} -> (0,0) (66:1) = {0,1/66} -> (1,1) (67:1) = {0,1/67} -> (0,-2) (68:1) = {0,1/68} -> (0,-2) (69:1) = {0,1/69} -> (0,-2) (70:1) = {0,1/70} -> (0,-1) (71:1) = {0,1/71} -> (0,-2) (72:1) = {0,1/72} -> (-1,-1) (73:1) = {0,1/73} -> (-1,-1) (74:1) = {0,1/74} -> (-1,-2) (75:1) = {0,1/75} -> (0,0) (76:1) = {0,1/76} -> (0,-2) (77:1) = {0,1/77} -> (-2,0) (78:1) = {0,1/78} -> (-2,0) (79:1) = {0,1/79} -> (-2,0) (80:1) = {0,1/80} -> (-2,0) (81:1) = {0,1/81} -> (-1,1) (82:1) = {0,1/82} -> (-1,2) (83:1) = {0,1/83} -> (0,0) (84:1) = {0,1/84} -> (0,2) (85:1) = {0,1/85} -> (-1,1) (86:1) = {0,1/86} -> (-2,2) (87:1) = {0,1/87} -> (0,2) (88:1) = {0,1/88} -> (0,2) (89:1) = {0,1/89} -> (-1,1) (90:1) = {0,1/90} -> (-1,3) (91:1) = {0,1/91} -> (-2,2) (92:1) = {0,1/92} -> (-1,4) (93:1) = {0,1/93} -> (1,3) (94:1) = {0,1/94} -> (1,1) (95:1) = {0,1/95} -> (2,2) (96:1) = {0,1/96} -> (2,0) (97:1) = {0,1/97} -> (0,0) (98:1) = {0,1/98} -> (0,2) (99:1) = {0,1/99} -> (1,1) (100:1) = {0,1/100} -> (1,0) (101:1) = {0,1/101} -> (0,0) (102:1) = {0,1/102} -> (-1,1) (103:1) = {0,1/103} -> (1,0) (104:1) = {0,1/104} -> (0,0) (105:1) = {0,1/105} -> (-1,-1) (106:1) = {0,1/106} -> (-1,0) (107:1) = {0,1/107} -> (-1,0) (108:1) = {0,1/108} -> (-1,1) (109:1) = {0,1/109} -> (-1,2) (110:1) = {0,1/110} -> (-1,2) (111:1) = {0,1/111} -> (-1,1) (112:1) = {0,1/112} -> (-1,1) (113:1) = {0,1/113} -> (-1,3) (114:1) = {0,1/114} -> (1,1) (115:1) = {0,1/115} -> (0,0) (116:1) = {0,1/116} -> (1,1) (117:1) = {0,1/117} -> (0,2) (118:1) = {0,1/118} -> (1,-1) (119:1) = {0,1/119} -> (1,1) (120:1) = {0,1/120} -> (-1,-1) (121:1) = {0,1/121} -> (0,2) (122:1) = {0,1/122} -> (-1,1) (123:1) = {0,1/123} -> (0,2) (124:1) = {0,1/124} -> (-1,0) (125:1) = {0,1/125} -> (-1,1) (126:1) = {0,1/126} -> (0,2) (127:1) = {0,1/127} -> (0,1) (128:1) = {0,1/128} -> (-2,2) (129:1) = {0,1/129} -> (0,2) (130:1) = {0,1/130} -> (0,2) (131:1) = {0,1/131} -> (0,2) (132:1) = {0,1/132} -> (1,1) (133:1) = {0,1/133} -> (0,2) (134:1) = {0,1/134} -> (1,3) (135:1) = {0,1/135} -> (-1,1) (136:1) = {0,1/136} -> (0,2) (137:1) = {0,1/137} -> (-1,2) (138:1) = {0,1/138} -> (1,3) (139:1) = {0,1/139} -> (1,1) (140:1) = {0,1/140} -> (1,1) (141:1) = {0,1/141} -> (2,0) (142:1) = {0,1/142} -> (0,0) (143:1) = {0,1/143} -> (0,2) (144:1) = {0,1/144} -> (0,0) (145:1) = {0,1/145} -> (1,2) (146:1) = {0,1/146} -> (0,1) (147:1) = {0,1/147} -> (-1,2) (148:1) = {0,1/148} -> (1,4) (149:1) = {0,1/149} -> (2,1) (150:1) = {0,1/150} -> (0,0) (151:1) = {0,1/151} -> (0,2) (152:1) = {0,1/152} -> (0,2) (153:1) = {0,1/153} -> (0,0) (154:1) = {0,1/154} -> (2,1) (155:1) = {0,1/155} -> (2,2) (156:1) = {0,1/156} -> (2,0) (157:1) = {0,1/157} -> (0,0) (158:1) = {0,1/158} -> (2,1) (159:1) = {0,1/159} -> (1,-2) (160:1) = {0,1/160} -> (1,0) (161:1) = {0,1/161} -> (0,-1) (162:1) = {0,1/162} -> (0,1) (163:1) = {0,1/163} -> (1,1) (164:1) = {0,1/164} -> (1,1) (165:1) = {0,1/165} -> (2,1) (166:1) = {0,1/166} -> (0,0) (167:1) = {0,1/167} -> (2,0) (168:1) = {0,1/168} -> (1,-1) (169:1) = {0,1/169} -> (1,1) (170:1) = {0,1/170} -> (1,-1) (171:1) = {0,1/171} -> (2,2) (172:1) = {0,1/172} -> (1,-2) (173:1) = {0,1/173} -> (1,-1) (174:1) = {0,1/174} -> (1,-1) (175:1) = {0,1/175} -> (1,0) (176:1) = {0,1/176} -> (1,-1) (177:1) = {0,1/177} -> (2,0) (178:1) = {0,1/178} -> (2,-2) (179:1) = {0,1/179} -> (1,-3) (180:1) = {0,1/180} -> (0,-2) (181:1) = {0,1/181} -> (0,0) (182:1) = {0,1/182} -> (1,-2) (183:1) = {0,1/183} -> (0,-1) (184:1) = {0,1/184} -> (1,-2) (185:1) = {0,1/185} -> (1,-2) (186:1) = {0,1/186} -> (0,-1) (187:1) = {0,1/187} -> (0,-1) (188:1) = {0,1/188} -> (0,-2) (189:1) = {0,1/189} -> (-2,0) (190:1) = {0,1/190} -> (-1,-1) (191:1) = {0,1/191} -> (-2,0) (192:1) = {0,1/192} -> (-2,0) (193:1) = {0,1/193} -> (0,2) (194:1) = {0,1/194} -> (0,0) (195:1) = {0,1/195} -> (0,0) (196:1) = {0,1/196} -> (0,-2) (197:1) = {0,1/197} -> (-2,0) (198:1) = {0,1/198} -> (-2,0) (199:1) = {0,1/199} -> (-1,1) (200:1) = {0,1/200} -> (-2,0) (201:1) = {0,1/201} -> (0,2) (202:1) = {0,1/202} -> (0,1) (203:1) = {0,1/203} -> (0,1) (204:1) = {0,1/204} -> (1,2) (205:1) = {0,1/205} -> (1,2) (206:1) = {0,1/206} -> (0,1) (207:1) = {0,1/207} -> (1,2) (208:1) = {0,1/208} -> (0,0) (209:1) = {0,1/209} -> (0,2) (210:1) = {0,1/210} -> (1,3) (211:1) = {0,1/211} -> (2,2) (212:1) = {0,1/212} -> (2,0) (213:1) = {0,1/213} -> (1,1) (214:1) = {0,1/214} -> (1,0) (215:1) = {0,1/215} -> (1,1) (216:1) = {0,1/216} -> (1,1) (217:1) = {0,1/217} -> (1,2) (218:1) = {0,1/218} -> (2,-2) (219:1) = {0,1/219} -> (1,1) (220:1) = {0,1/220} -> (1,-1) (221:1) = {0,1/221} -> (1,1) (222:1) = {0,1/222} -> (2,0) (223:1) = {0,1/223} -> (0,0) (224:1) = {0,1/224} -> (2,-1) (225:1) = {0,1/225} -> (1,-1) (226:1) = {0,1/226} -> (1,-1) (227:1) = {0,1/227} -> (0,-1) (228:1) = {0,1/228} -> (0,1) (229:1) = {0,1/229} -> (1,0) (230:1) = {0,1/230} -> (1,2) (231:1) = {0,1/231} -> (2,-1) (232:1) = {0,1/232} -> (0,0) (233:1) = {0,1/233} -> (2,0) (234:1) = {0,1/234} -> (2,-2) (235:1) = {0,1/235} -> (2,-1) (236:1) = {0,1/236} -> (0,0) (237:1) = {0,1/237} -> (0,-2) (238:1) = {0,1/238} -> (0,-2) (239:1) = {0,1/239} -> (0,0) (240:1) = {0,1/240} -> (2,-1) (241:1) = {0,1/241} -> (1,-4) (242:1) = {0,1/242} -> (-1,-2) (243:1) = {0,1/243} -> (0,-1) (244:1) = {0,1/244} -> (1,-2) (245:1) = {0,1/245} -> (0,0) (246:1) = {0,1/246} -> (0,-2) (247:1) = {0,1/247} -> (0,0) (248:1) = {0,1/248} -> (2,0) (249:1) = {0,1/249} -> (1,-1) (250:1) = {0,1/250} -> (1,-1) (251:1) = {0,1/251} -> (1,-3) (252:1) = {0,1/252} -> (-1,-2) (253:1) = {0,1/253} -> (0,-2) (254:1) = {0,1/254} -> (-1,-1) (255:1) = {0,1/255} -> (1,-3) (256:1) = {0,1/256} -> (0,-2) (257:1) = {0,1/257} -> (1,-1) (258:1) = {0,1/258} -> (0,-2) (259:1) = {0,1/259} -> (0,-2) (260:1) = {0,1/260} -> (0,-2) (261:1) = {0,1/261} -> (-2,-2) (262:1) = {0,1/262} -> (0,-1) (263:1) = {0,1/263} -> (0,-2) (264:1) = {0,1/264} -> (-1,-1) (265:1) = {0,1/265} -> (-1,0) (266:1) = {0,1/266} -> (0,-2) (267:1) = {0,1/267} -> (-1,-1) (268:1) = {0,1/268} -> (0,-2) (269:1) = {0,1/269} -> (-1,1) (270:1) = {0,1/270} -> (1,-1) (271:1) = {0,1/271} -> (1,1) (272:1) = {0,1/272} -> (0,-2) (273:1) = {0,1/273} -> (1,-1) (274:1) = {0,1/274} -> (0,0) (275:1) = {0,1/275} -> (1,-1) (276:1) = {0,1/276} -> (-1,-3) (277:1) = {0,1/277} -> (-1,-1) (278:1) = {0,1/278} -> (-1,-1) (279:1) = {0,1/279} -> (-1,-2) (280:1) = {0,1/280} -> (-1,-2) (281:1) = {0,1/281} -> (-1,-1) (282:1) = {0,1/282} -> (-1,0) (283:1) = {0,1/283} -> (-1,0) (284:1) = {0,1/284} -> (-1,1) (285:1) = {0,1/285} -> (0,0) (286:1) = {0,1/286} -> (1,0) (287:1) = {0,1/287} -> (-1,-1) (288:1) = {0,1/288} -> (0,0) (289:1) = {0,1/289} -> (1,0) (290:1) = {0,1/290} -> (1,-1) (291:1) = {0,1/291} -> (0,-2) (292:1) = {0,1/292} -> (0,0) (293:1) = {0,1/293} -> (2,0) (294:1) = {0,1/294} -> (2,-2) (295:1) = {0,1/295} -> (1,-1) (296:1) = {0,1/296} -> (1,-3) (297:1) = {0,1/297} -> (-1,-4) (298:1) = {0,1/298} -> (-2,-2) (299:1) = {0,1/299} -> (-1,-3) (300:1) = {0,1/300} -> (-1,-1) (301:1) = {0,1/301} -> (0,-2) (302:1) = {0,1/302} -> (0,-2) (303:1) = {0,1/303} -> (-2,-2) (304:1) = {0,1/304} -> (-1,-1) (305:1) = {0,1/305} -> (0,-2) (306:1) = {0,1/306} -> (0,0) (307:1) = {0,1/307} -> (-1,-2) (308:1) = {0,1/308} -> (-1,-1) (309:1) = {0,1/309} -> (-2,0) (310:1) = {0,1/310} -> (-2,0) (311:1) = {0,1/311} -> (-2,0) (312:1) = {0,1/312} -> (-2,0) (313:1) = {0,1/313} -> (0,2) (314:1) = {0,1/314} -> (0,0) (315:1) = {0,1/315} -> (-1,2) (316:1) = {0,1/316} -> (-1,1) (317:1) = {0,1/317} -> (-1,1) (318:1) = {0,1/318} -> (0,2) (319:1) = {0,1/319} -> (0,1) (320:1) = {0,1/320} -> (0,2) (321:1) = {0,1/321} -> (0,2) (322:1) = {0,1/322} -> (0,2) (323:1) = {0,1/323} -> (1,-1) (324:1) = {0,1/324} -> (0,0) (325:1) = {0,1/325} -> (2,0) (326:1) = {0,1/326} -> (0,0) (327:1) = {0,1/327} -> (0,-2) (328:1) = {0,1/328} -> (0,-1) (329:1) = {0,1/329} -> (0,-2) (330:1) = {0,1/330} -> (-2,-2) (331:1) = {0,1/331} -> (-1,1) (332:1) = {0,1/332} -> (-1,1) (333:1) = {0,1/333} -> (-1,-1) (334:1) = {0,1/334} -> (-1,1) (335:1) = {0,1/335} -> (0,1) (336:1) = {0,1/336} -> (0,0) (337:1) = {0,1/337} -> (0,-1) (338:1) = {0,1/338} -> (0,1) (339:1) = {0,1/339} -> (0,-1) (340:1) = {0,1/340} -> (0,1) (341:1) = {0,1/341} -> (-2,-1) (342:1) = {0,1/342} -> (-2,-1) (343:1) = {0,1/343} -> (-1,3) (344:1) = {0,1/344} -> (0,2) (345:1) = {0,1/345} -> (-1,1) (346:1) = {0,1/346} -> (1,1) (347:1) = {0,1/347} -> (-1,1) (348:1) = {0,1/348} -> (0,1) (349:1) = {0,1/349} -> (1,0) (350:1) = {0,1/350} -> (0,0) (351:1) = {0,1/351} -> (-1,-1) (352:1) = {0,1/352} -> (0,-1) (353:1) = {0,1/353} -> (0,-1) (354:1) = {0,1/354} -> (-1,0) (355:1) = {0,1/355} -> (-1,0) (356:1) = {0,1/356} -> (-2,1) (357:1) = {0,1/357} -> (-2,1) (358:1) = {0,1/358} -> (-1,3) (359:1) = {0,1/359} -> (0,2) (360:1) = {0,1/360} -> (0,1) (361:1) = {0,1/361} -> (1,1) (362:1) = {0,1/362} -> (1,-1) (363:1) = {0,1/363} -> (0,0) (364:1) = {0,1/364} -> (-1,1) (365:1) = {0,1/365} -> (1,1) (366:1) = {0,1/366} -> (0,-1) (367:1) = {0,1/367} -> (0,0) (368:1) = {0,1/368} -> (0,1) (369:1) = {0,1/369} -> (-1,0) (370:1) = {0,1/370} -> (0,1) (371:1) = {0,1/371} -> (1,1) (372:1) = {0,1/372} -> (0,-1) (373:1) = {0,1/373} -> (1,1) (374:1) = {0,1/374} -> (0,0) (375:1) = {0,1/375} -> (-1,-1) (376:1) = {0,1/376} -> (0,2) (377:1) = {0,1/377} -> (0,1) (378:1) = {0,1/378} -> (1,0) (379:1) = {0,1/379} -> (0,0) (380:1) = {0,1/380} -> (-1,1) (381:1) = {0,1/381} -> (0,-1) (382:1) = {0,1/382} -> (1,1) (383:1) = {0,1/383} -> (0,0) (384:1) = {0,1/384} -> (2,0) (385:1) = {0,1/385} -> (0,0) (386:1) = {0,1/386} -> (0,-2) (387:1) = {0,1/387} -> (0,0) (388:1) = {0,1/388} -> (0,0) (1:0) = {oo,0} -> (0,0) Computation of further modular symbols Base point? (enter 0 for 0, or 1 for oo) Values of {oo,r} for rational r: Enter numerator and denominator of r: {oo,355/113} -> (3,1) Enter numerator and denominator of r: All modular symbols with bounded denominator Enter maximum denominator (0 for none): {oo,0} -> (0,0) {oo,1/2} -> (0,0) {oo,1/3} -> (0,2) {oo,2/3} -> (0,-2) {oo,1/4} -> (0,0) {oo,3/4} -> (0,0) {oo,1/5} -> (2,0) {oo,2/5} -> (-2,0) {oo,3/5} -> (-2,0) {oo,4/5} -> (2,0) {oo,1/6} -> (0,0) {oo,5/6} -> (0,0) {oo,1/7} -> (1,-1) {oo,2/7} -> (1,1) {oo,3/7} -> (-2,0) {oo,4/7} -> (-2,0) {oo,5/7} -> (1,-1) {oo,6/7} -> (1,1) eclib-20250122/progs/out_no_ntl/h1bsd.out000066400000000000000000000020111474421343600200750ustar00rootroot00000000000000Enter first and last N: 50 a Rank = 0 L^(r)(f,1)/r! = 0.7131649814283 L(f,1)/period = 1/3 50 b Rank = 0 L^(r)(f,1)/r! = 0.95681122658763 L(f,1)/period = 1/5 51 a Rank = 0 L^(r)(f,1)/r! = 0.86005901612714 L(f,1)/period = 1/3 52 a Rank = 0 L^(r)(f,1)/r! = 0.84548320864565 L(f,1)/period = 1/2 53 a Rank = 1 L^(r)(f,1)/r! = 0.43586382417039 L(f,1)/period = 0 54 a Rank = 0 L^(r)(f,1)/r! = 0.70157482532401 L(f,1)/period = 1/3 54 b Rank = 0 L^(r)(f,1)/r! = 1.030521849701 L(f,1)/period = 1/3 55 a Rank = 0 L^(r)(f,1)/r! = 1.0286698561782 L(f,1)/period = 1/4 56 b Rank = 0 L^(r)(f,1)/r! = 0.94801911561387 L(f,1)/period = 1/2 56 a Rank = 0 L^(r)(f,1)/r! = 0.87454831418834 L(f,1)/period = 1/4 57 a Rank = 1 L^(r)(f,1)/r! = 0.41749163967662 L(f,1)/period = 0 57 b Rank = 0 L^(r)(f,1)/r! = 0.58650959165657 L(f,1)/period = 2/5 57 c Rank = 0 L^(r)(f,1)/r! = 1.0853022722677 L(f,1)/period = 1/4 58 a Rank = 1 L^(r)(f,1)/r! = 0.46370416478316 L(f,1)/period = 0 58 b Rank = 0 L^(r)(f,1)/r! = 1.0332075093651 L(f,1)/period = 2/5 eclib-20250122/progs/out_no_ntl/h1bsdcurisog.out000066400000000000000000000044771474421343600215130ustar00rootroot00000000000000 11 a 1 [0,-1,1,-10,-20] 0 5 5 1.2692093042796 0.25384186085591 1 1 11 a 2 [0,-1,1,-7820,-263580] 0 1 1 0.25384186085591 0.25384186085591 1 1 11 a 3 [0,-1,1,0,0] 0 5 1 6.3460465213978 0.25384186085591 1 1 37 a 1 [0,0,1,-1,0] 1 1 1 5.9869172924639 0.30599977382942 0.051111408239969 0.99999999998486 37 b 1 [0,1,1,-23,-50] 0 3 3 2.1770431858085 0.72568106193615 1 1 37 b 2 [0,1,1,-3,1] 0 3 1 6.5311295574254 0.72568106193615 1 1 37 b 3 [0,1,1,-1873,-31833] 0 1 1 0.72568106193659 0.72568106193615 1 1 57 a 1 [0,-1,1,-2,2] 1 1 2 5.5555045213725 0.41749163967662 0.037574592736823 1.0000000000008 57 b 1 [0,1,1,20,-32] 0 5 10 1.4662739791414 0.58650959165657 1 1 57 b 2 [0,1,1,-4390,-113432] 0 1 2 0.29325479582828 0.58650959165657 1 1 57 c 1 [1,0,1,-7,5] 0 4 4 4.3412090890707 1.0853022722677 1 1 57 c 2 [1,0,1,-102,385] 0 4 4 4.3412090890707 1.0853022722677 1 1 57 c 3 [1,0,1,8,29] 0 2 2 2.1706045445353 1.0853022722677 1 1 57 c 4 [1,0,1,-2,-1] 0 2 1 4.3412090890707 1.0853022722677 1 1 90 a 1 [1,-1,0,6,0] 0 6 12 2.4599353711739 0.81997845705798 1 1 90 a 2 [1,-1,0,-24,18] 0 6 12 2.4599353711739 0.81997845705798 1 1 90 a 3 [1,-1,0,-69,-235] 0 2 4 0.81997845705798 0.81997845705798 1 1 90 a 4 [1,-1,0,-1149,-14707] 0 2 4 0.81997845705798 0.81997845705798 1 1 90 b 1 [1,-1,1,-8,11] 0 6 12 3.9710942585413 1.3236980861804 1 1 90 b 2 [1,-1,1,-128,587] 0 6 12 3.9710942585414 1.3236980861804 1 1 90 b 3 [1,-1,1,52,-53] 0 2 4 1.3236980861804 1.3236980861804 1 1 90 b 4 [1,-1,1,-218,-269] 0 2 4 1.3236980861804 1.3236980861804 1 1 90 c 1 [1,-1,1,13,-61] 0 4 16 1.3375959945886 1.3375959945886 1 1 90 c 2 [1,-1,1,-167,-709] 0 4 16 1.3375959945886 1.3375959945886 1 1 90 c 3 [1,-1,1,-122,1721] 0 12 144 1.3375959945886 1.3375959945886 1 1 90 c 4 [1,-1,1,-617,5231] 0 2 4 1.3375959945886 1.3375959945886 1 1 90 c 5 [1,-1,1,-2597,-50281] 0 2 8 0.66879799729432 1.3375959945886 1 1 90 c 6 [1,-1,1,-3002,63929] 0 12 144 1.3375959945886 1.3375959945886 1 1 90 c 7 [1,-1,1,-48002,4059929] 0 6 36 1.3375959945892 1.3375959945886 1 1 90 c 8 [1,-1,1,-4082,14681] 0 6 72 0.66879799729432 1.3375959945886 1 1 389 a 1 [0,1,1,-2,0] 2 1 1 4.9804251217101 0.75931650083449 0.15246017794314 1.0000000007191 eclib-20250122/progs/out_no_ntl/h1clist.out000066400000000000000000000001371474421343600204520ustar00rootroot00000000000000 90 a 1 [1,-1,0,6,0] 0 6 0 90 b 1 [1,-1,1,-8,11] 0 6 0 90 c 1 [1,-1,1,13,-61] 0 4 0 eclib-20250122/progs/out_no_ntl/h1curve.out000066400000000000000000000003351474421343600204600ustar00rootroot00000000000000See detail? Enter first and last N: Table of curves computed from newforms via periods (in LMFDB order) N # [a1,a2,a3,a4,a6] Conductor 90 a [1,-1,0,6,0] N = 90 90 b [1,-1,1,-8,11] N = 90 90 c [1,-1,1,13,-61] N = 90 eclib-20250122/progs/out_no_ntl/h1first.out000066400000000000000000000001711474421343600204610ustar00rootroot00000000000000Program h1first. Using METHOD = 2 >>>Level 90<<< 1 [1,-1,0,6,0] N = 90 2 [1,-1,1,-8,11] N = 90 3 [1,-1,1,13,-61] N = 90 eclib-20250122/progs/out_no_ntl/indep_test.out000066400000000000000000000170441474421343600212460ustar00rootroot00000000000000verbose (0/1)? Input a curve: Curve [1,0,1,-19252966408674012828065964616418441723,32685500727716376257923347071452044295907443056345614006] enter number of points: enter point 1 : enter point 2 : enter point 3 : enter point 4 : enter point 5 : enter point 6 : enter point 7 : enter point 8 : enter point 9 : enter point 10 : enter point 11 : enter point 12 : enter point 13 : enter point 14 : enter point 15 : enter point 16 : enter point 17 : enter point 18 : enter point 19 : enter point 20 : enter point 21 : enter point 22 : enter point 23 : 23 points entered. Enter number of primes to use: Processing point [5836121652711390553392352147587734955:-69455519784971993679807552308609739430858248812:41166906143372569] Image = 00 1 1 0 11 0 0 1 0 0 1 0 1 1 00 1 1 11 1 1 After elimination: 00 1 1 0 11 0 0 1 0 0 1 0 1 1 00 1 1 11 1 1 P independent of previous points (using prime 31) rank increases to 1 Processing point [1168425140326369941586705900133272389:-17137023844710987140049387309945953892946213544:5429411004770479] Image = 11 1 1 1 11 0 0 0 1 1 0 0 0 1 00 1 0 01 0 1 After elimination: 11 0 0 1 00 0 0 1 1 1 1 0 1 0 00 0 1 10 1 0 P independent of previous points (using prime 7) rank increases to 2 Processing point [69505543020048021386994294068829048:1443380843339272397458721030742392016696304046:161157926442059] Image = 11 1 0 0 01 1 1 1 0 1 1 1 1 1 01 1 1 11 0 0 After elimination: 00 0 1 1 10 1 1 1 1 0 1 1 1 0 01 0 1 10 0 1 P independent of previous points (using prime 43) rank increases to 3 Processing point [33726169481462771119596650221569:49412130720987886904443301152758710388796:7098921280459] Image = 11 0 1 0 01 0 0 1 0 0 1 0 0 1 00 0 0 01 0 1 After elimination: 00 0 0 0 11 1 1 1 0 1 1 1 0 1 01 0 0 01 1 0 P independent of previous points (using prime 53) rank increases to 4 Processing point [15827793579244286948730141533934:6538434104009303265024749952830709029353:5389750958437] Image = 01 1 0 1 11 1 1 0 1 0 0 1 1 1 01 1 1 11 1 0 After elimination: 01 0 0 0 01 1 1 1 0 1 1 1 1 1 01 0 1 11 1 0 P independent of previous points (using prime 7) rank increases to 5 Processing point [695536410556937814932194749585:230697883363551870088729854504374414548:302787575875] Image = 11 1 1 0 01 0 1 1 0 1 1 1 0 0 11 0 1 00 1 1 After elimination: 00 0 0 1 01 1 0 0 1 1 0 0 0 0 10 1 1 00 0 0 P independent of previous points (using prime 47) rank increases to 6 Processing point [3765485669836998883000769028606015:1411381089291349753164768808558921002947204:1666240341498377] Image = 01 1 1 0 01 1 0 1 0 1 0 0 0 1 10 0 1 10 0 0 After elimination: 00 0 0 0 00 1 0 0 0 1 1 0 0 0 10 1 1 11 1 1 P independent of previous points (using prime 59) rank increases to 7 Processing point [3944555884631464928934930:5657335012046240705357319452802233:2406104] Image = 01 0 0 1 11 1 0 0 0 0 1 1 1 0 00 1 0 10 1 1 After elimination: 00 0 0 0 00 0 0 0 1 1 1 1 0 0 10 0 0 00 1 1 P independent of previous points (using prime 83) rank increases to 8 Processing point [1127027270330215920:3523978127407100674110377602:1] Image = 10 1 1 0 00 1 0 1 1 0 1 0 1 1 11 1 1 11 1 0 After elimination: 00 0 0 0 00 0 0 1 0 1 0 1 0 0 11 1 1 00 0 0 P independent of previous points (using prime 71) rank increases to 9 Processing point [256051163199552568592395095:-394563651945882403580468873435105816:51895117] Image = 00 1 0 1 00 0 0 1 1 1 0 1 0 1 10 0 1 11 1 0 After elimination: 00 0 0 0 01 0 1 0 0 1 1 1 0 0 10 1 1 01 1 1 P independent of previous points (using prime 53) rank increases to 10 Processing point [442619010291205562786415:-1167962768316319592876571517317044:50653] Image = 01 0 1 1 00 1 1 0 0 1 1 0 1 0 01 0 0 11 1 0 After elimination: 00 0 0 0 00 0 0 0 0 1 1 1 1 0 01 1 1 11 0 0 P independent of previous points (using prime 89) rank increases to 11 Processing point [55822325193081529476460202295:-151915114589061403100759698106532333112:6118445789] Image = 11 0 1 0 10 0 1 0 1 1 0 1 1 1 00 1 1 00 0 1 After elimination: 00 0 0 0 00 0 0 0 0 0 0 1 1 1 01 0 0 11 1 0 P independent of previous points (using prime 109) rank increases to 12 Processing point [356145268111068765982119246504180:-1150775031908416918955115365651634494501651:30094741482625] Image = 10 1 1 1 01 1 1 1 1 1 1 0 0 1 11 0 0 10 1 0 After elimination: 00 0 0 0 00 0 1 0 0 0 0 0 0 1 11 1 1 01 1 0 P independent of previous points (using prime 67) rank increases to 13 Processing point [178158613465020969197033760546270:184569435055535326363669745422918052707327:46079082400051] Image = 11 1 0 0 11 0 0 1 1 0 0 0 1 1 01 1 1 10 1 1 After elimination: 00 0 0 0 00 0 0 0 0 0 1 0 1 0 00 0 0 11 1 1 P independent of previous points (using prime 97) rank increases to 14 Processing point [192666510528582744766151703315:-10531550647702714814852169224678207441368:64481201] Image = 10 1 1 0 11 1 0 1 1 1 0 0 1 1 01 0 1 11 1 1 After elimination: 00 0 0 0 00 0 0 0 0 0 0 0 1 0 01 0 1 00 0 1 P independent of previous points (using prime 113) rank increases to 15 Processing point [743072319779988539974981500704194760635:964874722537391293613786748114488474882993683572:437169613520472565481] Image = 00 1 1 0 10 0 1 0 0 0 0 0 1 0 11 1 1 10 1 0 After elimination: 00 0 0 0 00 0 0 0 0 0 0 0 0 1 10 0 0 00 1 0 P independent of previous points (using prime 127) rank increases to 16 Processing point [524227677070779268411695177915:3941156276776007263792745630379334937996:9221366673] Image = 01 0 1 1 11 1 0 1 1 1 1 1 1 0 00 0 0 00 0 0 After elimination: 00 0 0 0 00 0 0 0 0 0 0 0 0 0 10 0 1 10 1 1 P independent of previous points (using prime 131) rank increases to 17 Processing point [109625308172049929108967881865:387496978790653709721061294119215460988:7988005999] Image = 01 0 0 0 11 1 0 1 1 1 0 0 0 1 10 0 0 01 0 0 After elimination: 00 0 0 0 00 0 0 0 0 0 0 0 0 0 01 1 0 11 0 1 P independent of previous points (using prime 131) rank increases to 18 Processing point [90690032605118118988993244301780:-953144078079942906360903670036536669593542:819763055279] Image = 00 0 0 1 10 0 1 0 1 1 0 1 1 1 11 0 1 11 0 1 After elimination: 00 0 0 0 00 0 0 0 0 0 0 0 0 0 00 1 0 01 0 0 P independent of previous points (using prime 139) rank increases to 19 Processing point [244353456546628958634824760:-775394556680837651292166377698874734:21253933] Image = 01 0 0 0 10 0 0 0 1 1 1 1 0 0 00 1 1 00 0 0 After elimination: 00 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 11 0 0 P independent of previous points (using prime 151) rank increases to 20 Processing point [435887272311260175170207520:4712624271973109965160039085789391367:3723875] Image = 11 0 0 0 01 0 1 1 0 1 0 1 0 0 01 0 1 01 0 1 After elimination: 00 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 00 1 0 P independent of previous points (using prime 157) rank increases to 21 Processing point [386870511037825543981230636169542701637111:83015454575998684006900205726968222686505350799684:159996363164349841378621] Image = 11 1 1 0 01 0 1 0 1 1 1 1 1 0 11 0 0 00 1 1 After elimination: 00 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 00 0 1 P independent of previous points (using prime 163) rank increases to 22 Processing point [62160011888235162136050:10099849221189668277354753748208:24389] Image = 00 1 0 1 10 0 1 1 0 0 1 0 1 1 11 1 1 11 0 0 After elimination: 00 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 1 00 0 0 P independent of previous points (using prime 149) rank increases to 23 Points are all independent, their rank is 23 Input a curve: eclib-20250122/progs/out_no_ntl/list_cubics.out000066400000000000000000000272051474421343600214130ustar00rootroot00000000000000Irreducible cubics with positive discriminant up to 200, up to SL(2,Z)-equivalence 49 [ [1,2,-1,-1] [1,1,-2,-1] ] 81 [ [1,3,0,-1] [1,0,-3,-1] ] 148 [ [1,-1,-3,1] [1,1,-3,-1] ] 169 [ [1,-1,-4,-1] [1,4,1,-1] ] Irreducible cubics with positive discriminant up to 200, up to GL(2,Z)-equivalence 49 [ [1,2,-1,-1] ] 81 [ [1,3,0,-1] ] 148 [ [1,-1,-3,1] ] 169 [ [1,-1,-4,-1] ] Cubics with positive discriminant up to 200, up to SL(2,Z)-equivalence 1 [ [0,1,1,0] ] 4 [ [0,1,0,-1] ] 5 [ [0,1,-1,-1] ] 8 [ [0,1,0,-2] ] 9 [ [0,1,-1,-2] ] 12 [ [0,1,0,-3] ] 13 [ [0,1,-1,-3] ] 16 [ [0,1,0,-4] [0,2,2,0] ] 17 [ [0,1,-1,-4] ] 20 [ [0,1,0,-5] ] 21 [ [0,1,-1,-5] ] 24 [ [0,1,0,-6] ] 25 [ [0,1,-1,-6] ] 28 [ [0,1,0,-7] ] 29 [ [0,1,-1,-7] ] 32 [ [0,1,0,-8] [0,2,0,-1] ] 33 [ [0,1,-1,-8] ] 36 [ [0,1,0,-9] [0,2,-1,-1] [0,2,1,-1] ] 37 [ [0,1,-1,-9] ] 40 [ [0,1,0,-10] ] 41 [ [0,1,-1,-10] ] 44 [ [0,1,0,-11] ] 45 [ [0,1,-1,-11] ] 48 [ [0,1,0,-12] [0,2,-2,-1] ] 49 [ [0,1,-1,-12] [1,2,-1,-1] [1,1,-2,-1] ] 52 [ [0,1,0,-13] ] 53 [ [0,1,-1,-13] ] 56 [ [0,1,0,-14] ] 57 [ [0,1,-1,-14] ] 60 [ [0,1,0,-15] ] 61 [ [0,1,-1,-15] ] 64 [ [0,1,0,-16] [0,2,0,-2] ] 65 [ [0,1,-1,-16] ] 68 [ [0,1,0,-17] [0,2,-1,-2] [0,2,1,-2] ] 69 [ [0,1,-1,-17] ] 72 [ [0,1,0,-18] ] 73 [ [0,1,-1,-18] ] 76 [ [0,1,0,-19] ] 77 [ [0,1,-1,-19] ] 80 [ [0,1,0,-20] [0,2,-2,-2] ] 81 [ [0,1,-1,-20] [0,3,3,0] [1,3,0,-1] [1,0,-3,-1] ] 84 [ [0,1,0,-21] ] 85 [ [0,1,-1,-21] ] 88 [ [0,1,0,-22] ] 89 [ [0,1,-1,-22] ] 92 [ [0,1,0,-23] ] 93 [ [0,1,-1,-23] ] 96 [ [0,1,0,-24] [0,2,0,-3] ] 97 [ [0,1,-1,-24] ] 100 [ [0,1,0,-25] [0,2,-1,-3] [0,2,1,-3] ] 101 [ [0,1,-1,-25] ] 104 [ [0,1,0,-26] ] 105 [ [0,1,-1,-26] ] 108 [ [0,1,0,-27] [1,0,-3,0] ] 109 [ [0,1,-1,-27] ] 112 [ [0,1,0,-28] [0,2,-2,-3] ] 113 [ [0,1,-1,-28] ] 116 [ [0,1,0,-29] ] 117 [ [0,1,-1,-29] [0,3,-1,-1] [0,3,1,-1] ] 120 [ [0,1,0,-30] ] 121 [ [0,1,-1,-30] ] 124 [ [0,1,0,-31] ] 125 [ [0,1,-1,-31] [1,2,-2,-1] ] 128 [ [0,1,0,-32] [0,2,0,-4] ] 129 [ [0,1,-1,-32] ] 132 [ [0,1,0,-33] [0,2,-1,-4] [0,2,1,-4] ] 133 [ [0,1,-1,-33] ] 136 [ [0,1,0,-34] ] 137 [ [0,1,-1,-34] ] 140 [ [0,1,0,-35] ] 141 [ [0,1,-1,-35] ] 144 [ [0,1,0,-36] [0,2,-2,-4] [0,3,-2,-1] [0,3,2,-1] ] 145 [ [0,1,-1,-36] ] 148 [ [0,1,0,-37] [1,-1,-3,1] [1,1,-3,-1] ] 149 [ [0,1,-1,-37] ] 152 [ [0,1,0,-38] ] 153 [ [0,1,-1,-38] ] 156 [ [0,1,0,-39] ] 157 [ [0,1,-1,-39] ] 160 [ [0,1,0,-40] [0,2,0,-5] ] 161 [ [0,1,-1,-40] ] 164 [ [0,1,0,-41] [0,2,-1,-5] [0,2,1,-5] ] 165 [ [0,1,-1,-41] ] 168 [ [0,1,0,-42] ] 169 [ [0,1,-1,-42] [1,-1,-4,-1] [1,4,1,-1] ] 172 [ [0,1,0,-43] ] 173 [ [0,1,-1,-43] ] 176 [ [0,1,0,-44] [0,2,-2,-5] ] 177 [ [0,1,-1,-44] ] 180 [ [0,1,0,-45] ] 181 [ [0,1,-1,-45] ] 184 [ [0,1,0,-46] ] 185 [ [0,1,-1,-46] ] 188 [ [0,1,0,-47] ] 189 [ [0,1,-1,-47] [0,3,-3,-1] ] 192 [ [0,1,0,-48] [0,2,0,-6] ] 193 [ [0,1,-1,-48] ] 196 [ [0,1,0,-49] [0,2,-1,-6] [0,2,1,-6] ] 197 [ [0,1,-1,-49] ] 200 [ [0,1,0,-50] ] Cubics with positive discriminant up to 200, up to GL(2,Z)-equivalence 1 [ [0,1,1,0] ] 4 [ [0,1,0,-1] ] 5 [ [0,1,-1,-1] ] 8 [ [0,1,0,-2] ] 9 [ [0,1,-1,-2] ] 12 [ [0,1,0,-3] ] 13 [ [0,1,-1,-3] ] 16 [ [0,1,0,-4] [0,2,2,0] ] 17 [ [0,1,-1,-4] ] 20 [ [0,1,0,-5] ] 21 [ [0,1,-1,-5] ] 24 [ [0,1,0,-6] ] 25 [ [0,1,-1,-6] ] 28 [ [0,1,0,-7] ] 29 [ [0,1,-1,-7] ] 32 [ [0,1,0,-8] [0,2,0,-1] ] 33 [ [0,1,-1,-8] ] 36 [ [0,1,0,-9] [0,2,-1,-1] ] 37 [ [0,1,-1,-9] ] 40 [ [0,1,0,-10] ] 41 [ [0,1,-1,-10] ] 44 [ [0,1,0,-11] ] 45 [ [0,1,-1,-11] ] 48 [ [0,1,0,-12] [0,2,-2,-1] ] 49 [ [0,1,-1,-12] [1,2,-1,-1] ] 52 [ [0,1,0,-13] ] 53 [ [0,1,-1,-13] ] 56 [ [0,1,0,-14] ] 57 [ [0,1,-1,-14] ] 60 [ [0,1,0,-15] ] 61 [ [0,1,-1,-15] ] 64 [ [0,1,0,-16] [0,2,0,-2] ] 65 [ [0,1,-1,-16] ] 68 [ [0,1,0,-17] [0,2,-1,-2] ] 69 [ [0,1,-1,-17] ] 72 [ [0,1,0,-18] ] 73 [ [0,1,-1,-18] ] 76 [ [0,1,0,-19] ] 77 [ [0,1,-1,-19] ] 80 [ [0,1,0,-20] [0,2,-2,-2] ] 81 [ [0,1,-1,-20] [0,3,3,0] [1,3,0,-1] ] 84 [ [0,1,0,-21] ] 85 [ [0,1,-1,-21] ] 88 [ [0,1,0,-22] ] 89 [ [0,1,-1,-22] ] 92 [ [0,1,0,-23] ] 93 [ [0,1,-1,-23] ] 96 [ [0,1,0,-24] [0,2,0,-3] ] 97 [ [0,1,-1,-24] ] 100 [ [0,1,0,-25] [0,2,-1,-3] ] 101 [ [0,1,-1,-25] ] 104 [ [0,1,0,-26] ] 105 [ [0,1,-1,-26] ] 108 [ [0,1,0,-27] [1,0,-3,0] ] 109 [ [0,1,-1,-27] ] 112 [ [0,1,0,-28] [0,2,-2,-3] ] 113 [ [0,1,-1,-28] ] 116 [ [0,1,0,-29] ] 117 [ [0,1,-1,-29] [0,3,-1,-1] ] 120 [ [0,1,0,-30] ] 121 [ [0,1,-1,-30] ] 124 [ [0,1,0,-31] ] 125 [ [0,1,-1,-31] [1,2,-2,-1] ] 128 [ [0,1,0,-32] [0,2,0,-4] ] 129 [ [0,1,-1,-32] ] 132 [ [0,1,0,-33] [0,2,-1,-4] ] 133 [ [0,1,-1,-33] ] 136 [ [0,1,0,-34] ] 137 [ [0,1,-1,-34] ] 140 [ [0,1,0,-35] ] 141 [ [0,1,-1,-35] ] 144 [ [0,1,0,-36] [0,2,-2,-4] [0,3,-2,-1] ] 145 [ [0,1,-1,-36] ] 148 [ [0,1,0,-37] [1,-1,-3,1] ] 149 [ [0,1,-1,-37] ] 152 [ [0,1,0,-38] ] 153 [ [0,1,-1,-38] ] 156 [ [0,1,0,-39] ] 157 [ [0,1,-1,-39] ] 160 [ [0,1,0,-40] [0,2,0,-5] ] 161 [ [0,1,-1,-40] ] 164 [ [0,1,0,-41] [0,2,-1,-5] ] 165 [ [0,1,-1,-41] ] 168 [ [0,1,0,-42] ] 169 [ [0,1,-1,-42] [1,-1,-4,-1] ] 172 [ [0,1,0,-43] ] 173 [ [0,1,-1,-43] ] 176 [ [0,1,0,-44] [0,2,-2,-5] ] 177 [ [0,1,-1,-44] ] 180 [ [0,1,0,-45] ] 181 [ [0,1,-1,-45] ] 184 [ [0,1,0,-46] ] 185 [ [0,1,-1,-46] ] 188 [ [0,1,0,-47] ] 189 [ [0,1,-1,-47] [0,3,-3,-1] ] 192 [ [0,1,0,-48] [0,2,0,-6] ] 193 [ [0,1,-1,-48] ] 196 [ [0,1,0,-49] [0,2,-1,-6] ] 197 [ [0,1,-1,-49] ] 200 [ [0,1,0,-50] ] Irreducible cubics with negative discriminant down to -200, up to SL(2,Z)-equivalence -23 [ [1,-1,0,1] [1,1,0,-1] ] -31 [ [1,1,0,1] [1,-1,0,-1] ] -44 [ [1,-1,1,1] [1,1,1,-1] ] -59 [ [1,2,0,1] [1,-2,0,-1] ] -76 [ [1,-1,3,-1] [1,1,3,1] ] -83 [ [1,-1,1,-2] [1,1,1,2] ] -87 [ [1,1,2,-1] [1,-1,2,1] ] -104 [ [1,0,-1,2] [1,0,-1,-2] ] -107 [ [1,2,4,1] [1,-2,4,-1] ] -108 [ [1,0,0,2] [1,0,0,-2] ] -116 [ [1,-1,0,-2] [1,1,0,2] ] -135 [ [1,0,3,-1] [1,0,3,1] ] -139 [ [1,-1,1,2] [1,1,1,-2] ] -140 [ [1,0,2,2] [1,0,2,-2] ] -152 [ [1,-1,-2,-2] [1,1,-2,2] ] -172 [ [1,2,0,2] [1,-2,0,-2] ] -175 [ [1,2,3,-1] [1,-2,3,1] ] -176 [ [1,-1,3,1] [1,1,3,-1] ] -199 [ [1,1,4,1] [1,-1,4,-1] ] -200 [ [1,-1,2,2] [1,1,2,-2] ] Irreducible cubics with negative discriminant down to -200, up to GL(2,Z)-equivalence -23 [ [1,-1,0,1] ] -31 [ [1,1,0,1] ] -44 [ [1,-1,1,1] ] -59 [ [1,2,0,1] ] -76 [ [1,-1,3,-1] ] -83 [ [1,-1,1,-2] ] -87 [ [1,1,2,-1] ] -104 [ [1,0,-1,2] ] -107 [ [1,2,4,1] ] -108 [ [1,0,0,2] ] -116 [ [1,-1,0,-2] ] -135 [ [1,0,3,-1] ] -139 [ [1,-1,1,2] ] -140 [ [1,0,2,2] ] -152 [ [1,-1,-2,-2] ] -172 [ [1,2,0,2] ] -175 [ [1,2,3,-1] ] -176 [ [1,-1,3,1] ] -199 [ [1,1,4,1] ] -200 [ [1,-1,2,2] ] Cubics with negative discriminant down to -200, up to SL(2,Z)-equivalence -3 [ [0,1,1,1] ] -4 [ [0,1,0,1] ] -7 [ [0,1,1,2] ] -8 [ [0,1,0,2] ] -11 [ [0,1,1,3] ] -12 [ [0,1,0,3] ] -15 [ [0,1,1,4] ] -16 [ [0,1,0,4] [1,2,2,0] ] -19 [ [0,1,1,5] ] -20 [ [0,1,0,5] ] -23 [ [0,1,1,6] [1,-1,0,1] [1,1,0,-1] ] -24 [ [0,1,0,6] ] -27 [ [0,1,1,7] [1,0,0,1] ] -28 [ [0,1,0,7] [0,2,-1,1] [0,2,1,1] ] -31 [ [0,1,1,8] [1,1,0,1] [1,-1,0,-1] ] -32 [ [0,1,0,8] [0,2,0,1] ] -35 [ [0,1,1,9] ] -36 [ [0,1,0,9] ] -39 [ [0,1,1,10] ] -40 [ [0,1,0,10] ] -43 [ [0,1,1,11] ] -44 [ [0,1,0,11] [1,-1,1,1] [1,1,1,-1] ] -47 [ [0,1,1,12] ] -48 [ [0,1,0,12] [0,2,2,2] ] -51 [ [0,1,1,13] ] -52 [ [0,1,0,13] ] -55 [ [0,1,1,14] ] -56 [ [0,1,0,14] ] -59 [ [0,1,1,15] [1,2,0,1] [1,-2,0,-1] ] -60 [ [0,1,0,15] [0,2,-1,2] [0,2,1,2] ] -63 [ [0,1,1,16] ] -64 [ [0,1,0,16] [0,2,0,2] ] -67 [ [0,1,1,17] ] -68 [ [0,1,0,17] ] -71 [ [0,1,1,18] ] -72 [ [0,1,0,18] [0,3,-2,1] [0,3,2,1] [1,2,3,0] [1,-2,3,0] ] -75 [ [0,1,1,19] ] -76 [ [0,1,0,19] [1,-1,3,-1] [1,1,3,1] ] -79 [ [0,1,1,20] ] -80 [ [0,1,0,20] [0,2,2,3] ] -83 [ [0,1,1,21] [1,-1,1,-2] [1,1,1,2] ] -84 [ [0,1,0,21] ] -87 [ [0,1,1,22] [1,1,2,-1] [1,-1,2,1] ] -88 [ [0,1,0,22] ] -91 [ [0,1,1,23] ] -92 [ [0,1,0,23] [0,2,-1,3] [0,2,1,3] ] -95 [ [0,1,1,24] ] -96 [ [0,1,0,24] [0,2,0,3] ] -99 [ [0,1,1,25] [0,3,-1,1] [0,3,1,1] [1,-1,3,0] [1,1,3,0] ] -100 [ [0,1,0,25] [1,-1,0,2] [1,1,0,-2] ] -103 [ [0,1,1,26] ] -104 [ [0,1,0,26] [1,0,-1,2] [1,0,-1,-2] ] -107 [ [0,1,1,27] [1,2,4,1] [1,-2,4,-1] ] -108 [ [0,1,0,27] [1,0,3,0] [1,0,0,2] [1,0,0,-2] ] -111 [ [0,1,1,28] ] -112 [ [0,1,0,28] [0,2,2,4] [1,0,1,2] [1,0,1,-2] ] -115 [ [0,1,1,29] ] -116 [ [0,1,0,29] [1,-1,0,-2] [1,1,0,2] ] -119 [ [0,1,1,30] ] -120 [ [0,1,0,30] ] -123 [ [0,1,1,31] ] -124 [ [0,1,0,31] [0,2,-1,4] [0,2,1,4] ] -127 [ [0,1,1,32] ] -128 [ [0,1,0,32] [0,2,0,4] ] -131 [ [0,1,1,33] ] -132 [ [0,1,0,33] ] -135 [ [0,1,1,34] [0,3,3,2] [1,0,3,-1] [1,0,3,1] ] -136 [ [0,1,0,34] ] -139 [ [0,1,1,35] [1,-1,1,2] [1,1,1,-2] ] -140 [ [0,1,0,35] [1,0,2,2] [1,0,2,-2] ] -143 [ [0,1,1,36] ] -144 [ [0,1,0,36] [0,2,2,5] ] -147 [ [0,1,1,37] [1,-1,-1,-2] [1,1,-1,2] ] -148 [ [0,1,0,37] ] -151 [ [0,1,1,38] ] -152 [ [0,1,0,38] [1,-1,-2,-2] [1,1,-2,2] ] -155 [ [0,1,1,39] ] -156 [ [0,1,0,39] [0,2,-1,5] [0,2,1,5] ] -159 [ [0,1,1,40] ] -160 [ [0,1,0,40] [0,2,0,5] ] -163 [ [0,1,1,41] ] -164 [ [0,1,0,41] ] -167 [ [0,1,1,42] ] -168 [ [0,1,0,42] ] -171 [ [0,1,1,43] ] -172 [ [0,1,0,43] [1,2,0,2] [1,-2,0,-2] ] -175 [ [0,1,1,44] [1,2,3,-1] [1,-2,3,1] ] -176 [ [0,1,0,44] [0,2,2,6] [1,-1,3,1] [1,1,3,-1] ] -179 [ [0,1,1,45] ] -180 [ [0,1,0,45] [0,3,-2,2] [0,3,2,2] ] -183 [ [0,1,1,46] ] -184 [ [0,1,0,46] ] -187 [ [0,1,1,47] ] -188 [ [0,1,0,47] [0,2,-1,6] [0,2,1,6] ] -191 [ [0,1,1,48] ] -192 [ [0,1,0,48] [0,2,0,6] [0,4,-2,1] [0,4,2,1] [1,2,4,0] [1,-2,4,0] ] -195 [ [0,1,1,49] ] -196 [ [0,1,0,49] ] -199 [ [0,1,1,50] [1,1,4,1] [1,-1,4,-1] ] -200 [ [0,1,0,50] [1,-1,2,2] [1,1,2,-2] ] Cubics with negative discriminant down to -200, up to GL(2,Z)-equivalence -3 [ [0,1,1,1] ] -4 [ [0,1,0,1] ] -7 [ [0,1,1,2] ] -8 [ [0,1,0,2] ] -11 [ [0,1,1,3] ] -12 [ [0,1,0,3] ] -15 [ [0,1,1,4] ] -16 [ [0,1,0,4] [1,2,2,0] ] -19 [ [0,1,1,5] ] -20 [ [0,1,0,5] ] -23 [ [0,1,1,6] [1,-1,0,1] ] -24 [ [0,1,0,6] ] -27 [ [0,1,1,7] [1,0,0,1] ] -28 [ [0,1,0,7] [0,2,-1,1] ] -31 [ [0,1,1,8] [1,1,0,1] ] -32 [ [0,1,0,8] [0,2,0,1] ] -35 [ [0,1,1,9] ] -36 [ [0,1,0,9] ] -39 [ [0,1,1,10] ] -40 [ [0,1,0,10] ] -43 [ [0,1,1,11] ] -44 [ [0,1,0,11] [1,-1,1,1] ] -47 [ [0,1,1,12] ] -48 [ [0,1,0,12] [0,2,2,2] ] -51 [ [0,1,1,13] ] -52 [ [0,1,0,13] ] -55 [ [0,1,1,14] ] -56 [ [0,1,0,14] ] -59 [ [0,1,1,15] [1,2,0,1] ] -60 [ [0,1,0,15] [0,2,-1,2] ] -63 [ [0,1,1,16] ] -64 [ [0,1,0,16] [0,2,0,2] ] -67 [ [0,1,1,17] ] -68 [ [0,1,0,17] ] -71 [ [0,1,1,18] ] -72 [ [0,1,0,18] [0,3,-2,1] [1,2,3,0] ] -75 [ [0,1,1,19] ] -76 [ [0,1,0,19] [1,-1,3,-1] ] -79 [ [0,1,1,20] ] -80 [ [0,1,0,20] [0,2,2,3] ] -83 [ [0,1,1,21] [1,-1,1,-2] ] -84 [ [0,1,0,21] ] -87 [ [0,1,1,22] [1,1,2,-1] ] -88 [ [0,1,0,22] ] -91 [ [0,1,1,23] ] -92 [ [0,1,0,23] [0,2,-1,3] ] -95 [ [0,1,1,24] ] -96 [ [0,1,0,24] [0,2,0,3] ] -99 [ [0,1,1,25] [0,3,-1,1] [1,-1,3,0] ] -100 [ [0,1,0,25] [1,-1,0,2] ] -103 [ [0,1,1,26] ] -104 [ [0,1,0,26] [1,0,-1,2] ] -107 [ [0,1,1,27] [1,2,4,1] ] -108 [ [0,1,0,27] [1,0,3,0] [1,0,0,2] ] -111 [ [0,1,1,28] ] -112 [ [0,1,0,28] [0,2,2,4] [1,0,1,2] ] -115 [ [0,1,1,29] ] -116 [ [0,1,0,29] [1,-1,0,-2] ] -119 [ [0,1,1,30] ] -120 [ [0,1,0,30] ] -123 [ [0,1,1,31] ] -124 [ [0,1,0,31] [0,2,-1,4] ] -127 [ [0,1,1,32] ] -128 [ [0,1,0,32] [0,2,0,4] ] -131 [ [0,1,1,33] ] -132 [ [0,1,0,33] ] -135 [ [0,1,1,34] [0,3,3,2] [1,0,3,-1] ] -136 [ [0,1,0,34] ] -139 [ [0,1,1,35] [1,-1,1,2] ] -140 [ [0,1,0,35] [1,0,2,2] ] -143 [ [0,1,1,36] ] -144 [ [0,1,0,36] [0,2,2,5] ] -147 [ [0,1,1,37] [1,-1,-1,-2] ] -148 [ [0,1,0,37] ] -151 [ [0,1,1,38] ] -152 [ [0,1,0,38] [1,-1,-2,-2] ] -155 [ [0,1,1,39] ] -156 [ [0,1,0,39] [0,2,-1,5] ] -159 [ [0,1,1,40] ] -160 [ [0,1,0,40] [0,2,0,5] ] -163 [ [0,1,1,41] ] -164 [ [0,1,0,41] ] -167 [ [0,1,1,42] ] -168 [ [0,1,0,42] ] -171 [ [0,1,1,43] ] -172 [ [0,1,0,43] [1,2,0,2] ] -175 [ [0,1,1,44] [1,2,3,-1] ] -176 [ [0,1,0,44] [0,2,2,6] [1,-1,3,1] ] -179 [ [0,1,1,45] ] -180 [ [0,1,0,45] [0,3,-2,2] ] -183 [ [0,1,1,46] ] -184 [ [0,1,0,46] ] -187 [ [0,1,1,47] ] -188 [ [0,1,0,47] [0,2,-1,6] ] -191 [ [0,1,1,48] ] -192 [ [0,1,0,48] [0,2,0,6] [0,4,-2,1] [1,2,4,0] ] -195 [ [0,1,1,49] ] -196 [ [0,1,0,49] ] -199 [ [0,1,1,50] [1,1,4,1] ] -200 [ [0,1,0,50] [1,-1,2,2] ] eclib-20250122/progs/out_no_ntl/moreap.out000066400000000000000000000023641474421343600203720ustar00rootroot00000000000000Program moreap --------------- For each N, assumes that the file newforms/xN exists, and computes more Hecke eigenvalues. Output new eigs to file (1/0)? Output new eigs to screen (1/0)? Display newforms (1/0)? Attempt curve construction (1/0)? Enter level: How many primes for Hecke eigenvalues? >>>Level 11 Retrieving newform data for N = 11 Finished reading newform data for N = 11 1 newform(s) at level 11: p0=2 #ap= 100 1: aplist = [ -2 -1 1 -2 1 4 -2 0 -1 0 7 3 -8 -6 8 -6 5 12 -7 -3 ...] aq = [ -1 ] ap0 = -2, dp0 = 2, np0 = 5 SFE = 1, L/P = 2/5 lplus = 1, mplus = 1 lminus = 3, mminus = 2 [(4,1;1,3),1,1;1] Making homspace...Constructing H1 (with sign=+1) ...done done. Making form_finder (nap=100)...Recovering eigenspace bases with form_finder... Form number 1 with eigs -2 -1 1 -2 -1 4 -2 0 -1 0 ... Entering form_finder, depth = 0, dimension 2 restarting at depth = 0, dimension 2 Computing T(2)...done. eig -2 gives new subspace at depth 1 of dimension 1 Filling in data for for newform #1: bases...type and cuspidal factors...cuspidalfactorplus = 5 coords...denomplus = 5 done. Finished filling in data for newform #1 ...done. About to start computing ap......done. Computing 1 curves... 1 [0,-1,1,-10,-20] N = 11 All curves found OK Enter level: eclib-20250122/progs/out_no_ntl/mwrank.out000066400000000000000000000273161474421343600204120ustar00rootroot00000000000000Curve [0,1,1,-2,0] : Basic pair: I=112, J=-1712 disc=2688768 2-adic index bound = 2 By Lemma 5.1(a), 2-adic index = 1 2-adic index = 1 One (I,J) pair Looking for quartics with I = 112, J = -1712 Looking for Type 2 quartics: Trying positive a from 1 up to 2 (square a first...) (1,0,-8,4,4) --nontrivial...(x:y:z) = (1 : 1 : 0) Point = [1:0:1] height = 0.476711659343739 Rank of B=im(eps) increases to 1 Trying positive a from 1 up to 2 (...then non-square a) Trying negative a from -1 down to -1 Finished looking for Type 2 quartics. Looking for Type 1 quartics: Trying positive a from 1 up to 3 (square a first...) (1,0,4,12,8) --nontrivial...(x:y:z) = (1 : 1 : 0) Point = [-1:1:1] height = 0.686667083305586 Rank of B=im(eps) increases to 2 (The previous point is on the egg) Exiting search for Type 1 quartics after finding one which is globally soluble. Mordell rank contribution from B=im(eps) = 2 Selmer rank contribution from B=im(eps) = 2 Sha rank contribution from B=im(eps) = 0 Mordell rank contribution from A=ker(eps) = 0 Selmer rank contribution from A=ker(eps) = 0 Sha rank contribution from A=ker(eps) = 0 Used full 2-descent via multiplication-by-2 map Rank = 2 Rank of S^2(E) = 2 Searching for points (bound = 8)...done: found points which generate a subgroup of rank 2 and regulator 0.152460177943144 Processing points found during 2-descent...done: now regulator = 0.152460177943144 Saturating (with bound = 1000)...done: points were already saturated. Transferring points from minimal curve [0,1,1,-2,0] back to original curve [0,1,1,-2,0] Generator 1 is [0:-1:1]; height 0.327000773651605 Generator 2 is [-1:1:1]; height 0.686667083305586 Regulator = 0.152460177943144 The rank and full Mordell-Weil basis have been determined unconditionally. Curve [0,0,0,0,-675/4] : integral model = [0,0,0,0,-10800] with scale factor 2 Working with minimal curve [0,0,1,0,-169] via [u,r,s,t] = [2,0,0,4] Basic pair: I=0, J=291600 disc=-85030560000 2-adic index bound = 2 By Lemma 5.1(a), 2-adic index = 1 2-adic index = 1 One (I,J) pair Looking for quartics with I = 0, J = 291600 Looking for Type 3 quartics: Trying positive a from 1 up to 12 (square a first...) Trying positive a from 1 up to 12 (...then non-square a) (2,-2,-78,298,-328) --trivial Trying negative a from -1 down to -19 (-3,0,0,60,0) --trivial (-7,-4,12,44,8) --trivial (-7,12,36,36,0) --trivial (-7,-13,-42,-28,8) --trivial Finished looking for Type 3 quartics. Mordell rank contribution from B=im(eps) = 0 Selmer rank contribution from B=im(eps) = 0 Sha rank contribution from B=im(eps) = 0 Mordell rank contribution from A=ker(eps) = 0 Selmer rank contribution from A=ker(eps) = 0 Sha rank contribution from A=ker(eps) = 0 Used full 2-descent via multiplication-by-2 map Rank = 0 Rank of S^2(E) = 0 Processing points found during 2-descent...done: now regulator = 1 Regulator = 1 The rank and full Mordell-Weil basis have been determined unconditionally. Curve [0,0,0,0,73/64] : integral model = [0,0,0,0,73] with scale factor 2 Basic pair: I=0, J=-1971 disc=-3884841 2-adic index bound = 2 2-adic index = 2 Two (I,J) pairs Looking for quartics with I = 0, J = -1971 Looking for Type 3 quartics: Trying positive a from 1 up to 3 (square a first...) (1,0,6,3,-3) --nontrivial...(x:y:z) = (1 : 1 : 0) Point = [-4:3:1] height = 0.962573188092379 Rank of B=im(eps) increases to 1 Trying positive a from 1 up to 3 (...then non-square a) Trying negative a from -1 down to -2 Finished looking for Type 3 quartics. Looking for quartics with I = 0, J = -126144 Looking for Type 3 quartics: Trying positive a from 1 up to 14 (square a first...) (1,0,-12,72,-12) --nontrivial...(x:y:z) = (1 : 1 : 0) Point = [2:9:1] height = 0.923943171600397 Doubling global 2-adic index to 2 global 2-adic index is equal to local index so we abort the search for large quartics Rank of B=im(eps) increases to 2 Exiting search for large quartics after finding enough globally soluble ones. Mordell rank contribution from B=im(eps) = 2 Selmer rank contribution from B=im(eps) = 2 Sha rank contribution from B=im(eps) = 0 Mordell rank contribution from A=ker(eps) = 0 Selmer rank contribution from A=ker(eps) = 0 Sha rank contribution from A=ker(eps) = 0 Used full 2-descent via multiplication-by-2 map Rank = 2 Rank of S^2(E) = 2 Searching for points (bound = 8)...done: found points which generate a subgroup of rank 2 and regulator 0.886543288687716 Processing points found during 2-descent...done: now regulator = 0.886543288687716 Saturating (with bound = 1000)...done: points were already saturated. Transferring points from minimal curve [0,0,0,0,73] back to original curve [0,0,0,0,73/64] Generator 1 is [-8:3:8]; height 0.962573188092379 Generator 2 is [4:9:8]; height 0.923943171600397 Regulator = 0.886543288687716 The rank and full Mordell-Weil basis have been determined unconditionally. Curve [0,0,0,677,0] : 1 points of order 2: [0:0:1] Using 2-isogenous curve [0,0,0,-2708,0] ------------------------------------------------------- First step, determining 1st descent Selmer groups ------------------------------------------------------- After first local descent, rank bound = 1 rk(S^{phi}(E'))= 1 rk(S^{phi'}(E))= 2 ------------------------------------------------------- Second step, determining 2nd descent Selmer groups ------------------------------------------------------- After second local descent, rank bound = 1 rk(phi'(S^{2}(E)))= 1 rk(phi(S^{2}(E')))= 2 rk(S^{2}(E))= 2 rk(S^{2}(E'))= 2 Third step, determining E(Q)/phi(E'(Q)) and E'(Q)/phi'(E(Q)) ------------------------------------------------------- 1. E(Q)/phi(E'(Q)) ------------------------------------------------------- (c,d) =(0,677) (c',d')=(0,-2708) This component of the rank is 0 ------------------------------------------------------- 2. E'(Q)/phi'(E(Q)) ------------------------------------------------------- First stage (no second descent yet)... (-1,0,0,0,2708): (x:y:z) = (502:279022:85) Curve E' Point [-21420340:-140069044:614125], height = 12.3948826572104 Curve E Point [830499826893070:-7145241014093919:77690502163000], height = 24.7897653144207 After first global descent, this component of the rank = 2 ------------------------------------------------------- Summary of results: ------------------------------------------------------- rank(E) = 1 #E(Q)/2E(Q) = 4 Information on III(E/Q): #III(E/Q)[phi'] = 1 #III(E/Q)[2] = 1 Information on III(E'/Q): #phi'(III(E/Q)[2]) = 1 #III(E'/Q)[phi] = 1 #III(E'/Q)[2] = 1 ------------------------------------------------------- List of points on E = [0,0,0,677,0]: I. Points on E mod phi(E') --none (modulo torsion). II. Points on phi(E') mod 2E Point [830499826893070:-7145241014093919:77690502163000], height = 24.7897653144207 ------------------------------------------------------- Computing full set of 2 coset representatives for 2E(Q) in E(Q) (modulo torsion), and sorting into height order....done. Used descent via 2-isogeny with isogenous curve E' = [0,0,0,-2708,0] Rank = 1 Rank of S^2(E) = 2 Rank of S^2(E') = 2 Rank of S^phi(E') = 1 Rank of S^phi'(E) = 2 Searching for points (bound = 8)...done: found points which generate a subgroup of rank 0 and regulator 1 Processing points found during 2-descent...done: 2-descent increases rank to 1, now regulator = 24.7897653144207 Saturating (with bound = 1000)...done: points were already saturated. Transferring points from minimal curve [0,0,0,677,0] back to original curve [0,0,0,677,0] Generator 1 is [830499826893070:-7145241014093919:77690502163000]; height 24.7897653144207 Regulator = 24.7897653144207 The rank and full Mordell-Weil basis have been determined unconditionally. Curve [0,0,0,-169,0] : 3 points of order 2: [-13:0:1], [0:0:1], [13:0:1] **************************** * Using 2-isogeny number 1 * **************************** Using 2-isogenous curve [0,78,0,169,0] (minimal model [0,0,0,-1859,30758]) ------------------------------------------------------- First step, determining 1st descent Selmer groups ------------------------------------------------------- After first local descent, rank bound = 1 rk(S^{phi}(E'))= 2 rk(S^{phi'}(E))= 1 ------------------------------------------------------- Second step, determining 2nd descent Selmer groups ------------------------------------------------------- After second local descent, rank bound = 1 rk(phi'(S^{2}(E)))= 2 rk(phi(S^{2}(E')))= 1 rk(S^{2}(E))= 3 rk(S^{2}(E'))= 2 **************************** * Using 2-isogeny number 2 * **************************** Using 2-isogenous curve [0,0,0,676,0] ------------------------------------------------------- First step, determining 1st descent Selmer groups ------------------------------------------------------- After first local descent, rank bound = 1 rk(S^{phi}(E'))= 2 rk(S^{phi'}(E))= 1 ------------------------------------------------------- Second step, determining 2nd descent Selmer groups ------------------------------------------------------- After second local descent, rank bound = 1 rk(phi'(S^{2}(E)))= 2 rk(phi(S^{2}(E')))= 1 rk(S^{2}(E))= 3 rk(S^{2}(E'))= 2 **************************** * Using 2-isogeny number 3 * **************************** Using 2-isogenous curve [0,-78,0,169,0] (minimal model [0,0,0,-1859,-30758]) ------------------------------------------------------- First step, determining 1st descent Selmer groups ------------------------------------------------------- After first local descent, rank bound = 1 rk(S^{phi}(E'))= 3 rk(S^{phi'}(E))= 0 ------------------------------------------------------- Second step, determining 2nd descent Selmer groups ------------------------------------------------------- After second local descent, rank bound = 1 rk(phi'(S^{2}(E)))= 3 rk(phi(S^{2}(E')))= 0 rk(S^{2}(E))= 3 rk(S^{2}(E'))= 2 After second local descent, combined upper bound on rank = 1 Third step, determining E(Q)/phi(E'(Q)) and E'(Q)/phi'(E(Q)) ------------------------------------------------------- 1. E(Q)/phi(E'(Q)) ------------------------------------------------------- (c,d) =(39,338) (c',d')=(-78,169) First stage (no second descent yet)... (-1,0,39,0,-338): (x:y:z) = (19:102:5) Curve E Point [-1805:-1938:125], height = 5.83251173698765 After first global descent, this component of the rank = 3 ------------------------------------------------------- 2. E'(Q)/phi'(E(Q)) ------------------------------------------------------- This component of the rank is 0 ------------------------------------------------------- Summary of results: ------------------------------------------------------- rank(E) = 1 #E(Q)/2E(Q) = 8 Information on III(E/Q): #III(E/Q)[phi'] = 1 #III(E/Q)[2] = 1 Information on III(E'/Q): #phi'(III(E/Q)[2]) = 1 #III(E'/Q)[phi] = 1 #III(E'/Q)[2] = 1 ------------------------------------------------------- List of points on E = [0,0,0,-169,0]: I. Points on E mod phi(E') Point [-180:-1938:125], height = 5.83251173698765 II. Points on phi(E') mod 2E --none (modulo torsion). ------------------------------------------------------- Computing full set of 2 coset representatives for 2E(Q) in E(Q) (modulo torsion), and sorting into height order....done. Used descent via 2-isogeny with isogenous curve E' = [0,0,0,-1859,-30758] Rank = 1 Rank of S^2(E) = 3 Rank of S^2(E') = 2 Rank of S^phi(E') = 3 Rank of S^phi'(E) = 0 Searching for points (bound = 8)...done: found points which generate a subgroup of rank 1 and regulator 5.83251173698765 Processing points found during 2-descent...done: now regulator = 5.83251173698765 Saturating (with bound = 1000)...done: points were already saturated. Transferring points from minimal curve [0,0,0,-169,0] back to original curve [0,0,0,-169,0] Generator 1 is [-180:1938:125]; height 5.83251173698765 Regulator = 5.83251173698765 The rank and full Mordell-Weil basis have been determined unconditionally. eclib-20250122/progs/out_no_ntl/nfcount.out000066400000000000000000000011401474421343600205520ustar00rootroot00000000000000Verbose? (0/1) Enter first and last N: >>> Level 50 <<< 2 newform(s), 100 eigs on file. >>> Level 51 <<< 1 newform(s), 100 eigs on file. >>> Level 52 <<< 1 newform(s), 100 eigs on file. >>> Level 53 <<< 1 newform(s), 100 eigs on file. >>> Level 54 <<< 2 newform(s), 100 eigs on file. >>> Level 55 <<< 1 newform(s), 100 eigs on file. >>> Level 56 <<< 2 newform(s), 100 eigs on file. >>> Level 57 <<< 3 newform(s), 100 eigs on file. >>> Level 58 <<< 2 newform(s), 100 eigs on file. >>> Level 59 <<< 0 newform(s), 0 eigs on file. >>> Level 60 <<< 0 newform(s), 0 eigs on file. 15 newform(s) in range 50...60 eclib-20250122/progs/out_no_ntl/nfhpcurve.out000066400000000000000000000106761474421343600211140ustar00rootroot00000000000000Program nfhpcurve. Using METHOD = 2 to find newforms MODULUS for linear algebra = 1073741789 Verbose output? How many primes for Hecke eigenvalues? Output newforms to file? (0/1) Output curves to file? (0/1) Enter level: >>>Level 11: 1 newform(s) found. Computing 1 curves... 1 [0,-1,1,-10,-20] N = 11 [(4,1;1,3),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.11 All curves found successfully! Finished level 11 Enter level: >>>Level 19: 1 newform(s) found. Computing 1 curves... 1 [0,1,1,-9,-15] N = 19 [(5,1;1,4),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.19 All curves found successfully! Finished level 19 Enter level: >>>Level 37: 2 newform(s) found. Computing 2 curves... 1 [0,0,1,-1,0] N = 37 [(14,1;3,8),1,1;2] 2 [0,1,1,-23,-50] N = 37 [(15,1;2,5),1,1;2] Finished finding curves. Outputting curves to ./tcurves/curves.37 All curves found successfully! Finished level 37 Enter level: >>>Level 50: 2 newform(s) found. Computing 2 curves... 1 [1,0,1,-1,-2] N = 50 [(17,1;1,3),1,1;1] 2 [1,1,1,-3,1] N = 50 [(17,1;1,3),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.50 All curves found successfully! Finished level 50 Enter level: >>>Level 51: 1 newform(s) found. Computing 1 curves... 1 [0,1,1,1,-1] N = 51 [(13,1;1,4),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.51 All curves found successfully! Finished level 51 Enter level: >>>Level 52: 1 newform(s) found. Computing 1 curves... 1 [0,0,0,1,-10] N = 52 [(21,1;2,5),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.52 All curves found successfully! Finished level 52 Enter level: >>>Level 53: 1 newform(s) found. Computing 1 curves... 1 [1,-1,1,0,0] N = 53 [(-21,1;-2,5),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.53 All curves found successfully! Finished level 53 Enter level: >>>Level 54: 2 newform(s) found. Computing 2 curves... 1 [1,-1,0,12,8] N = 54 [(11,1;1,5),1,1;1] 2 [1,-1,1,1,-1] N = 54 [(11,1;1,5),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.54 All curves found successfully! Finished level 54 Enter level: >>>Level 55: 1 newform(s) found. Computing 1 curves... 1 [1,-1,0,1,0] N = 55 [(14,1;1,4),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.55 All curves found successfully! Finished level 55 Enter level: >>>Level 56: 2 newform(s) found. Computing 2 curves... 1 [0,0,0,1,2] N = 56 [(19,1;1,3),1,1;1] 2 [0,-1,0,0,-4] N = 56 [(19,1;1,3),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.56 All curves found successfully! Finished level 56 Enter level: >>>Level 57: 3 newform(s) found. Computing 3 curves... 1 [0,-1,1,-2,2] N = 57 [(23,1;2,5),1,1;1] 2 [0,1,1,20,-32] N = 57 [(23,1;2,5),1,1;1] 3 [1,0,1,-7,5] N = 57 [(23,1;2,5),1,1;2] Finished finding curves. Outputting curves to ./tcurves/curves.57 All curves found successfully! Finished level 57 Enter level: >>>Level 58: 2 newform(s) found. Computing 2 curves... 1 [1,-1,0,-1,1] N = 58 [(-23,1;-2,5),1,1;1] 2 [1,1,1,5,9] N = 58 [(-23,1;-2,5),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.58 All curves found successfully! Finished level 58 Enter level: >>>Level 59: 0 newform(s) found. No newforms. Finished level 59 Enter level: >>>Level 60: 0 newform(s) found. No newforms. Finished level 60 Enter level: >>>Level 73: 1 newform(s) found. Computing 1 curves... 1 [1,-1,0,4,-3] N = 73 [(-29,1;-2,5),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.73 All curves found successfully! Finished level 73 Enter level: >>>Level 77: 3 newform(s) found. Computing 3 curves... 1 [0,0,1,2,0] N = 77 [(31,1;2,5),1,1;1] 2 [0,1,1,-49,600] N = 77 [(26,1;1,3),2,2;1] 3 [1,1,0,4,11] N = 77 [(26,1;1,3),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.77 All curves found successfully! Finished level 77 Enter level: >>>Level 90: 3 newform(s) found. Computing 3 curves... 1 [1,-1,0,6,0] N = 90 [(-77,2;-3,7),1,1;1] 2 [1,-1,1,-8,11] N = 90 [(-77,2;-3,7),1,1;1] 3 [1,-1,1,13,-61] N = 90 [(13,1;1,7),2,2;1] Finished finding curves. Outputting curves to ./tcurves/curves.90 All curves found successfully! Finished level 90 Enter level: >>>Level 389: 1 newform(s) found. Computing 1 curves... 1 [0,1,1,-2,0] N = 389 [(-111,1;-2,7),1,1;2] Finished finding curves. Outputting curves to ./tcurves/curves.389 All curves found successfully! Finished level 389 Enter level: eclib-20250122/progs/out_no_ntl/nfhpcurve_prof.out000066400000000000000000000062601474421343600221340ustar00rootroot00000000000000Program nfhpcurve. Using METHOD = 2 to find newforms MODULUS for linear algebra = 1073741789 Verbose output? How many primes for Hecke eigenvalues? Output newforms to file? (0/1) Enter level: >>>Level 11: 1 newform(s) found. Computing 1 curves... 1 [0,-1,1,-10,-20] N = 11 [(4,1;1,3),1,1;1] All curves found successfully! Finished level 11 Enter level: >>>Level 37: 2 newform(s) found. Computing 2 curves... 1 [0,0,1,-1,0] N = 37 [(14,1;3,8),1,1;2] 2 [0,1,1,-23,-50] N = 37 [(15,1;2,5),1,1;2] All curves found successfully! Finished level 37 Enter level: >>>Level 50: 2 newform(s) found. Computing 2 curves... 1 [1,0,1,-1,-2] N = 50 [(17,1;1,3),1,1;1] 2 [1,1,1,-3,1] N = 50 [(17,1;1,3),1,1;1] All curves found successfully! Finished level 50 Enter level: >>>Level 51: 1 newform(s) found. Computing 1 curves... 1 [0,1,1,1,-1] N = 51 [(13,1;1,4),1,1;1] All curves found successfully! Finished level 51 Enter level: >>>Level 52: 1 newform(s) found. Computing 1 curves... 1 [0,0,0,1,-10] N = 52 [(21,1;2,5),1,1;1] All curves found successfully! Finished level 52 Enter level: >>>Level 53: 1 newform(s) found. Computing 1 curves... 1 [1,-1,1,0,0] N = 53 [(-21,1;-2,5),1,1;1] All curves found successfully! Finished level 53 Enter level: >>>Level 54: 2 newform(s) found. Computing 2 curves... 1 [1,-1,0,12,8] N = 54 [(11,1;1,5),1,1;1] 2 [1,-1,1,1,-1] N = 54 [(11,1;1,5),1,1;1] All curves found successfully! Finished level 54 Enter level: >>>Level 55: 1 newform(s) found. Computing 1 curves... 1 [1,-1,0,1,0] N = 55 [(14,1;1,4),1,1;1] All curves found successfully! Finished level 55 Enter level: >>>Level 56: 2 newform(s) found. Computing 2 curves... 1 [0,0,0,1,2] N = 56 [(19,1;1,3),1,1;1] 2 [0,-1,0,0,-4] N = 56 [(19,1;1,3),1,1;1] All curves found successfully! Finished level 56 Enter level: >>>Level 57: 3 newform(s) found. Computing 3 curves... 1 [0,-1,1,-2,2] N = 57 [(23,1;2,5),1,1;1] 2 [0,1,1,20,-32] N = 57 [(23,1;2,5),1,1;1] 3 [1,0,1,-7,5] N = 57 [(23,1;2,5),1,1;2] All curves found successfully! Finished level 57 Enter level: >>>Level 58: 2 newform(s) found. Computing 2 curves... 1 [1,-1,0,-1,1] N = 58 [(-23,1;-2,5),1,1;1] 2 [1,1,1,5,9] N = 58 [(-23,1;-2,5),1,1;1] ******************************L(f,31)/ip = 19.99999933184035365079434 is not integral! (denom = 1496649) Using rounded value mminus=20 All curves found successfully! Finished level 58 Enter level: >>>Level 59: 0 newform(s) found. No newforms. Finished level 59 Enter level: >>>Level 60: 0 newform(s) found. No newforms. Finished level 60 Enter level: >>>Level 77: 3 newform(s) found. Computing 3 curves... 1 [0,0,1,2,0] N = 77 [(31,1;2,5),1,1;1] 2 [0,1,1,-49,600] N = 77 [(26,1;1,3),2,2;1] 3 [1,1,0,4,11] N = 77 [(26,1;1,3),1,1;1] All curves found successfully! Finished level 77 Enter level: >>>Level 90: 3 newform(s) found. Computing 3 curves... 1 [1,-1,0,6,0] N = 90 [(-77,2;-3,7),1,1;1] 2 [1,-1,1,-8,11] N = 90 [(-77,2;-3,7),1,1;1] 3 [1,-1,1,13,-61] N = 90 [(13,1;1,7),2,2;1] All curves found successfully! Finished level 90 Enter level: >>>Level 389: 1 newform(s) found. Computing 1 curves... 1 [0,1,1,-2,0] N = 389 [(-111,1;-2,7),1,1;2] All curves found successfully! Finished level 389 Enter level: eclib-20250122/progs/out_no_ntl/nfhpmcurve.out000066400000000000000000000006201474421343600212550ustar00rootroot00000000000000Program nfhpmcurve. Using METHOD = 2 to find newforms MODULUS for linear algebra = 1073741789 Verbose output? How many primes for Hecke eigenvalues? Output newforms to file? (0/1) Enter first and last N: >>>Level 2002: 3 newform(s) found. Computing 3 curves... 1 [1,-1,0,-691,-27531] N = 2002 2 [1,-1,0,-26,52] N = 2002 3 [1,-1,1,17,19] N = 2002 All curves found successfully! Finished level 2002 eclib-20250122/progs/out_no_ntl/pcurve.out000066400000000000000000000001271474421343600204060ustar00rootroot00000000000000 N = 11 1 [0,-1,1,-10,-20] N = 11 [(4,1;1,3),1,1;1] Curve = [0,-1,1,-10,-20] N = 11 eclib-20250122/progs/out_no_ntl/point_search.out000066400000000000000000000021201474421343600215530ustar00rootroot00000000000000Input curve [0,0,1,-7,6] Rank of points found is 3 Generator 1 is [1:-1:1]; height 0.668205 Generator 2 is [-2:3:1]; height 1.36857 Generator 3 is [-14:25:8]; height 2.71736 Regulator = 0.417144 Points have been successfully saturated [[1,-1],[-2,3],[-7/4,25/8]] Input curve [0,1,1,-2,0] Rank of points found is 2 Generator 1 is [0:-1:1]; height 0.327001 Generator 2 is [-1:1:1]; height 0.686667 Regulator = 0.15246 Points have been successfully saturated [[0,-1],[-1,1]] Input curve [2/5,-1/45,1/1800,-7/810000,7/60750000] Searching on standard minimal model [0,1,1,-2,0] (points found will be transferred back at end) Transformation: [u,r,s,t] = [1,-5,-6,23] with scale factor 30 [-6:1:900] maps to [-1:1:1] on [0,1,1,-2,0], with height 0.686667 Rank of known points is 1 with regulator 0.686667 Rank of points found is 2 Generator 1 is [0:-1:1]; height 0.327001 --maps back to [-75:11:13500] on input curve Generator 2 is [-2:0:1]; height 0.920758 --maps back to [-42:7:5400] on input curve Regulator = 0.15246 Points have been successfully saturated [[-1/180,11/13500],[-7/900,7/5400]] eclib-20250122/progs/out_no_ntl/qexp.out000066400000000000000000000021541474421343600200610ustar00rootroot0000000000000050a: -1,1,0,2,-3,-4,-3,5,6,0,2,2,-3,-4,12,6,0,2,-13,12,11,-10,-9,15,2,... 50b: 1,-1,0,-2,-3,4,3,5,-6,0,2,-2,-3,4,-12,-6,0,2,13,12,-11,-10,9,15,-2,... 51a: 0,1,3,-4,-3,-1,-1,-1,9,6,2,-4,-3,-7,-6,-6,6,8,-4,12,2,-10,-6,0,-16,... 52a: 0,0,2,-2,-2,-1,6,-6,8,2,10,-6,-6,4,-2,6,-10,-2,10,10,2,-4,-6,-6,2,... 53a: -1,-3,0,-4,0,-3,-3,-5,7,-7,4,5,6,-2,-2,-1,-2,-8,-12,1,-4,-1,-1,-14,1,... 54a: -1,0,3,-1,-3,-4,0,2,-6,6,5,2,-6,-10,6,9,12,8,14,0,-7,8,-3,-18,-1,... 54b: 1,0,-3,-1,3,-4,0,2,6,-6,5,2,6,-10,-6,-9,-12,8,14,0,-7,8,3,18,-1,... 55a: 1,0,1,0,-1,2,6,-4,4,6,-8,-2,2,4,-12,-2,4,-10,-16,8,14,8,-4,10,10,... 56a: 0,0,2,-1,-4,2,-6,8,0,6,8,-2,2,-4,-8,6,0,-6,-4,-8,10,16,8,-6,-6,... 56b: 0,2,-4,1,0,0,-2,-2,8,2,4,-6,-2,8,-4,-10,6,4,-12,0,-14,-8,6,10,-2,... 57a: -2,-1,-3,-5,1,2,-1,-1,-4,-2,-6,0,0,-1,-9,10,-8,-1,8,-12,-11,16,12,-6,-10,... 57b: -2,1,1,3,-3,-6,3,-1,4,-10,2,8,-8,-1,3,-6,0,7,8,12,-11,0,4,10,-2,... 57c: 1,1,-2,0,0,6,-6,-1,4,2,8,-10,-2,-4,12,-6,-12,-2,-4,0,10,0,16,-2,10,... 58a: -1,-3,-3,-2,-1,3,-4,-8,0,-1,3,-8,-2,7,11,1,-4,4,-4,-2,-12,-7,0,-6,-6,... 58b: 1,-1,1,-2,-3,-1,8,0,4,-1,-3,8,2,-11,13,-11,0,-8,-12,2,4,15,4,-10,-2,... eclib-20250122/progs/out_no_ntl/quartic_points.out000066400000000000000000000021641474421343600221510ustar00rootroot00000000000000Verbose? Enter quartic coefficients a,b,c,d,e ? Limit on height? I = -26356388845395184406350565808061369918064, J = -352166609661875954997390187329873130323434589147579770870730368 Minimal model for Jacobian: [1,0,1,34318214642441646362435632562579908747,3184376895814127197244886284686214848599453811643486936756] Checking local solublity in R: Checking local solublity at primes [ 2 3 5 7 11 17 67 89 139 211 281 431 443 577 647 977 1613 3863 10567 11923 15361 73277 ]: Everywhere locally soluble. Searching for points on (-76507605796482039669,0,334447602052445326228,0,150542317465449993216) up to height 6 (x:y:z) = (-4:456379274456:5) Point = [2717410306797994865322390215100882986749083600480:31945036659247177505290259298595196252256878326866123825847:541269629646463252964269919701] height = 43.74623851 Curve = [1,0,1,34318214642441646362435632562579908747,3184376895814127197244886284686214848599453811643486936756] Point = [2717410306797994865322390215100882986749083600480:31945036659247177505290259298595196252256878326866123825847:541269629646463252964269919701] height = 43.74623851 Enter quartic coefficients a,b,c,d,e ? eclib-20250122/progs/out_no_ntl/reduce_cubics.out000066400000000000000000000012011474421343600216730ustar00rootroot00000000000000Enter cubic coeffs a, b, c, d: Input cubic = [123,234,345,456] Discriminant = -40491312264 Using Mathews reduction ... Mathews reduced cubic = [123,234,345,456] after transform by [1,0;0,1] Using JC/Julia reduction ... JC/Julia reduced cubic = [123,-135,246,222] after transform by [1,-1;0,1] Enter cubic coeffs a, b, c, d: Input cubic = [11276,-159331,750302,-1177513] Discriminant = -104060401000 Using Mathews reduction ... Mathews reduced cubic = [83,149,294,878] after transform by [-14,-23;-3,-5] Using JC/Julia reduction ... JC/Julia reduced cubic = [83,-100,245,650] after transform by [-14,-9;-3,-2] Enter cubic coeffs a, b, c, d: eclib-20250122/progs/out_no_ntl/reduce_quartics.out000066400000000000000000000017021474421343600222640ustar00rootroot00000000000000Computed 78519 primes, largest is 1000253 Extra primes in list: Enter quartic coefficients a,b,c,d,e ? Quartic is (-33,-2159,-52689,-568174,-2282844) I = 73947 J = 0 Bad primes: [ 2 3 157 ] Attempting to minimize the quartic. First partial minimization without assuming local solvability: p=2: minimal already p=3: minimal already p=157: minimal already Result has coefficients: (-33,-2159,-52689,-568174,-2282844) I = 73947 J = 0 Bad primes: [ 2 3 157 ] Now check local solvability: Everywhere locally soluble Final minimization of I, J: p=2: minimal already p=3: minimal already p=157: minimal already Result has coefficients: (-33,-2159,-52689,-568174,-2282844) I = 73947 J = 0 Bad primes: [ 2 3 157 ] transform = [1,0;0,1] / 1 Attempting to reduce the quartic. Finished reducing g, new coefficients: (-33,-47,255,434,132) I = 73947 J = 0 extra reducing transform = [-17,-18;1,1] total transform = [-17,-18;1,1] / 1 OK Enter quartic coefficients a,b,c,d,e ? eclib-20250122/progs/out_no_ntl/solve_conic.out000066400000000000000000000664771474421343600214310ustar00rootroot00000000000000Solving ax^2 + bxz + cz^2 = dy^2 Using method 4 Enter coefficients a b c d: -113922743 0 310146482690273725409 1 Solution: (x:y:z) = (6632499416:70647575606369:5679) Solution is correct! Solution: (x:y:z) = (6632499416:70647575606369:5679) Parametric solution: x = [6632499416,837303821112076122246270,26425848118343941811659972709016629276]*[u^2,uv,v^2] y = [70647575606369,8918732034082630564118638188,281480929858691034492171567319911251675821]*[u^2,uv,v^2] z = [5679,716931597253432612,22626823170468308838277461581301]*[u^2,uv,v^2] disc(qx) = 1240585930761094901636 = 4cd disc(qz) = -455690972 = 4ad resultant(qx,qz) = 141330952159512008877688307548 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 7 0 -4 -1 Solution: (x:y:z) = (0:2:1) Solution is correct! Solution: (x:y:z) = (0:2:1) Parametric solution: x = [0,-4,0]*[u^2,uv,v^2] y = [2,0,-14]*[u^2,uv,v^2] z = [1,0,7]*[u^2,uv,v^2] disc(qx) = 16 = 4cd disc(qz) = -28 = 4ad resultant(qx,qz) = 112 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -5 0 4 -1 Solution: (x:y:z) = (2:4:1) Solution is correct! Solution: (x:y:z) = (2:4:1) Parametric solution: x = [2,8,10]*[u^2,uv,v^2] y = [4,12,4]*[u^2,uv,v^2] z = [1,8,11]*[u^2,uv,v^2] disc(qx) = -16 = 4cd disc(qz) = 20 = 4ad resultant(qx,qz) = 80 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 61 0 -4 -3 Solution: (x:y:z) = (1:1:4) Solution is correct! Solution: (x:y:z) = (1:1:4) Parametric solution: x = [1,-32,244]*[u^2,uv,v^2] y = [1,0,-244]*[u^2,uv,v^2] z = [4,-122,976]*[u^2,uv,v^2] disc(qx) = 48 = 4cd disc(qz) = -732 = 4ad resultant(qx,qz) = 8784 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 8 0 1 1 Solution: (x:y:z) = (0:1:1) Solution is correct! Solution: (x:y:z) = (0:1:1) Parametric solution: x = [0,2,0]*[u^2,uv,v^2] y = [1,0,8]*[u^2,uv,v^2] z = [1,0,-8]*[u^2,uv,v^2] disc(qx) = 4 = 4cd disc(qz) = 32 = 4ad resultant(qx,qz) = -32 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -5 0 1 -1 Solution: (x:y:z) = (1:2:1) Solution is correct! Solution: (x:y:z) = (1:2:1) Parametric solution: x = [1,4,5]*[u^2,uv,v^2] y = [2,6,2]*[u^2,uv,v^2] z = [1,8,11]*[u^2,uv,v^2] disc(qx) = -4 = 4cd disc(qz) = 20 = 4ad resultant(qx,qz) = 20 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 525973 0 1 1 Solution: (x:y:z) = (0:1:1) Solution is correct! Solution: (x:y:z) = (0:1:1) Parametric solution: x = [0,2,0]*[u^2,uv,v^2] y = [1,0,525973]*[u^2,uv,v^2] z = [1,0,-525973]*[u^2,uv,v^2] disc(qx) = 4 = 4cd disc(qz) = 2103892 = 4ad resultant(qx,qz) = -2103892 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 22729 0 32 1 Solution: (x:y:z) = (1:173:15) Solution is correct! Solution: (x:y:z) = (1:173:15) Parametric solution: x = [1,346,29897]*[u^2,uv,v^2] y = [173,58898,5017173]*[u^2,uv,v^2] z = [15,4844,389557]*[u^2,uv,v^2] disc(qx) = 128 = 4cd disc(qz) = 90916 = 4ad resultant(qx,qz) = -2909312 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -4097 0 27 -5 Solution: (x:y:z) = (3:69:22) Solution is correct! Solution: (x:y:z) = (3:69:22) Parametric solution: x = [3,138,1632]*[u^2,uv,v^2] y = [69,2778,26358]*[u^2,uv,v^2] z = [22,1242,16598]*[u^2,uv,v^2] disc(qx) = -540 = 4cd disc(qz) = 81940 = 4ad resultant(qx,qz) = 11061900 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 21127 0 48 7 Solution: (x:y:z) = (1:55:1) Solution is correct! Solution: (x:y:z) = (1:55:1) Parametric solution: x = [1,110,2689]*[u^2,uv,v^2] y = [55,5954,179575]*[u^2,uv,v^2] z = [1,-660,-38989]*[u^2,uv,v^2] disc(qx) = 1344 = 4cd disc(qz) = 591556 = 4ad resultant(qx,qz) = -198762816 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 8779 0 17 3 Solution: (x:y:z) = (1:182:73) Solution is correct! Solution: (x:y:z) = (1:182:73) Parametric solution: x = [1,364,33073]*[u^2,uv,v^2] y = [182,63766,5586126]*[u^2,uv,v^2] z = [73,25480,2223031]*[u^2,uv,v^2] disc(qx) = 204 = 4cd disc(qz) = 105348 = 4ad resultant(qx,qz) = -5372748 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 15182006953 0 -40426 -1 Solution: (x:y:z) = (3:2723347:13669) Solution is correct! Solution: (x:y:z) = (3:2723347:13669) Parametric solution: x = [3,10893388,9888825163070]*[u^2,uv,v^2] y = [2723347,9889193565208,8977569638361942354]*[u^2,uv,v^2] z = [13669,49635722422,45060080115856346]*[u^2,uv,v^2] disc(qx) = 161704 = 4cd disc(qz) = -60728027812 = 4ad resultant(qx,qz) = 2454991252327912 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -4103 0 23 -2 Solution: (x:y:z) = (5:118:57) Solution is correct! Solution: (x:y:z) = (5:118:57) Parametric solution: x = [5,944,44566]*[u^2,uv,v^2] y = [118,21754,1001820]*[u^2,uv,v^2] z = [57,10856,516754]*[u^2,uv,v^2] disc(qx) = -184 = 4cd disc(qz) = 32824 = 4ad resultant(qx,qz) = 1509904 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -3140477 0 43 -1 Solution: (x:y:z) = (2:2771:337) Solution is correct! Solution: (x:y:z) = (2:2771:337) Parametric solution: x = [2,5542,3839242]*[u^2,uv,v^2] y = [2771,7663950,5299132934]*[u^2,uv,v^2] z = [337,936598,650744252]*[u^2,uv,v^2] disc(qx) = -172 = 4cd disc(qz) = 12561908 = 4ad resultant(qx,qz) = 540162044 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -239743087 0 78 -1 Solution: (x:y:z) = (1:4087:1691) Solution is correct! Solution: (x:y:z) = (1:4087:1691) Parametric solution: x = [1,8174,16703647]*[u^2,uv,v^2] y = [4087,33143342,67189033465]*[u^2,uv,v^2] z = [1691,13830408,28279010419]*[u^2,uv,v^2] disc(qx) = -312 = 4cd disc(qz) = 958972348 = 4ad resultant(qx,qz) = 74799843144 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -134593 0 56 -1 Solution: (x:y:z) = (3:1079:29) Solution is correct! Solution: (x:y:z) = (3:1079:29) Parametric solution: x = [3,2158,388099]*[u^2,uv,v^2] y = [1079,775078,139183447]*[u^2,uv,v^2] z = [29,21580,4009983]*[u^2,uv,v^2] disc(qx) = -224 = 4cd disc(qz) = 538372 = 4ad resultant(qx,qz) = 30148832 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -47287 0 8 -7 Solution: (x:y:z) = (3:245:26) Solution is correct! Solution: (x:y:z) = (3:245:26) Parametric solution: x = [3,490,20027]*[u^2,uv,v^2] y = [245,39878,1621165]*[u^2,uv,v^2] z = [26,5390,266616]*[u^2,uv,v^2] disc(qx) = -224 = 4cd disc(qz) = 1324036 = 4ad resultant(qx,qz) = 74146016 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -4431282451 0 4719 -7 Solution: (x:y:z) = (11:72611:10286) Solution is correct! Solution: (x:y:z) = (11:72611:10286) Parametric solution: x = [11,580888,7668886379]*[u^2,uv,v^2] y = [72611,3825616300,50389253797421]*[u^2,uv,v^2] z = [10286,543275502,7173540418954]*[u^2,uv,v^2] disc(qx) = -132132 = 4cd disc(qz) = 124075908628 = 4ad resultant(qx,qz) = 4098599489708724 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -336649 0 300 -1 Solution: (x:y:z) = (5:2695:62) Solution is correct! Solution: (x:y:z) = (5:2695:62) Parametric solution: x = [5,10780,5810480]*[u^2,uv,v^2] y = [2695,5802980,3123763720]*[u^2,uv,v^2] z = [62,134750,73210548]*[u^2,uv,v^2] disc(qx) = -1200 = 4cd disc(qz) = 1346596 = 4ad resultant(qx,qz) = 403978800 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 51018545 0 -412 -83 Solution: (x:y:z) = (17:14461:8827) Solution is correct! Solution: (x:y:z) = (17:14461:8827) Parametric solution: x = [17,260298,996395765]*[u^2,uv,v^2] y = [14461,221849578,850860092321]*[u^2,uv,v^2] z = [8827,135297116,518446996037]*[u^2,uv,v^2] disc(qx) = 136784 = 4cd disc(qz) = -16938156940 = 4ad resultant(qx,qz) = 579217214720240 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 134873197 0 1791 13 Solution: (x:y:z) = (31:143486:8779) Solution is correct! Solution: (x:y:z) = (31:143486:8779) Parametric solution: x = [31,8035216,520683032851]*[u^2,uv,v^2] y = [143486,37190630858,2409891948660938]*[u^2,uv,v^2] z = [8779,2275400988,147438479587025]*[u^2,uv,v^2] disc(qx) = 93132 = 4cd disc(qz) = 7013406244 = 4ad resultant(qx,qz) = -163293137579052 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 9400805511 0 2437 1 Solution: (x:y:z) = (2:259691:3499) Solution is correct! Solution: (x:y:z) = (2:259691:3499) Parametric solution: x = [2,519382,33719706522]*[u^2,uv,v^2] y = [259691,67430888418,4377245268877068]*[u^2,uv,v^2] z = [3499,908399118,58958911116030]*[u^2,uv,v^2] disc(qx) = 9748 = 4cd disc(qz) = 37603222044 = 4ad resultant(qx,qz) = -91639052121228 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 2607882701 0 -17205 -1 Solution: (x:y:z) = (2:55721:887) Solution is correct! Solution: (x:y:z) = (2:55721:887) Parametric solution: x = [2,111442,1552406318]*[u^2,uv,v^2] y = [55721,3120090676,43676470056059]*[u^2,uv,v^2] z = [887,49480248,690052247371]*[u^2,uv,v^2] disc(qx) = 68820 = 4cd disc(qz) = -10431530804 = 4ad resultant(qx,qz) = 179474487482820 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 153 0 -13 -1 Solution: (x:y:z) = (1:30:9) Solution is correct! Solution: (x:y:z) = (1:30:9) Parametric solution: x = [1,0,-13]*[u^2,uv,v^2] y = [30,234,390]*[u^2,uv,v^2] z = [9,60,117]*[u^2,uv,v^2] disc(qx) = 52 = 4cd disc(qz) = -612 = 4ad resultant(qx,qz) = 7956 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -15152 0 5 -3 Solution: (x:y:z) = (1:68:16) Solution is correct! Solution: (x:y:z) = (1:68:16) Parametric solution: x = [1,136,4639]*[u^2,uv,v^2] y = [68,9088,302532]*[u^2,uv,v^2] z = [16,2584,101488]*[u^2,uv,v^2] disc(qx) = -60 = 4cd disc(qz) = 181824 = 4ad resultant(qx,qz) = 2727360 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 4293 0 13 10 Solution: (x:y:z) = (1:135:117) Solution is correct! Solution: (x:y:z) = (1:135:117) Parametric solution: x = [1,270,18095]*[u^2,uv,v^2] y = [135,33408,2067255]*[u^2,uv,v^2] z = [117,28890,1783035]*[u^2,uv,v^2] disc(qx) = 520 = 4cd disc(qz) = 171720 = 4ad resultant(qx,qz) = -22323600 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 32432 0 -15 -7 Solution: (x:y:z) = (1:88:76) Solution is correct! Solution: (x:y:z) = (1:88:76) Parametric solution: x = [1,0,-105]*[u^2,uv,v^2] y = [88,2280,9240]*[u^2,uv,v^2] z = [76,1232,7980]*[u^2,uv,v^2] disc(qx) = 420 = 4cd disc(qz) = -908096 = 4ad resultant(qx,qz) = 95350080 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 7185786 0 -1465 -1 Solution: (x:y:z) = (28:179:1961) Solution is correct! Solution: (x:y:z) = (28:179:1961) Parametric solution: x = [28,-30430,8267670]*[u^2,uv,v^2] y = [179,10670,-58652035]*[u^2,uv,v^2] z = [1961,-2131174,579032555]*[u^2,uv,v^2] disc(qx) = 5860 = 4cd disc(qz) = -28743144 = 4ad resultant(qx,qz) = 42108705960 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 21328386 0 4537 1 Solution: (x:y:z) = (2:111187:1645) Solution is correct! Solution: (x:y:z) = (2:111187:1645) Parametric solution: x = [2,222374,6181272216]*[u^2,uv,v^2] y = [111187,12355085604,343223894585778]*[u^2,uv,v^2] z = [1645,182791428,5077918854858]*[u^2,uv,v^2] disc(qx) = 18148 = 4cd disc(qz) = 85313544 = 4ad resultant(qx,qz) = -387067549128 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -30940374 0 1871 -1 Solution: (x:y:z) = (10:54161:293) Solution is correct! Solution: (x:y:z) = (10:54161:293) Parametric solution: x = [10,324966,2640072716]*[u^2,uv,v^2] y = [54161,1759938712,14297114337062]*[u^2,uv,v^2] z = [293,9532336,77530124450]*[u^2,uv,v^2] disc(qx) = -7484 = 4cd disc(qz) = 123761496 = 4ad resultant(qx,qz) = 231557759016 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 29239123130 0 -165321 -1 Solution: (x:y:z) = (4:1332167:3683) Solution is correct! Solution: (x:y:z) = (4:1332167:3683) Parametric solution: x = [4,2664334,443667187642]*[u^2,uv,v^2] y = [1332167,887638896566,147861114890539577]*[u^2,uv,v^2] z = [3683,2453851614,408728472745513]*[u^2,uv,v^2] disc(qx) = 661284 = 4cd disc(qz) = -116956492520 = 4ad resultant(qx,qz) = 19335364299898920 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 86807326430 0 57649 1 Solution: (x:y:z) = (36:17911481:60113) Solution is correct! Solution: (x:y:z) = (36:17911481:60113) Parametric solution: x = [36,179114810,222792466396566]*[u^2,uv,v^2] y = [17911481,89116794034026,110847938522267219119]*[u^2,uv,v^2] z = [60113,299085909738,372017622658409387]*[u^2,uv,v^2] disc(qx) = 230596 = 4cd disc(qz) = 347229305720 = 4ad resultant(qx,qz) = -20017422245452280 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -17194283526 0 62471 -1 Solution: (x:y:z) = (142:17514733:25285) Solution is correct! Solution: (x:y:z) = (142:17514733:25285) Parametric solution: x = [142,2206856358,8574322156417736]*[u^2,uv,v^2] y = [17514733,272200681130732,1057584075190157670370]*[u^2,uv,v^2] z = [25285,392960549588,1526774703702137926]*[u^2,uv,v^2] disc(qx) = -249884 = 4cd disc(qz) = 68777134104 = 4ad resultant(qx,qz) = 4296576344610984 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 130017558910 0 31761 1 Solution: (x:y:z) = (8:3982759:15409) Solution is correct! Solution: (x:y:z) = (8:3982759:15409) Parametric solution: x = [8,7965518,1982796152540]*[u^2,uv,v^2] y = [3982759,3965469961708,987063994691016814]*[u^2,uv,v^2] z = [15409,15341587668,3818617555565894]*[u^2,uv,v^2] disc(qx) = 127044 = 4cd disc(qz) = 520070235640 = 4ad resultant(qx,qz) = -16517950754162040 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 188060224470 0 -31489 -1 Solution: (x:y:z) = (40:9268177:110831) Solution is correct! Solution: (x:y:z) = (40:9268177:110831) Parametric solution: x = [40,166827186,173945687428454]*[u^2,uv,v^2] y = [9268177,38654771704366,40304349374557883467]*[u^2,uv,v^2] z = [110831,462241059698,481965328453867241]*[u^2,uv,v^2] disc(qx) = 125956 = 4cd disc(qz) = -752240897880 = 4ad resultant(qx,qz) = 23687313633343320 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -2568561397757146 0 1015687 -1 Solution: (x:y:z) = (928:43406907117:17966105) Solution is correct! Solution: (x:y:z) = (928:43406907117:17966105) Parametric solution: x = [928,54779516781654,808403949038661694481422]*[u^2,uv,v^2] y = [43406907117,2562294608641058264066,37812839577435366501816592631511]*[u^2,uv,v^2] z = [17966105,1060532920727663418,15650722234273210852556256967]*[u^2,uv,v^2] disc(qx) = -4062748 = 4cd disc(qz) = 10274245591028584 = 4ad resultant(qx,qz) = 10435417681615049397208 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 6819 0 29 5 Solution: (x:y:z) = (1:332:137) Solution is correct! Solution: (x:y:z) = (1:332:137) Parametric solution: x = [1,664,110079]*[u^2,uv,v^2] y = [332,212502,34004436]*[u^2,uv,v^2] z = [137,87648,14018313]*[u^2,uv,v^2] disc(qx) = 580 = 4cd disc(qz) = 136380 = 4ad resultant(qx,qz) = -19775100 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 9987 0 -91 -1 Solution: (x:y:z) = (1:227:26) Solution is correct! Solution: (x:y:z) = (1:227:26) Parametric solution: x = [1,0,-91]*[u^2,uv,v^2] y = [227,4732,20657]*[u^2,uv,v^2] z = [26,454,2366]*[u^2,uv,v^2] disc(qx) = 364 = 4cd disc(qz) = -39948 = 4ad resultant(qx,qz) = 3635268 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -9476 0 319 -1 Solution: (x:y:z) = (2:173:5) Solution is correct! Solution: (x:y:z) = (2:173:5) Parametric solution: x = [2,346,15124]*[u^2,uv,v^2] y = [173,28334,1142665]*[u^2,uv,v^2] z = [5,1038,51977]*[u^2,uv,v^2] disc(qx) = -1276 = 4cd disc(qz) = 37904 = 4ad resultant(qx,qz) = 12091376 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -242324 0 61 -43 Solution: (x:y:z) = (2:113:83) Solution is correct! Solution: (x:y:z) = (2:113:83) Parametric solution: x = [2,226,7696]*[u^2,uv,v^2] y = [113,7706,565]*[u^2,uv,v^2] z = [83,14238,485063]*[u^2,uv,v^2] disc(qx) = -10492 = 4cd disc(qz) = 41679728 = 4ad resultant(qx,qz) = 109325926544 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 132963927 0 -1145 -2 Solution: (x:y:z) = (1:4183:383) Solution is correct! Solution: (x:y:z) = (1:4183:383) Parametric solution: x = [1,0,-2290]*[u^2,uv,v^2] y = [4183,877070,9579070]*[u^2,uv,v^2] z = [383,16732,877070]*[u^2,uv,v^2] disc(qx) = 9160 = 4cd disc(qz) = -1063711416 = 4ad resultant(qx,qz) = 2435899142640 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 7 0 2 1 Solution: (x:y:z) = (1:3:1) Solution is correct! Solution: (x:y:z) = (1:3:1) Parametric solution: x = [1,6,7]*[u^2,uv,v^2] y = [3,14,21]*[u^2,uv,v^2] z = [1,0,-7]*[u^2,uv,v^2] disc(qx) = 8 = 4cd disc(qz) = 28 = 4ad resultant(qx,qz) = -56 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 5 0 -83 2 Solution: (x:y:z) = (7:9:1) Solution is correct! Solution: (x:y:z) = (7:9:1) Parametric solution: x = [7,36,70]*[u^2,uv,v^2] y = [9,70,90]*[u^2,uv,v^2] z = [1,0,-10]*[u^2,uv,v^2] disc(qx) = -664 = 4cd disc(qz) = 40 = 4ad resultant(qx,qz) = 6640 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 257 0 -116044 1 Solution: (x:y:z) = (85:11:4) Solution is correct! Solution: (x:y:z) = (85:11:4) Parametric solution: x = [85,-82742,20137361]*[u^2,uv,v^2] y = [11,214,-2710169]*[u^2,uv,v^2] z = [4,-3894,947638]*[u^2,uv,v^2] disc(qx) = -464176 = 4cd disc(qz) = 1028 = 4ad resultant(qx,qz) = 119293232 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 1027986085027861747937 0 722974121783 604305613931 Solution: (x:y:z) = (171311893342:7402533838782499:2018398374852981) Solution is correct! Solution: (x:y:z) = (171311893342:7402533838782499:2018398374852981) Parametric solution: x = [171311893342,2010117937494774948517315634,5896517229209259273774341786566912927034598]*[u^2,uv,v^2] y = [7402533838782499,86858920078263347398188000098360,254793566685099590042491875352393376532792008429]*[u^2,uv,v^2] z = [2018398374852981,23683228870762677156565927669748,69472822701041623149476476182622950258251362709]*[u^2,uv,v^2] disc(qx) = 1747589282081205501435892 = 4cd disc(qz) = 2484871048901148643309038230841388 = 4ad resultant(qx,qz) = -1085633503103382611516316228062412935649076964148325574524 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 21458238196506826611317 0 155590763477 429392673713 Solution: (x:y:z) = (195924828285:57363880008362257:61540493626424234) Solution is correct! Solution: (x:y:z) = (195924828285:57363880008362257:61540493626424234) Parametric solution: x = [195924828285,2145280581885379595193169688,5872442016792135409459129921769285835917671]*[u^2,uv,v^2] y = [57363880008362257,628106294443357445996190963797188,1719363809865435325426625130926352481483793500685]*[u^2,uv,v^2] z = [61540493626424234,673838160952041003544277567799686,1844549175667748953847496454031950661610608575242]*[u^2,uv,v^2] disc(qx) = 267238135737744073520404 = 4cd disc(qz) = 36856041089473957501961224216840084 = 4ad resultant(qx,qz) = -2462334927856178605269320611019391015762951921790644768484 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 293911884200387681576093 0 106205605559 687223946819 Solution: (x:y:z) = (23840892990:54824084629796371:133700736855785209) Solution is correct! Solution: (x:y:z) = (23840892990:54824084629796371:133700736855785209) Parametric solution: x = [23840892990,257854110770079285408328222,697213213331782985887885426456233671379650]*[u^2,uv,v^2] y = [54824084629796371,592956631151746394411322223236130,1603298845758285007862010568052580920857024251572]*[u^2,uv,v^2] z = [133700736855785209,1446056765814659443319843363200930,3910001207049952259367656820325232372843306383962]*[u^2,uv,v^2] disc(qx) = 291948141706231627067284 = 4cd disc(qz) = 807933140308797241690526567735192668 = 4ad resultant(qx,qz) = -58968644734008364224834765146537500431921600165901384868428 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 206207486824798778186641 0 769034410087 80703111317 Solution: (x:y:z) = (25472865203:55836550914326161:12377002765101082) Solution is correct! Solution: (x:y:z) = (25472865203:55836550914326161:12377002765101082) Parametric solution: x = [25472865203,2076178487649254090497454584,42304988840339445343515873913409503516614895]*[u^2,uv,v^2] y = [55836550914326161,4550985721826192070758237216624452,92732586008244371371661349355055269020223310542763]*[u^2,uv,v^2] z = [12377002765101082,1008793737088194157229386470804738,20555558225652004372148847014220148014677041760902]*[u^2,uv,v^2] disc(qx) = 248253878415418354618316 = 4cd disc(qz) = 66566343054482186688488320101264788 = 4ad resultant(qx,qz) = -4131338208801612207997140177843018188754934920213147664252 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 79 0 -8 -1 Solution: (x:y:z) = (1:7:4) Solution is correct! Solution: (x:y:z) = (1:7:4) Parametric solution: x = [1,0,-8]*[u^2,uv,v^2] y = [7,64,56]*[u^2,uv,v^2] z = [4,14,32]*[u^2,uv,v^2] disc(qx) = 32 = 4cd disc(qz) = -316 = 4ad resultant(qx,qz) = 2528 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 125965 0 -134 -1 Solution: (x:y:z) = (1:53:31) Solution is correct! Solution: (x:y:z) = (1:53:31) Parametric solution: x = [1,-106,2675]*[u^2,uv,v^2] y = [53,2690,-284345]*[u^2,uv,v^2] z = [31,-3180,85615]*[u^2,uv,v^2] disc(qx) = 536 = 4cd disc(qz) = -503860 = 4ad resultant(qx,qz) = 67517240 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -163184 0 223 -1 Solution: (x:y:z) = (2:767:17) Solution is correct! Solution: (x:y:z) = (2:767:17) Parametric solution: x = [2,1534,294256]*[u^2,uv,v^2] y = [767,584498,111307807]*[u^2,uv,v^2] z = [17,13806,2793425]*[u^2,uv,v^2] disc(qx) = -892 = 4cd disc(qz) = 652736 = 4ad resultant(qx,qz) = 145560128 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -1115479181 0 2065 -61 Solution: (x:y:z) = (193:350542:128419) Solution is correct! Solution: (x:y:z) = (193:350542:128419) Parametric solution: x = [193,4907588,31197435857]*[u^2,uv,v^2] y = [350542,8910804882,56628331577398]*[u^2,uv,v^2] z = [128419,3265649272,20761072924445]*[u^2,uv,v^2] disc(qx) = -503860 = 4cd disc(qz) = 272176920164 = 4ad resultant(qx,qz) = 34284765748458260 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 88727009405 0 -50601 -1 Solution: (x:y:z) = (67:13528438:107183) Solution is correct! Solution: (x:y:z) = (67:13528438:107183) Parametric solution: x = [67,108227504,43705942618909]*[u^2,uv,v^2] y = [13528438,21853133207354,8825102923197774598]*[u^2,uv,v^2] z = [107183,173136949524,69918744788891503]*[u^2,uv,v^2] disc(qx) = 202404 = 4cd disc(qz) = -354908037620 = 4ad resultant(qx,qz) = 17958701611609620 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 263422353799 0 -497480 -1 Solution: (x:y:z) = (7:11875043:17590) Solution is correct! Solution: (x:y:z) = (7:11875043:17590) Parametric solution: x = [7,23750086,20145235107767]*[u^2,uv,v^2] y = [11875043,40292970550014,34179317818472448803]*[u^2,uv,v^2] z = [17590,59683966118,50627854073738792]*[u^2,uv,v^2] disc(qx) = 1989920 = 4cd disc(qz) = -1053689415196 = 4ad resultant(qx,qz) = 524189410271706080 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 62063469603854588654579 0 68044230041 1 Solution: (x:y:z) = (30740:11344956855892619:32088063161) Solution is correct! Solution: (x:y:z) = (30740:11344956855892619:32088063161) Parametric solution: x = [30740,185172385801879327318,278861519710149973050991236497202376]*[u^2,uv,v^2] y = [11344956855892619,68340036689167845457583539158036,102917108324017159669476036949895222133813471677]*[u^2,uv,v^2] z = [32088063161,193292882605196512607887604,291090632974354925439361272040802233485625]*[u^2,uv,v^2] disc(qx) = 272176920164 = 4cd disc(qz) = 248253878415418354618316 = 4ad resultant(qx,qz) = -16892244011469171082902408656030956 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 1 0 7535987 13 Solution: (x:y:z) = (4735:1518:1) Solution is correct! Solution: (x:y:z) = (4735:1518:1) Parametric solution: x = [4735,39468,61555]*[u^2,uv,v^2] y = [1518,9470,19734]*[u^2,uv,v^2] z = [1,0,-13]*[u^2,uv,v^2] disc(qx) = 391871324 = 4cd disc(qz) = 52 = 4ad resultant(qx,qz) = -5094327212 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 19 0 4776762553 6836 Solution: (x:y:z) = (1267471:67699:13) Solution is correct! Solution: (x:y:z) = (1267471:67699:13) Parametric solution: x = [1267471,105679222184,2202831045207236]*[u^2,uv,v^2] y = [67699,5644510578,117654987622372]*[u^2,uv,v^2] z = [13,1083184,22563212660]*[u^2,uv,v^2] disc(qx) = 130615795249232 = 4cd disc(qz) = 519536 = 4ad resultant(qx,qz) = -16964901950151249088 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 1 0 52753834808 23209 Solution: (x:y:z) = (5849111:40721:9) Solution is correct! Solution: (x:y:z) = (5849111:40721:9) Parametric solution: x = [5849111,53139276160,120692604968248]*[u^2,uv,v^2] y = [40721,369788656,839516840952]*[u^2,uv,v^2] z = [9,81442,184241848]*[u^2,uv,v^2] disc(qx) = 4897455008235488 = 4cd disc(qz) = 92836 = 4ad resultant(qx,qz) = -113665033286137440992 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 555143 0 1 193 Solution: (x:y:z) = (3:176:991) Solution is correct! Solution: (x:y:z) = (3:176:991) Parametric solution: x = [3,352,10261]*[u^2,uv,v^2] y = [176,19990,570768]*[u^2,uv,v^2] z = [991,93632,2103527]*[u^2,uv,v^2] disc(qx) = 772 = 4cd disc(qz) = 428570396 = 4ad resultant(qx,qz) = -82714086428 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 1 0 316 5 Solution: (x:y:z) = (2:8:1) Solution is correct! Solution: (x:y:z) = (2:8:1) Parametric solution: x = [2,80,10]*[u^2,uv,v^2] y = [8,4,40]*[u^2,uv,v^2] z = [1,0,-5]*[u^2,uv,v^2] disc(qx) = 6320 = 4cd disc(qz) = 20 = 4ad resultant(qx,qz) = -31600 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 388 0 152441 1 Solution: (x:y:z) = (143:4206:8) Solution is correct! Solution: (x:y:z) = (143:4206:8) Parametric solution: x = [143,151416,40080761]*[u^2,uv,v^2] y = [4206,4436480,1169911518]*[u^2,uv,v^2] z = [8,8412,2211256]*[u^2,uv,v^2] disc(qx) = 609764 = 4cd disc(qz) = 1552 = 4ad resultant(qx,qz) = -236588432 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 831 0 1 92742160 Solution: (x:y:z) = (309:2:17077) Solution is correct! Solution: (x:y:z) = (309:2:17077) Parametric solution: x = [309,18004,-37884]*[u^2,uv,v^2] y = [2,6,420]*[u^2,uv,v^2] z = [17077,-205548,-3894492]*[u^2,uv,v^2] disc(qx) = 370968640 = 4cd disc(qz) = 308274939840 = 4ad resultant(qx,qz) = -28590083794631654400 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 1 0 29526647 489 Solution: (x:y:z) = (8597:1057:4) Solution is correct! Solution: (x:y:z) = (8597:1057:4) Parametric solution: x = [8597,13888980,5607944961]*[u^2,uv,v^2] y = [1057,1680172,667714299]*[u^2,uv,v^2] z = [4,6342,2513688]*[u^2,uv,v^2] disc(qx) = 57754121532 = 4cd disc(qz) = 1956 = 4ad resultant(qx,qz) = -28241765429148 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 7 0 4715959977 21016 Solution: (x:y:z) = (227529:6663:11) Solution is correct! Solution: (x:y:z) = (227529:6663:11) Parametric solution: x = [227529,301100970,99180051417]*[u^2,uv,v^2] y = [6663,8361504,2628200361]*[u^2,uv,v^2] z = [11,13326,4022587]*[u^2,uv,v^2] disc(qx) = 396442459506528 = 4cd disc(qz) = 588448 = 4ad resultant(qx,qz) = -58321443102924347136 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 0 0 0 0 eclib-20250122/progs/out_no_ntl/solve_legendre.out000066400000000000000000000471341474421343600221100ustar00rootroot00000000000000Solving ax^2 + by^2 + cz^2 = 0 Using method 4 Enter coefficients a b c: -113922743 310146482690273725409 -1 Solution: (x:y:z) = (11931641701:7244:7523107023591) --OK x = [11931641701,-4873846170,-25495895384] * [u^2,uv,v^2] y = [7244,-1698,15826] * [u^2,uv,v^2] z = [7523107023591,373522427721722,-60212759924226] * [u^2,uv,v^2] Disc(qx) = 1240585930761094901636 Disc(qy) = -455690972 Disc(qz) = 141330952159512008877688307548 Parametric solution is OK Enter coefficients a b c: 7 -4 1 Solution: (x:y:z) = (0:1:2) --OK x = [0,4,0] * [u^2,uv,v^2] y = [1,0,7] * [u^2,uv,v^2] z = [-2,0,14] * [u^2,uv,v^2] Disc(qx) = 16 Disc(qy) = -28 Disc(qz) = 112 Parametric solution is OK Enter coefficients a b c: -5 4 1 Solution: (x:y:z) = (1:1:1) --OK x = [1,0,4] * [u^2,uv,v^2] y = [-1,-2,4] * [u^2,uv,v^2] z = [-1,8,4] * [u^2,uv,v^2] Disc(qx) = -16 Disc(qy) = 20 Disc(qz) = 80 Parametric solution is OK Enter coefficients a b c: 61 -4 3 Solution: (x:y:z) = (1:4:1) --OK x = [-3,0,4] * [u^2,uv,v^2] y = [12,6,16] * [u^2,uv,v^2] z = [-3,-32,-4] * [u^2,uv,v^2] Disc(qx) = 48 Disc(qy) = -732 Disc(qz) = 976 Parametric solution is OK Enter coefficients a b c: 8 1 -1 Solution: (x:y:z) = (0:1:1) --OK x = [0,-2,0] * [u^2,uv,v^2] y = [1,0,-8] * [u^2,uv,v^2] z = [1,0,8] * [u^2,uv,v^2] Disc(qx) = 4 Disc(qy) = 32 Disc(qz) = -32 Parametric solution is OK Enter coefficients a b c: -5 1 1 Solution: (x:y:z) = (1:2:1) --OK x = [1,0,1] * [u^2,uv,v^2] y = [2,2,-2] * [u^2,uv,v^2] z = [1,-4,-1] * [u^2,uv,v^2] Disc(qx) = -4 Disc(qy) = 20 Disc(qz) = 20 Parametric solution is OK Enter coefficients a b c: 525973 1 -1 Solution: (x:y:z) = (0:1:1) --OK x = [0,-2,0] * [u^2,uv,v^2] y = [1,0,-525973] * [u^2,uv,v^2] z = [1,0,525973] * [u^2,uv,v^2] Disc(qx) = 4 Disc(qy) = 2103892 Disc(qz) = -2103892 Parametric solution is OK Enter coefficients a b c: 22729 32 -1 Solution: (x:y:z) = (1:15:173) --OK x = [1,-6,-23] * [u^2,uv,v^2] y = [15,256,-423] * [u^2,uv,v^2] z = [173,-78,4213] * [u^2,uv,v^2] Disc(qx) = 128 Disc(qy) = 90916 Disc(qz) = -2909312 Parametric solution is OK Enter coefficients a b c: -4097 27 5 Solution: (x:y:z) = (3:22:69) --OK x = [9,0,15] * [u^2,uv,v^2] y = [66,230,-110] * [u^2,uv,v^2] z = [207,-396,-345] * [u^2,uv,v^2] Disc(qx) = -540 Disc(qy) = 81940 Disc(qz) = 442476 Parametric solution is OK Enter coefficients a b c: 21127 48 -7 Solution: (x:y:z) = (1:1:55) --OK x = [7,0,-48] * [u^2,uv,v^2] y = [7,770,48] * [u^2,uv,v^2] z = [385,96,2640] * [u^2,uv,v^2] Disc(qx) = 1344 Disc(qy) = 591556 Disc(qz) = -4056384 Parametric solution is OK Enter coefficients a b c: 8779 17 -12 Solution: (x:y:z) = (5:67:157) --OK x = [-1,28,8] * [u^2,uv,v^2] y = [-73,-140,1376] * [u^2,uv,v^2] z = [91,-66,1652] * [u^2,uv,v^2] Disc(qx) = 816 Disc(qy) = 421392 Disc(qz) = -596972 Parametric solution is OK Enter coefficients a b c: 15182006953 -40426 9 Solution: (x:y:z) = (9:41007:2723347) --OK x = [-9,1194,825] * [u^2,uv,v^2] y = [41007,6432,3332319] * [u^2,uv,v^2] z = [-2723347,-7091294,220749027] * [u^2,uv,v^2] Disc(qx) = 1455336 Disc(qy) = -546552250308 Disc(qz) = 2454991252327912 Parametric solution is OK Enter coefficients a b c: -4103 23 8 Solution: (x:y:z) = (5:57:59) --OK x = [11,10,19] * [u^2,uv,v^2] y = [55,-286,-225] * [u^2,uv,v^2] z = [-231,-440,199] * [u^2,uv,v^2] Disc(qx) = -736 Disc(qy) = 131296 Disc(qz) = 377476 Parametric solution is OK Enter coefficients a b c: -3140477 43 25 Solution: (x:y:z) = (10:1685:2771) --OK x = [10,-10,110] * [u^2,uv,v^2] y = [-1685,-12170,24620] * [u^2,uv,v^2] z = [-2771,17262,21850] * [u^2,uv,v^2] Disc(qx) = -4300 Disc(qy) = 314047700 Disc(qz) = 540162044 Parametric solution is OK Enter coefficients a b c: -239743087 78 25 Solution: (x:y:z) = (1:1623:1171) --OK x = [25,0,78] * [u^2,uv,v^2] y = [-40575,-58550,126594] * [u^2,uv,v^2] z = [-29275,253188,91338] * [u^2,uv,v^2] Disc(qx) = -7800 Disc(qy) = 23974308700 Disc(qz) = 74799843144 Parametric solution is OK Enter coefficients a b c: -134593 56 1 Solution: (x:y:z) = (3:136:419) --OK x = [3,2,19] * [u^2,uv,v^2] y = [-136,-370,738] * [u^2,uv,v^2] z = [-419,4798,4253] * [u^2,uv,v^2] Disc(qx) = -224 Disc(qy) = 538372 Disc(qz) = 30148832 Parametric solution is OK Enter coefficients a b c: -47287 8 7 Solution: (x:y:z) = (3:26:245) --OK x = [5,4,12] * [u^2,uv,v^2] y = [384,254,-820] * [u^2,uv,v^2] z = [-19,-1244,-452] * [u^2,uv,v^2] Disc(qx) = -224 Disc(qy) = 1324036 Disc(qz) = 1513184 Parametric solution is OK Enter coefficients a b c: -4431282451 4719 7 Solution: (x:y:z) = (11:10286:72611) --OK x = [77,0,429] * [u^2,uv,v^2] y = [-72002,-92414,401154] * [u^2,uv,v^2] z = [-508277,8825388,2831829] * [u^2,uv,v^2] Disc(qx) = -132132 Disc(qy) = 124075908628 Disc(qz) = 83644887545076 Parametric solution is OK Enter coefficients a b c: -336649 300 1 Solution: (x:y:z) = (5:62:2695) --OK x = [5,0,60] * [u^2,uv,v^2] y = [-62,-1078,744] * [u^2,uv,v^2] z = [-2695,7440,32340] * [u^2,uv,v^2] Disc(qx) = -1200 Disc(qy) = 1346596 Disc(qz) = 403978800 Parametric solution is OK Enter coefficients a b c: 51018545 -412 83 Solution: (x:y:z) = (17:8827:14461) --OK x = [140,-128,-215] * [u^2,uv,v^2] y = [54140,9810,78659] * [u^2,uv,v^2] z = [50020,272920,-47947] * [u^2,uv,v^2] Disc(qx) = 136784 Disc(qy) = -16938156940 Disc(qz) = 84078562160 Parametric solution is OK Enter coefficients a b c: 134873197 1791 -13 Solution: (x:y:z) = (9:964:31119) --OK x = [117,-156,-147] * [u^2,uv,v^2] y = [12532,73190,-33048] * [u^2,uv,v^2] z = [404547,-155724,612093] * [u^2,uv,v^2] Disc(qx) = 93132 Disc(qy) = 7013406244 Disc(qz) = -966231583308 Parametric solution is OK Enter coefficients a b c: 9400805511 2437 -4 Solution: (x:y:z) = (4:6998:259691) --OK x = [4,-132,-1348] * [u^2,uv,v^2] y = [6998,288448,-2401066] * [u^2,uv,v^2] z = [259691,-42740,88221077] * [u^2,uv,v^2] Disc(qx) = 38992 Disc(qy) = 150412888176 Disc(qz) = -91639052121228 Parametric solution is OK Enter coefficients a b c: 2607882701 -17205 4 Solution: (x:y:z) = (4:1774:55721) --OK x = [-4,252,13236] * [u^2,uv,v^2] y = [1774,-320,5880246] * [u^2,uv,v^2] z = [-55721,-11750412,185757189] * [u^2,uv,v^2] Disc(qx) = 275280 Disc(qy) = -41726123216 Disc(qz) = 179474487482820 Parametric solution is OK Enter coefficients a b c: 153 -13 1 Solution: (x:y:z) = (1:9:30) --OK x = [-1,6,4] * [u^2,uv,v^2] y = [9,6,18] * [u^2,uv,v^2] z = [-30,-54,42] * [u^2,uv,v^2] Disc(qx) = 52 Disc(qy) = -612 Disc(qz) = 7956 Parametric solution is OK Enter coefficients a b c: -15152 5 3 Solution: (x:y:z) = (1:16:68) --OK x = [3,0,5] * [u^2,uv,v^2] y = [-48,-408,80] * [u^2,uv,v^2] z = [-204,160,340] * [u^2,uv,v^2] Disc(qx) = -60 Disc(qy) = 181824 Disc(qz) = 303040 Parametric solution is OK Enter coefficients a b c: 4293 13 -10 Solution: (x:y:z) = (1:3:21) --OK x = [10,0,-13] * [u^2,uv,v^2] y = [30,420,39] * [u^2,uv,v^2] z = [210,78,273] * [u^2,uv,v^2] Disc(qx) = 520 Disc(qy) = 171720 Disc(qz) = -223236 Parametric solution is OK Enter coefficients a b c: 32432 -15 7 Solution: (x:y:z) = (2:93:1) --OK x = [4,-22,4] * [u^2,uv,v^2] y = [508,-372,515] * [u^2,uv,v^2] z = [692,4,-703] * [u^2,uv,v^2] Disc(qx) = 420 Disc(qy) = -908096 Disc(qz) = 1945920 Parametric solution is OK Enter coefficients a b c: 7185786 -1465 1 Solution: (x:y:z) = (28:1961:179) --OK x = [-28,22,48] * [u^2,uv,v^2] y = [1961,-1528,3962] * [u^2,uv,v^2] z = [-179,-205064,80254] * [u^2,uv,v^2] Disc(qx) = 5860 Disc(qy) = -28743144 Disc(qz) = 42108705960 Parametric solution is OK Enter coefficients a b c: 21328386 4537 -1 Solution: (x:y:z) = (2:1645:111187) --OK x = [2,-134,-24] * [u^2,uv,v^2] y = [1645,972,-12822] * [u^2,uv,v^2] z = [111187,13836,870738] * [u^2,uv,v^2] Disc(qx) = 18148 Disc(qy) = 85313544 Disc(qz) = -387067549128 Parametric solution is OK Enter coefficients a b c: -30940374 1871 1 Solution: (x:y:z) = (10:293:54161) --OK x = [10,6,188] * [u^2,uv,v^2] y = [-293,-11008,2206] * [u^2,uv,v^2] z = [-54161,77144,1041370] * [u^2,uv,v^2] Disc(qx) = -7484 Disc(qy) = 123761496 Disc(qz) = 231557759016 Parametric solution is OK Enter coefficients a b c: 29239123130 -165321 1 Solution: (x:y:z) = (4:3683:1332167) --OK x = [-4,722,8750] * [u^2,uv,v^2] y = [3683,1302,7939057] * [u^2,uv,v^2] z = [-1332167,-63982478,2860303327] * [u^2,uv,v^2] Disc(qx) = 661284 Disc(qy) = -116956492520 Disc(qz) = 19335364299898920 Parametric solution is OK Enter coefficients a b c: 86807326430 57649 -1 Solution: (x:y:z) = (36:60113:17911481) --OK x = [36,-410,-434] * [u^2,uv,v^2] y = [60113,310462,-1043213] * [u^2,uv,v^2] z = [17911481,-11466626,281228919] * [u^2,uv,v^2] Disc(qx) = 230596 Disc(qy) = 347229305720 Disc(qz) = -20017422245452280 Parametric solution is OK Enter coefficients a b c: -17194283526 62471 1 Solution: (x:y:z) = (142:25285:17514733) --OK x = [142,-6,440] * [u^2,uv,v^2] y = [-25285,-245618,83537] * [u^2,uv,v^2] z = [-17514733,22987654,53785349] * [u^2,uv,v^2] Disc(qx) = -249884 Disc(qy) = 68777134104 Disc(qz) = 4296576344610984 Parametric solution is OK Enter coefficients a b c: 130017558910 31761 -1 Solution: (x:y:z) = (8:15409:3982759) --OK x = [8,-238,-2200] * [u^2,uv,v^2] y = [15409,537272,-3754446] * [u^2,uv,v^2] z = [3982759,3864232,1037778274] * [u^2,uv,v^2] Disc(qx) = 127044 Disc(qy) = 520070235640 Disc(qz) = -16517950754162040 Parametric solution is OK Enter coefficients a b c: 188060224470 -31489 1 Solution: (x:y:z) = (6:145223:25638331) --OK x = [-6,358,-92] * [u^2,uv,v^2] y = [145223,-118862,1319297] * [u^2,uv,v^2] z = [-25638331,5444734,230686511] * [u^2,uv,v^2] Disc(qx) = 125956 Disc(qy) = -752240897880 Disc(qz) = 23687313633343320 Parametric solution is OK Enter coefficients a b c: -2568561397757146 1015687 9 Solution: (x:y:z) = (2568:128318463:4885038233) --OK x = [2568,594,3594] * [u^2,uv,v^2] y = [-128318463,-63922062,172193031] * [u^2,uv,v^2] z = [-4885038233,100374251070,18445475069] * [u^2,uv,v^2] Disc(qx) = -36564732 Disc(qy) = 92468210319257256 Disc(qz) = 10435417681615049397208 Parametric solution is OK Enter coefficients a b c: 6819 29 -5 Solution: (x:y:z) = (3:61:184) --OK x = [-8,-6,17] * [u^2,uv,v^2] y = [26,-358,-79] * [u^2,uv,v^2] z = [302,38,656] * [u^2,uv,v^2] Disc(qx) = 580 Disc(qy) = 136380 Disc(qz) = -791004 Parametric solution is OK Enter coefficients a b c: 9987 -91 1 Solution: (x:y:z) = (1:26:227) --OK x = [-1,18,10] * [u^2,uv,v^2] y = [26,-14,386] * [u^2,uv,v^2] z = [-227,-646,3544] * [u^2,uv,v^2] Disc(qx) = 364 Disc(qy) = -39948 Disc(qz) = 3635268 Parametric solution is OK Enter coefficients a b c: -9476 319 1 Solution: (x:y:z) = (2:5:173) --OK x = [2,-2,160] * [u^2,uv,v^2] y = [-5,-168,484] * [u^2,uv,v^2] z = [-173,1768,12956] * [u^2,uv,v^2] Disc(qx) = -1276 Disc(qy) = 37904 Disc(qz) = 12091376 Parametric solution is OK Enter coefficients a b c: -242324 61 43 Solution: (x:y:z) = (13:514:760) --OK x = [8,-6,329] * [u^2,uv,v^2] y = [-332,5108,11738] * [u^2,uv,v^2] z = [452,4724,-20360] * [u^2,uv,v^2] Disc(qx) = -10492 Disc(qy) = 41679728 Disc(qz) = 59127056 Parametric solution is OK Enter coefficients a b c: 132963927 -1145 2 Solution: (x:y:z) = (1:383:4183) --OK x = [-2,44,903] * [u^2,uv,v^2] y = [766,-120,347169] * [u^2,uv,v^2] z = [-8366,-693018,3845949] * [u^2,uv,v^2] Disc(qx) = 9160 Disc(qy) = -1063711416 Disc(qz) = 608974785660 Parametric solution is OK Enter coefficients a b c: 7 2 -1 Solution: (x:y:z) = (1:1:3) --OK x = [1,-2,-1] * [u^2,uv,v^2] y = [1,4,-3] * [u^2,uv,v^2] z = [3,-2,5] * [u^2,uv,v^2] Disc(qx) = 8 Disc(qy) = 28 Disc(qz) = -56 Parametric solution is OK Enter coefficients a b c: 5 -83 -2 Solution: (x:y:z) = (7:1:9) --OK x = [13,8,14] * [u^2,uv,v^2] y = [-3,-4,2] * [u^2,uv,v^2] z = [-7,34,18] * [u^2,uv,v^2] Disc(qx) = -664 Disc(qy) = 40 Disc(qz) = 1660 Parametric solution is OK Enter coefficients a b c: 257 -116044 -1 Solution: (x:y:z) = (85:4:11) --OK x = [85,-48,1372] * [u^2,uv,v^2] y = [4,-2,-64] * [u^2,uv,v^2] z = [11,-10928,2908] * [u^2,uv,v^2] Disc(qx) = -464176 Disc(qy) = 1028 Disc(qz) = 119293232 Parametric solution is OK Enter coefficients a b c: 1027986085027861747937 722974121783 -604305613931 Solution: (x:y:z) = (96169054998:8355012676083151:9962270515504999) --OK x = [-171311893342,-398643135954,2318392642282] * [u^2,uv,v^2] y = [2018398374852981,-47528310472702492,-27983914786891851] * [u^2,uv,v^2] z = [7402533838782499,189535693811400,100400259446190829] * [u^2,uv,v^2] Disc(qx) = 1747589282081205501435892 Disc(qy) = 2484871048901148643309038230841388 Disc(qz) = -2972829348112650849204367548046684 Parametric solution is OK Enter coefficients a b c: 21458238196506826611317 155590763477 -429392673713 Solution: (x:y:z) = (133174840374:12323039517012895:30681131636462597) --OK x = [-120839066706,-69074898358,543008981510] * [u^2,uv,v^2] y = [-3653109691455587,-194702538229996066,-72064445956284564] * [u^2,uv,v^2] z = [27102622202551825,24899986468074458,128906567389794722] * [u^2,uv,v^2] Disc(qx) = 267238135737744073520404 Disc(qy) = 36856041089473957501961224216840084 Disc(qz) = -13354814655463282827589091033876836 Parametric solution is OK Enter coefficients a b c: 293911884200387681576093 106205605559 -687223946819 Solution: (x:y:z) = (23840892990:133700736855785209:54824084629796371) --OK x = [-120543758034,-289421995022,431758255050] * [u^2,uv,v^2] y = [201353504898388438,-790335940111425618,-227587597953023497] * [u^2,uv,v^2] z = [111714818825405396,-86582800060098558,296193784378457843] * [u^2,uv,v^2] Disc(qx) = 291948141706231627067284 Disc(qy) = 807933140308797241690526567735192668 Disc(qz) = -124860358569955432897412098409203948 Parametric solution is OK Enter coefficients a b c: 206207486824798778186641 769034410087 -80703111317 Solution: (x:y:z) = (165865026463:38107219971077702:290056531374297691) --OK x = [25472865203,323082507022,-1412008140086] * [u^2,uv,v^2] y = [-12377002765101082,196820171004354090,562094148891299246] * [u^2,uv,v^2] z = [55836550914326161,-39134552764402442,2846943958532790128] * [u^2,uv,v^2] Disc(qx) = 248253878415418354618316 Disc(qy) = 66566343054482186688488320101264788 Disc(qz) = -634322611943327812420967300076191068 Parametric solution is OK Enter coefficients a b c: 79 -8 1 Solution: (x:y:z) = (1:4:7) --OK x = [-1,4,4] * [u^2,uv,v^2] y = [4,-2,20] * [u^2,uv,v^2] z = [-7,-36,44] * [u^2,uv,v^2] Disc(qx) = 32 Disc(qy) = -316 Disc(qz) = 2528 Parametric solution is OK Enter coefficients a b c: 125965 -134 1 Solution: (x:y:z) = (1:31:53) --OK x = [-1,4,130] * [u^2,uv,v^2] y = [31,-18,4066] * [u^2,uv,v^2] z = [-53,-8096,9302] * [u^2,uv,v^2] Disc(qx) = 536 Disc(qy) = -503860 Disc(qz) = 67517240 Parametric solution is OK Enter coefficients a b c: -163184 223 1 Solution: (x:y:z) = (1:5:397) --OK x = [1,0,223] * [u^2,uv,v^2] y = [-5,-794,1115] * [u^2,uv,v^2] z = [-397,2230,88531] * [u^2,uv,v^2] Disc(qx) = -892 Disc(qy) = 652736 Disc(qz) = 145560128 Parametric solution is OK Enter coefficients a b c: -1115479181 2065 61 Solution: (x:y:z) = (271:196736:180889) --OK x = [386,370,415] * [u^2,uv,v^2] y = [-256838,-467778,51940] * [u^2,uv,v^2] z = [-701084,2076010,1748735] * [u^2,uv,v^2] Disc(qx) = -503860 Disc(qy) = 272176920164 Disc(qz) = 9213858035060 Parametric solution is OK Enter coefficients a b c: 88727009405 -50601 1 Solution: (x:y:z) = (67:107183:13528438) --OK x = [-67,276,471] * [u^2,uv,v^2] y = [107183,-37696,831123] * [u^2,uv,v^2] z = [-13528438,-106168434,123572382] * [u^2,uv,v^2] Disc(qx) = 202404 Disc(qy) = -354908037620 Disc(qz) = 17958701611609620 Parametric solution is OK Enter coefficients a b c: 263422353799 -497480 1 Solution: (x:y:z) = (7:17590:11875043) --OK x = [-7,1348,6172] * [u^2,uv,v^2] y = [17590,5538,14976124] * [u^2,uv,v^2] z = [-11875043,-213398348,10076817308] * [u^2,uv,v^2] Disc(qx) = 1989920 Disc(qy) = -1053689415196 Disc(qz) = 524189410271706080 Parametric solution is OK Enter coefficients a b c: 62063469603854588654579 68044230041 -1 Solution: (x:y:z) = (30740:32088063161:11344956855892619) --OK x = [30740,-409478,-849908] * [u^2,uv,v^2] y = [32088063161,310688281872,-1182111469003] * [u^2,uv,v^2] z = [11344956855892619,-9066204972113032,374052548186839105] * [u^2,uv,v^2] Disc(qx) = 272176920164 Disc(qy) = 248253878415418354618316 Disc(qz) = -16892244011469171082902408656030956 Parametric solution is OK Enter coefficients a b c: 1 7535987 -52 Solution: (x:y:z) = (4735:1:759) --OK x = [4735,22116,-56936] * [u^2,uv,v^2] y = [-1,12,16] * [u^2,uv,v^2] z = [759,362,9972] * [u^2,uv,v^2] Disc(qx) = 1567485296 Disc(qy) = 208 Disc(qz) = -30143948 Parametric solution is OK Enter coefficients a b c: 19 4776762553 -6836 Solution: (x:y:z) = (1267471:13:67699) --OK x = [1903532,10105320,-3742819] * [u^2,uv,v^2] y = [-316,352,313] * [u^2,uv,v^2] z = [282572,-85858,327709] * [u^2,uv,v^2] Disc(qx) = 130615795249232 Disc(qy) = 519536 Disc(qz) = -363033954028 Parametric solution is OK Enter coefficients a b c: 1 52753834808 -208881 Solution: (x:y:z) = (17547333:27:40721) --OK x = [17547333,52950174,-588029163] * [u^2,uv,v^2] y = [-27,888,435] * [u^2,uv,v^2] z = [40721,-39466,1305057] * [u^2,uv,v^2] Disc(qx) = 44077095074119392 Disc(qy) = 835524 Disc(qz) = -211015339232 Parametric solution is OK Enter coefficients a b c: 221916530122928255 1 -370095536 Solution: (x:y:z) = (7508:1539105595944:200502439) --OK x = [-7508,-10400,45692] * [u^2,uv,v^2] y = [1539105595944,-17634978298376,-2847239512744] * [u^2,uv,v^2] z = [200502439,-132257036,1128612261] * [u^2,uv,v^2] Disc(qx) = 1480382144 Disc(qy) = 328521268652421113695078720 Disc(qz) = -887666120491713020 Parametric solution is OK Enter coefficients a b c: 555143 1 -1737 Solution: (x:y:z) = (9:2973:176) --OK x = [-9,-30,168] * [u^2,uv,v^2] y = [2973,-58026,-41214] * [u^2,uv,v^2] z = [176,-74,3162] * [u^2,uv,v^2] Disc(qx) = 6948 Disc(qy) = 3857133564 Disc(qz) = -2220572 Parametric solution is OK Enter coefficients a b c: 1 23121989 -2313 Solution: (x:y:z) = (8707:4:439) --OK x = [8707,416280,-1166751] * [u^2,uv,v^2] y = [-4,42,468] * [u^2,uv,v^2] z = [439,-256,52707] * [u^2,uv,v^2] Disc(qx) = 213924642228 Disc(qy) = 9252 Disc(qz) = -92487956 Parametric solution is OK Enter coefficients a b c: 14299777 2 -5276187762844563 Solution: (x:y:z) = (19356219:36672694683:1235) --OK x = [-38712438,-118025652,182625075] * [u^2,uv,v^2] y = [73345389366,-449667627426,-339463255227] * [u^2,uv,v^2] z = [2470,-48,11579] * [u^2,uv,v^2] Disc(qx) = 42209502102756504 Disc(qy) = 301793233675224546249804 Disc(qz) = -114398216 Parametric solution is OK Enter coefficients a b c: 1 316 -5 Solution: (x:y:z) = (2:1:8) --OK x = [2,80,10] * [u^2,uv,v^2] y = [-1,0,5] * [u^2,uv,v^2] z = [8,4,40] * [u^2,uv,v^2] Disc(qx) = 6320 Disc(qy) = 20 Disc(qz) = -1264 Parametric solution is OK Enter coefficients a b c: 388 152441 -1 Solution: (x:y:z) = (56:9:3683) --OK x = [56,-694,-572] * [u^2,uv,v^2] y = [9,20,-32] * [u^2,uv,v^2] z = [3683,3356,16824] * [u^2,uv,v^2] Disc(qx) = 609764 Disc(qy) = 1552 Disc(qz) = -236588432 Parametric solution is OK Enter coefficients a b c: 831 1 -92742160 Solution: (x:y:z) = (309:17077:2) --OK x = [-309,-16768,72656] * [u^2,uv,v^2] y = [17077,-273856,-3415088] * [u^2,uv,v^2] z = [2,-2,416] * [u^2,uv,v^2] Disc(qx) = 370968640 Disc(qy) = 308274939840 Disc(qz) = -3324 Parametric solution is OK Enter coefficients a b c: 1 29526647 -1956 Solution: (x:y:z) = (17194:8:1057) --OK x = [17194,439500,-550428] * [u^2,uv,v^2] y = [-8,36,204] * [u^2,uv,v^2] z = [1057,-458,27984] * [u^2,uv,v^2] Disc(qx) = 231016486128 Disc(qy) = 7824 Disc(qz) = -118106588 Parametric solution is OK Enter coefficients a b c: 7 4715959977 -21016 Solution: (x:y:z) = (227529:11:6663) --OK x = [1592703,15324546,-25365801] * [u^2,uv,v^2] y = [-77,490,1131] * [u^2,uv,v^2] z = [46641,-7224,708063] * [u^2,uv,v^2] Disc(qx) = 396442459506528 Disc(qy) = 588448 Disc(qz) = -132046879356 Parametric solution is OK Enter coefficients a b c: 6404148857786219 1 -3120332 Solution: (x:y:z) = (394:19843986872:21090393) --OK x = [-394,-1984,5422] * [u^2,uv,v^2] y = [19843986872,-234130929916,-316405547352] * [u^2,uv,v^2] z = [21090393,5470472,304007155] * [u^2,uv,v^2] Disc(qx) = 12481328 Disc(qy) = 79932282454855153218832 Disc(qz) = -25616595431144876 Parametric solution is OK Enter coefficients a b c: 0 0 0 eclib-20250122/progs/out_ntl/000077500000000000000000000000001474421343600156555ustar00rootroot00000000000000eclib-20250122/progs/out_ntl/aplist.out000066400000000000000000000004431474421343600177030ustar00rootroot00000000000000 90 a + + - 2 6 -4 -6 -4 0 -6 -4 8 0 8 0 -6 6 2 -4 -12 -10 -4 12 12 2 90 b - + + 2 -6 -4 6 -4 0 6 -4 8 0 8 0 6 -6 2 -4 12 -10 -4 -12 -12 2 90 c - - - -4 0 2 -6 -4 0 6 8 2 6 -4 0 6 0 -10 -4 0 2 8 -12 -18 2 eclib-20250122/progs/out_ntl/checkap.out000066400000000000000000000001131474421343600177770ustar00rootroot00000000000000Enter first and last N: 50 51 52 53 54 55 56 57 58 59 60 All checked ok eclib-20250122/progs/out_ntl/cubics.out000066400000000000000000000015561474421343600176650ustar00rootroot000000000000001 reduced cubics with discriminant 1 (up to GL(2,Z)-equivalence) : [ [0,1,1,0] ] 2 irreducible reduced cubics with discriminant 49 (up to SL(2,Z)-equivalence) : [ [1,2,-1,-1] [1,1,-2,-1] ] 1 irreducible reduced cubics with discriminant 49 (up to GL(2,Z)-equivalence) : [ [1,2,-1,-1] ] 3 reduced cubics with discriminant 49 (up to SL(2,Z)-equivalence) : [ [0,1,-1,-12] [1,2,-1,-1] [1,1,-2,-1] ] 2 reduced cubics with discriminant 49 (up to GL(2,Z)-equivalence) : [ [0,1,-1,-12] [1,2,-1,-1] ] 2 reduced cubics with discriminant 148 (up to GL(2,Z)-equivalence) : [ [0,1,0,-37] [1,-1,-3,1] ] 2 reduced cubics with discriminant -23 (up to GL(2,Z)-equivalence) : [ [0,1,1,6] [1,-1,0,1] ] 2 reduced cubics with discriminant -199 (up to GL(2,Z)-equivalence) : [ [0,1,1,50] [1,1,4,1] ] 1 irreducible reduced cubics with discriminant 69564 (up to GL(2,Z)-equivalence) : [ [1,11,-12,-6] ] eclib-20250122/progs/out_ntl/ecnf.out000066400000000000000000000537151474421343600173340ustar00rootroot00000000000000>>> Level = conductor = 11 <<< Minimal curve = [0,-1,1,-10,-20] Enter sign (1,-1,0 for both):Newform information: 1 newform(s) at level 11: p0=2 #ap= 500 1: aplist = [ -2 -1 1 -2 1 4 -2 0 -1 0 7 3 -8 -6 8 -6 5 12 -7 -3 ...] aq = [ -1 ] ap0 = -2, dp0 = 2, np0 = 5, pdot = -10 SFE = 1, L/P = 2/5 lplus = 1, mplus = 1 lminus = 3, mminus = 2 [(4,1;1,3),-1,1;1] Modular symbol map (+,-) (0:1) = {0,oo} -> (-2/5,0) (1:1) = {0,1} -> (0,0) (2:1) = {0,1/2} -> (-2,0) (3:1) = {0,1/3} -> (-1,1) (4:1) = {0,1/4} -> (1,1) (5:1) = {0,1/5} -> (2,0) (6:1) = {0,1/6} -> (2,0) (7:1) = {0,1/7} -> (1,-1) (8:1) = {0,1/8} -> (-1,-1) (9:1) = {0,1/9} -> (-2,0) (10:1) = {0,1/10} -> (0,0) (1:0) = {oo,0} -> (2/5,0) Computation of further modular symbols Base point? (enter 0 for 0, or 1 for oo) Values of {0,r} for rational r: Enter numerator and denominator of r: All modular symbols with bounded denominator Enter maximum denominator (0 for none): {0,0} -> (0,0) {0,1/2} -> (-2,0) {0,1/3} -> (-1,1) {0,2/3} -> (-1,-1) {0,1/4} -> (1,1) {0,3/4} -> (1,-1) {0,1/5} -> (2,0) {0,2/5} -> (-3,1) {0,3/5} -> (-3,-1) {0,4/5} -> (2,0) >>> Level = conductor = 11 <<< Minimal curve = [0,-1,1,-10,-20] Enter sign (1,-1,0 for both):Newform information: 1 newform(s) at level 11: p0=2 #ap= 500 1: aplist = [ -2 -1 1 -2 1 4 -2 0 -1 0 7 3 -8 -6 8 -6 5 12 -7 -3 ...] aq = [ -1 ] ap0 = -2, dp0 = 2, np0 = 5, pdot = -10 SFE = 1, L/P = 2/5 lplus = 1, mplus = 1 [(-5,1;-1,2),-2,0;?] Modular symbol map (+) (0:1) = {0,oo} -> -2/5 (1:1) = {0,1} -> 0 (2:1) = {0,1/2} -> -2 (3:1) = {0,1/3} -> -1 (4:1) = {0,1/4} -> 1 (5:1) = {0,1/5} -> 2 (6:1) = {0,1/6} -> 2 (7:1) = {0,1/7} -> 1 (8:1) = {0,1/8} -> -1 (9:1) = {0,1/9} -> -2 (10:1) = {0,1/10} -> 0 (1:0) = {oo,0} -> 2/5 Computation of further modular symbols Base point? (enter 0 for 0, or 1 for oo) Values of {0,r} for rational r: Enter numerator and denominator of r: All modular symbols with bounded denominator Enter maximum denominator (0 for none): {0,0} -> 0 {0,1/2} -> -2 {0,1/3} -> -1 {0,2/3} -> -1 {0,1/4} -> 1 {0,3/4} -> 1 {0,1/5} -> 2 {0,2/5} -> -3 {0,3/5} -> -3 {0,4/5} -> 2 >>> Level = conductor = 11 <<< Minimal curve = [0,-1,1,-10,-20] Enter sign (1,-1,0 for both):Newform information: 1 newform(s) at level 11: p0=2 #ap= 500 1: aplist = [ -2 -1 1 -2 1 4 -2 0 -1 0 7 3 -8 -6 8 -6 5 12 -7 -3 ...] aq = [ -1 ] ap0 = -2, dp0 = 2, np0 = 5, pdot = -10 SFE = 1, L/P = 2/5 lplus = 1, mplus = 1 lminus = 3, mminus = 2 [(4,1;1,3),-1,1;1] Modular symbol map (+,-) (0:1) = {0,oo} -> (-2/5,0) (1:1) = {0,1} -> (0,0) (2:1) = {0,1/2} -> (-2,0) (3:1) = {0,1/3} -> (-1,1) (4:1) = {0,1/4} -> (1,1) (5:1) = {0,1/5} -> (2,0) (6:1) = {0,1/6} -> (2,0) (7:1) = {0,1/7} -> (1,-1) (8:1) = {0,1/8} -> (-1,-1) (9:1) = {0,1/9} -> (-2,0) (10:1) = {0,1/10} -> (0,0) (1:0) = {oo,0} -> (2/5,0) Computation of further modular symbols Base point? (enter 0 for 0, or 1 for oo) Values of {oo,r} for rational r: Enter numerator and denominator of r: All modular symbols with bounded denominator Enter maximum denominator (0 for none): {oo,0} -> (2/5,0) {oo,1/2} -> (-8/5,0) {oo,1/3} -> (-3/5,1) {oo,2/3} -> (-3/5,-1) {oo,1/4} -> (7/5,1) {oo,3/4} -> (7/5,-1) {oo,1/5} -> (12/5,0) {oo,2/5} -> (-13/5,1) {oo,3/5} -> (-13/5,-1) {oo,4/5} -> (12/5,0) >>> Level = conductor = 11 <<< Minimal curve = [0,-1,1,-10,-20] Enter sign (1,-1,0 for both):Newform information: 1 newform(s) at level 11: p0=2 #ap= 500 1: aplist = [ -2 -1 1 -2 1 4 -2 0 -1 0 7 3 -8 -6 8 -6 5 12 -7 -3 ...] aq = [ -1 ] ap0 = -2, dp0 = 2, np0 = 5, pdot = -10 SFE = 1, L/P = 2/5 lplus = 1, mplus = 1 [(-5,1;-1,2),-2,0;?] Modular symbol map (+) (0:1) = {0,oo} -> -2/5 (1:1) = {0,1} -> 0 (2:1) = {0,1/2} -> -2 (3:1) = {0,1/3} -> -1 (4:1) = {0,1/4} -> 1 (5:1) = {0,1/5} -> 2 (6:1) = {0,1/6} -> 2 (7:1) = {0,1/7} -> 1 (8:1) = {0,1/8} -> -1 (9:1) = {0,1/9} -> -2 (10:1) = {0,1/10} -> 0 (1:0) = {oo,0} -> 2/5 Computation of further modular symbols Base point? (enter 0 for 0, or 1 for oo) Values of {oo,r} for rational r: Enter numerator and denominator of r: All modular symbols with bounded denominator Enter maximum denominator (0 for none): {oo,0} -> 2/5 {oo,1/2} -> -8/5 {oo,1/3} -> -3/5 {oo,2/3} -> -3/5 {oo,1/4} -> 7/5 {oo,3/4} -> 7/5 {oo,1/5} -> 12/5 {oo,2/5} -> -13/5 {oo,3/5} -> -13/5 {oo,4/5} -> 12/5 >>> Level = conductor = 11 <<< Minimal curve = [0,-1,1,0,0] Enter sign (1,-1,0 for both):Newform information: 1 newform(s) at level 11: p0=2 #ap= 500 1: aplist = [ -2 -1 1 -2 1 4 -2 0 -1 0 7 3 -8 -6 8 -6 5 12 -7 -3 ...] aq = [ -1 ] ap0 = -2, dp0 = 2, np0 = 5, pdot = -10 SFE = 1, L/P = 2/5 lplus = 1, mplus = 1 lminus = 3, mminus = 2 [(4,1;1,3),-1,1;1] Modular symbol map (+,-) (0:1) = {0,oo} -> (-2/25,0) (1:1) = {0,1} -> (0,0) (2:1) = {0,1/2} -> (-2/5,0) (3:1) = {0,1/3} -> (-1/5,1) (4:1) = {0,1/4} -> (1/5,1) (5:1) = {0,1/5} -> (2/5,0) (6:1) = {0,1/6} -> (2/5,0) (7:1) = {0,1/7} -> (1/5,-1) (8:1) = {0,1/8} -> (-1/5,-1) (9:1) = {0,1/9} -> (-2/5,0) (10:1) = {0,1/10} -> (0,0) (1:0) = {oo,0} -> (2/25,0) Computation of further modular symbols Base point? (enter 0 for 0, or 1 for oo) Values of {0,r} for rational r: Enter numerator and denominator of r: All modular symbols with bounded denominator Enter maximum denominator (0 for none): {0,0} -> (0,0) {0,1/2} -> (-2/5,0) {0,1/3} -> (-1/5,1) {0,2/3} -> (-1/5,-1) {0,1/4} -> (1/5,1) {0,3/4} -> (1/5,-1) {0,1/5} -> (2/5,0) {0,2/5} -> (-3/5,1) {0,3/5} -> (-3/5,-1) {0,4/5} -> (2/5,0) >>> Level = conductor = 11 <<< Minimal curve = [0,-1,1,-7820,-263580] Enter sign (1,-1,0 for both):Newform information: 1 newform(s) at level 11: p0=2 #ap= 500 1: aplist = [ -2 -1 1 -2 1 4 -2 0 -1 0 7 3 -8 -6 8 -6 5 12 -7 -3 ...] aq = [ -1 ] ap0 = -2, dp0 = 2, np0 = 5, pdot = -10 SFE = 1, L/P = 2/5 lplus = 1, mplus = 1 lminus = 3, mminus = 2 [(4,1;1,3),-1,1;1] Modular symbol map (+,-) (0:1) = {0,oo} -> (-2,0) (1:1) = {0,1} -> (0,0) (2:1) = {0,1/2} -> (-10,0) (3:1) = {0,1/3} -> (-5,1) (4:1) = {0,1/4} -> (5,1) (5:1) = {0,1/5} -> (10,0) (6:1) = {0,1/6} -> (10,0) (7:1) = {0,1/7} -> (5,-1) (8:1) = {0,1/8} -> (-5,-1) (9:1) = {0,1/9} -> (-10,0) (10:1) = {0,1/10} -> (0,0) (1:0) = {oo,0} -> (2,0) Computation of further modular symbols Base point? (enter 0 for 0, or 1 for oo) Values of {0,r} for rational r: Enter numerator and denominator of r: All modular symbols with bounded denominator Enter maximum denominator (0 for none): {0,0} -> (0,0) {0,1/2} -> (-10,0) {0,1/3} -> (-5,1) {0,2/3} -> (-5,-1) {0,1/4} -> (5,1) {0,3/4} -> (5,-1) {0,1/5} -> (10,0) {0,2/5} -> (-15,1) {0,3/5} -> (-15,-1) {0,4/5} -> (10,0) >>> Level = conductor = 37 <<< Minimal curve = [0,0,1,-1,0] Enter sign (1,-1,0 for both):Newform information: 1 newform(s) at level 37: p0=2 #ap= 608 1: aplist = [ -2 -3 -2 -1 -5 -2 0 0 2 6 -4 -1 -9 2 -9 1 8 -8 8 9 ...] aq = [ 1 ] ap0 = -2, dp0 = 0, np0 = 5 SFE = -1, L/P = 0 lplus = 5, mplus = 4 lminus = 3, mminus = 2 [(14,1;3,8),1,-1;2] Modular symbol map (+,-) (0:1) = {0,oo} -> (0,0) (1:1) = {0,1} -> (0,0) (2:1) = {0,1/2} -> (0,0) (3:1) = {0,1/3} -> (0,1) (4:1) = {0,1/4} -> (0,1) (5:1) = {0,1/5} -> (1,0) (6:1) = {0,1/6} -> (0,0) (7:1) = {0,1/7} -> (1,0) (8:1) = {0,1/8} -> (1,-1) (9:1) = {0,1/9} -> (0,-1) (10:1) = {0,1/10} -> (0,0) (11:1) = {0,1/11} -> (0,0) (12:1) = {0,1/12} -> (0,-1) (13:1) = {0,1/13} -> (0,-1) (14:1) = {0,1/14} -> (-1,-1) (15:1) = {0,1/15} -> (-1,0) (16:1) = {0,1/16} -> (-1,0) (17:1) = {0,1/17} -> (0,1) (18:1) = {0,1/18} -> (0,0) (19:1) = {0,1/19} -> (0,0) (20:1) = {0,1/20} -> (0,-1) (21:1) = {0,1/21} -> (-1,0) (22:1) = {0,1/22} -> (-1,0) (23:1) = {0,1/23} -> (-1,1) (24:1) = {0,1/24} -> (0,1) (25:1) = {0,1/25} -> (0,1) (26:1) = {0,1/26} -> (0,0) (27:1) = {0,1/27} -> (0,0) (28:1) = {0,1/28} -> (0,1) (29:1) = {0,1/29} -> (1,1) (30:1) = {0,1/30} -> (1,0) (31:1) = {0,1/31} -> (0,0) (32:1) = {0,1/32} -> (1,0) (33:1) = {0,1/33} -> (0,-1) (34:1) = {0,1/34} -> (0,-1) (35:1) = {0,1/35} -> (0,0) (36:1) = {0,1/36} -> (0,0) (1:0) = {oo,0} -> (0,0) Computation of further modular symbols Base point? (enter 0 for 0, or 1 for oo) Values of {0,r} for rational r: Enter numerator and denominator of r: All modular symbols with bounded denominator Enter maximum denominator (0 for none): >>> Level = conductor = 37 <<< Minimal curve = [0,0,1,-1,0] Enter sign (1,-1,0 for both):Newform information: 1 newform(s) at level 37: p0=2 #ap= 608 1: aplist = [ -2 -3 -2 -1 -5 -2 0 0 2 6 -4 -1 -9 2 -9 1 8 -8 8 9 ...] aq = [ 1 ] ap0 = -2, dp0 = 0, np0 = 5 SFE = -1, L/P = 0 lplus = 5, mplus = 4 [(15,1;2,5),1,0;?] Modular symbol map (+) (0:1) = {0,oo} -> 0 (1:1) = {0,1} -> 0 (2:1) = {0,1/2} -> 0 (3:1) = {0,1/3} -> 0 (4:1) = {0,1/4} -> 0 (5:1) = {0,1/5} -> 1 (6:1) = {0,1/6} -> 0 (7:1) = {0,1/7} -> 1 (8:1) = {0,1/8} -> 1 (9:1) = {0,1/9} -> 0 (10:1) = {0,1/10} -> 0 (11:1) = {0,1/11} -> 0 (12:1) = {0,1/12} -> 0 (13:1) = {0,1/13} -> 0 (14:1) = {0,1/14} -> -1 (15:1) = {0,1/15} -> -1 (16:1) = {0,1/16} -> -1 (17:1) = {0,1/17} -> 0 (18:1) = {0,1/18} -> 0 (19:1) = {0,1/19} -> 0 (20:1) = {0,1/20} -> 0 (21:1) = {0,1/21} -> -1 (22:1) = {0,1/22} -> -1 (23:1) = {0,1/23} -> -1 (24:1) = {0,1/24} -> 0 (25:1) = {0,1/25} -> 0 (26:1) = {0,1/26} -> 0 (27:1) = {0,1/27} -> 0 (28:1) = {0,1/28} -> 0 (29:1) = {0,1/29} -> 1 (30:1) = {0,1/30} -> 1 (31:1) = {0,1/31} -> 0 (32:1) = {0,1/32} -> 1 (33:1) = {0,1/33} -> 0 (34:1) = {0,1/34} -> 0 (35:1) = {0,1/35} -> 0 (36:1) = {0,1/36} -> 0 (1:0) = {oo,0} -> 0 Computation of further modular symbols Base point? (enter 0 for 0, or 1 for oo) Values of {0,r} for rational r: Enter numerator and denominator of r: All modular symbols with bounded denominator Enter maximum denominator (0 for none): >>> Level = conductor = 389 <<< Minimal curve = [0,1,1,-2,0] Enter sign (1,-1,0 for both):Newform information: 1 newform(s) at level 389: p0=2 #ap= 1972 1: aplist = [ -2 -2 -3 -5 -4 -3 -6 5 -4 -6 4 -8 -3 12 -2 -6 3 -8 -5 -10 ...] aq = [ -1 ] ap0 = -2, dp0 = 0, np0 = 5 SFE = 1, L/P = 0 lplus = 5, mplus = 8 lminus = 3, mminus = 4 [(-111,1;-2,7),1,-1;2] Modular symbol map (+,-) (0:1) = {0,oo} -> (0,0) (1:1) = {0,1} -> (0,0) (2:1) = {0,1/2} -> (0,0) (3:1) = {0,1/3} -> (0,2) (4:1) = {0,1/4} -> (0,0) (5:1) = {0,1/5} -> (2,0) (6:1) = {0,1/6} -> (0,0) (7:1) = {0,1/7} -> (1,-1) (8:1) = {0,1/8} -> (0,1) (9:1) = {0,1/9} -> (-1,-1) (10:1) = {0,1/10} -> (0,0) (11:1) = {0,1/11} -> (1,0) (12:1) = {0,1/12} -> (0,-1) (13:1) = {0,1/13} -> (0,-2) (14:1) = {0,1/14} -> (-1,1) (15:1) = {0,1/15} -> (0,0) (16:1) = {0,1/16} -> (1,-1) (17:1) = {0,1/17} -> (0,1) (18:1) = {0,1/18} -> (1,-1) (19:1) = {0,1/19} -> (0,-1) (20:1) = {0,1/20} -> (-1,0) (21:1) = {0,1/21} -> (0,-1) (22:1) = {0,1/22} -> (0,0) (23:1) = {0,1/23} -> (0,1) (24:1) = {0,1/24} -> (1,-1) (25:1) = {0,1/25} -> (-1,-1) (26:1) = {0,1/26} -> (0,0) (27:1) = {0,1/27} -> (1,1) (28:1) = {0,1/28} -> (1,-1) (29:1) = {0,1/29} -> (0,-1) (30:1) = {0,1/30} -> (0,-2) (31:1) = {0,1/31} -> (-1,-3) (32:1) = {0,1/32} -> (-2,-1) (33:1) = {0,1/33} -> (-2,-1) (34:1) = {0,1/34} -> (-1,0) (35:1) = {0,1/35} -> (-1,0) (36:1) = {0,1/36} -> (0,1) (37:1) = {0,1/37} -> (0,1) (38:1) = {0,1/38} -> (-1,1) (39:1) = {0,1/39} -> (0,0) (40:1) = {0,1/40} -> (1,0) (41:1) = {0,1/41} -> (0,-1) (42:1) = {0,1/42} -> (-1,-1) (43:1) = {0,1/43} -> (1,-1) (44:1) = {0,1/44} -> (-1,-1) (45:1) = {0,1/45} -> (0,-2) (46:1) = {0,1/46} -> (-1,-3) (47:1) = {0,1/47} -> (-2,1) (48:1) = {0,1/48} -> (-2,1) (49:1) = {0,1/49} -> (0,-1) (50:1) = {0,1/50} -> (0,1) (51:1) = {0,1/51} -> (0,-1) (52:1) = {0,1/52} -> (0,1) (53:1) = {0,1/53} -> (0,0) (54:1) = {0,1/54} -> (0,-1) (55:1) = {0,1/55} -> (-1,-1) (56:1) = {0,1/56} -> (-1,1) (57:1) = {0,1/57} -> (-1,-1) (58:1) = {0,1/58} -> (-1,-1) (59:1) = {0,1/59} -> (-2,2) (60:1) = {0,1/60} -> (0,2) (61:1) = {0,1/61} -> (0,1) (62:1) = {0,1/62} -> (0,2) (63:1) = {0,1/63} -> (0,0) (64:1) = {0,1/64} -> (2,0) (65:1) = {0,1/65} -> (0,0) (66:1) = {0,1/66} -> (1,1) (67:1) = {0,1/67} -> (0,-2) (68:1) = {0,1/68} -> (0,-2) (69:1) = {0,1/69} -> (0,-2) (70:1) = {0,1/70} -> (0,-1) (71:1) = {0,1/71} -> (0,-2) (72:1) = {0,1/72} -> (-1,-1) (73:1) = {0,1/73} -> (-1,-1) (74:1) = {0,1/74} -> (-1,-2) (75:1) = {0,1/75} -> (0,0) (76:1) = {0,1/76} -> (0,-2) (77:1) = {0,1/77} -> (-2,0) (78:1) = {0,1/78} -> (-2,0) (79:1) = {0,1/79} -> (-2,0) (80:1) = {0,1/80} -> (-2,0) (81:1) = {0,1/81} -> (-1,1) (82:1) = {0,1/82} -> (-1,2) (83:1) = {0,1/83} -> (0,0) (84:1) = {0,1/84} -> (0,2) (85:1) = {0,1/85} -> (-1,1) (86:1) = {0,1/86} -> (-2,2) (87:1) = {0,1/87} -> (0,2) (88:1) = {0,1/88} -> (0,2) (89:1) = {0,1/89} -> (-1,1) (90:1) = {0,1/90} -> (-1,3) (91:1) = {0,1/91} -> (-2,2) (92:1) = {0,1/92} -> (-1,4) (93:1) = {0,1/93} -> (1,3) (94:1) = {0,1/94} -> (1,1) (95:1) = {0,1/95} -> (2,2) (96:1) = {0,1/96} -> (2,0) (97:1) = {0,1/97} -> (0,0) (98:1) = {0,1/98} -> (0,2) (99:1) = {0,1/99} -> (1,1) (100:1) = {0,1/100} -> (1,0) (101:1) = {0,1/101} -> (0,0) (102:1) = {0,1/102} -> (-1,1) (103:1) = {0,1/103} -> (1,0) (104:1) = {0,1/104} -> (0,0) (105:1) = {0,1/105} -> (-1,-1) (106:1) = {0,1/106} -> (-1,0) (107:1) = {0,1/107} -> (-1,0) (108:1) = {0,1/108} -> (-1,1) (109:1) = {0,1/109} -> (-1,2) (110:1) = {0,1/110} -> (-1,2) (111:1) = {0,1/111} -> (-1,1) (112:1) = {0,1/112} -> (-1,1) (113:1) = {0,1/113} -> (-1,3) (114:1) = {0,1/114} -> (1,1) (115:1) = {0,1/115} -> (0,0) (116:1) = {0,1/116} -> (1,1) (117:1) = {0,1/117} -> (0,2) (118:1) = {0,1/118} -> (1,-1) (119:1) = {0,1/119} -> (1,1) (120:1) = {0,1/120} -> (-1,-1) (121:1) = {0,1/121} -> (0,2) (122:1) = {0,1/122} -> (-1,1) (123:1) = {0,1/123} -> (0,2) (124:1) = {0,1/124} -> (-1,0) (125:1) = {0,1/125} -> (-1,1) (126:1) = {0,1/126} -> (0,2) (127:1) = {0,1/127} -> (0,1) (128:1) = {0,1/128} -> (-2,2) (129:1) = {0,1/129} -> (0,2) (130:1) = {0,1/130} -> (0,2) (131:1) = {0,1/131} -> (0,2) (132:1) = {0,1/132} -> (1,1) (133:1) = {0,1/133} -> (0,2) (134:1) = {0,1/134} -> (1,3) (135:1) = {0,1/135} -> (-1,1) (136:1) = {0,1/136} -> (0,2) (137:1) = {0,1/137} -> (-1,2) (138:1) = {0,1/138} -> (1,3) (139:1) = {0,1/139} -> (1,1) (140:1) = {0,1/140} -> (1,1) (141:1) = {0,1/141} -> (2,0) (142:1) = {0,1/142} -> (0,0) (143:1) = {0,1/143} -> (0,2) (144:1) = {0,1/144} -> (0,0) (145:1) = {0,1/145} -> (1,2) (146:1) = {0,1/146} -> (0,1) (147:1) = {0,1/147} -> (-1,2) (148:1) = {0,1/148} -> (1,4) (149:1) = {0,1/149} -> (2,1) (150:1) = {0,1/150} -> (0,0) (151:1) = {0,1/151} -> (0,2) (152:1) = {0,1/152} -> (0,2) (153:1) = {0,1/153} -> (0,0) (154:1) = {0,1/154} -> (2,1) (155:1) = {0,1/155} -> (2,2) (156:1) = {0,1/156} -> (2,0) (157:1) = {0,1/157} -> (0,0) (158:1) = {0,1/158} -> (2,1) (159:1) = {0,1/159} -> (1,-2) (160:1) = {0,1/160} -> (1,0) (161:1) = {0,1/161} -> (0,-1) (162:1) = {0,1/162} -> (0,1) (163:1) = {0,1/163} -> (1,1) (164:1) = {0,1/164} -> (1,1) (165:1) = {0,1/165} -> (2,1) (166:1) = {0,1/166} -> (0,0) (167:1) = {0,1/167} -> (2,0) (168:1) = {0,1/168} -> (1,-1) (169:1) = {0,1/169} -> (1,1) (170:1) = {0,1/170} -> (1,-1) (171:1) = {0,1/171} -> (2,2) (172:1) = {0,1/172} -> (1,-2) (173:1) = {0,1/173} -> (1,-1) (174:1) = {0,1/174} -> (1,-1) (175:1) = {0,1/175} -> (1,0) (176:1) = {0,1/176} -> (1,-1) (177:1) = {0,1/177} -> (2,0) (178:1) = {0,1/178} -> (2,-2) (179:1) = {0,1/179} -> (1,-3) (180:1) = {0,1/180} -> (0,-2) (181:1) = {0,1/181} -> (0,0) (182:1) = {0,1/182} -> (1,-2) (183:1) = {0,1/183} -> (0,-1) (184:1) = {0,1/184} -> (1,-2) (185:1) = {0,1/185} -> (1,-2) (186:1) = {0,1/186} -> (0,-1) (187:1) = {0,1/187} -> (0,-1) (188:1) = {0,1/188} -> (0,-2) (189:1) = {0,1/189} -> (-2,0) (190:1) = {0,1/190} -> (-1,-1) (191:1) = {0,1/191} -> (-2,0) (192:1) = {0,1/192} -> (-2,0) (193:1) = {0,1/193} -> (0,2) (194:1) = {0,1/194} -> (0,0) (195:1) = {0,1/195} -> (0,0) (196:1) = {0,1/196} -> (0,-2) (197:1) = {0,1/197} -> (-2,0) (198:1) = {0,1/198} -> (-2,0) (199:1) = {0,1/199} -> (-1,1) (200:1) = {0,1/200} -> (-2,0) (201:1) = {0,1/201} -> (0,2) (202:1) = {0,1/202} -> (0,1) (203:1) = {0,1/203} -> (0,1) (204:1) = {0,1/204} -> (1,2) (205:1) = {0,1/205} -> (1,2) (206:1) = {0,1/206} -> (0,1) (207:1) = {0,1/207} -> (1,2) (208:1) = {0,1/208} -> (0,0) (209:1) = {0,1/209} -> (0,2) (210:1) = {0,1/210} -> (1,3) (211:1) = {0,1/211} -> (2,2) (212:1) = {0,1/212} -> (2,0) (213:1) = {0,1/213} -> (1,1) (214:1) = {0,1/214} -> (1,0) (215:1) = {0,1/215} -> (1,1) (216:1) = {0,1/216} -> (1,1) (217:1) = {0,1/217} -> (1,2) (218:1) = {0,1/218} -> (2,-2) (219:1) = {0,1/219} -> (1,1) (220:1) = {0,1/220} -> (1,-1) (221:1) = {0,1/221} -> (1,1) (222:1) = {0,1/222} -> (2,0) (223:1) = {0,1/223} -> (0,0) (224:1) = {0,1/224} -> (2,-1) (225:1) = {0,1/225} -> (1,-1) (226:1) = {0,1/226} -> (1,-1) (227:1) = {0,1/227} -> (0,-1) (228:1) = {0,1/228} -> (0,1) (229:1) = {0,1/229} -> (1,0) (230:1) = {0,1/230} -> (1,2) (231:1) = {0,1/231} -> (2,-1) (232:1) = {0,1/232} -> (0,0) (233:1) = {0,1/233} -> (2,0) (234:1) = {0,1/234} -> (2,-2) (235:1) = {0,1/235} -> (2,-1) (236:1) = {0,1/236} -> (0,0) (237:1) = {0,1/237} -> (0,-2) (238:1) = {0,1/238} -> (0,-2) (239:1) = {0,1/239} -> (0,0) (240:1) = {0,1/240} -> (2,-1) (241:1) = {0,1/241} -> (1,-4) (242:1) = {0,1/242} -> (-1,-2) (243:1) = {0,1/243} -> (0,-1) (244:1) = {0,1/244} -> (1,-2) (245:1) = {0,1/245} -> (0,0) (246:1) = {0,1/246} -> (0,-2) (247:1) = {0,1/247} -> (0,0) (248:1) = {0,1/248} -> (2,0) (249:1) = {0,1/249} -> (1,-1) (250:1) = {0,1/250} -> (1,-1) (251:1) = {0,1/251} -> (1,-3) (252:1) = {0,1/252} -> (-1,-2) (253:1) = {0,1/253} -> (0,-2) (254:1) = {0,1/254} -> (-1,-1) (255:1) = {0,1/255} -> (1,-3) (256:1) = {0,1/256} -> (0,-2) (257:1) = {0,1/257} -> (1,-1) (258:1) = {0,1/258} -> (0,-2) (259:1) = {0,1/259} -> (0,-2) (260:1) = {0,1/260} -> (0,-2) (261:1) = {0,1/261} -> (-2,-2) (262:1) = {0,1/262} -> (0,-1) (263:1) = {0,1/263} -> (0,-2) (264:1) = {0,1/264} -> (-1,-1) (265:1) = {0,1/265} -> (-1,0) (266:1) = {0,1/266} -> (0,-2) (267:1) = {0,1/267} -> (-1,-1) (268:1) = {0,1/268} -> (0,-2) (269:1) = {0,1/269} -> (-1,1) (270:1) = {0,1/270} -> (1,-1) (271:1) = {0,1/271} -> (1,1) (272:1) = {0,1/272} -> (0,-2) (273:1) = {0,1/273} -> (1,-1) (274:1) = {0,1/274} -> (0,0) (275:1) = {0,1/275} -> (1,-1) (276:1) = {0,1/276} -> (-1,-3) (277:1) = {0,1/277} -> (-1,-1) (278:1) = {0,1/278} -> (-1,-1) (279:1) = {0,1/279} -> (-1,-2) (280:1) = {0,1/280} -> (-1,-2) (281:1) = {0,1/281} -> (-1,-1) (282:1) = {0,1/282} -> (-1,0) (283:1) = {0,1/283} -> (-1,0) (284:1) = {0,1/284} -> (-1,1) (285:1) = {0,1/285} -> (0,0) (286:1) = {0,1/286} -> (1,0) (287:1) = {0,1/287} -> (-1,-1) (288:1) = {0,1/288} -> (0,0) (289:1) = {0,1/289} -> (1,0) (290:1) = {0,1/290} -> (1,-1) (291:1) = {0,1/291} -> (0,-2) (292:1) = {0,1/292} -> (0,0) (293:1) = {0,1/293} -> (2,0) (294:1) = {0,1/294} -> (2,-2) (295:1) = {0,1/295} -> (1,-1) (296:1) = {0,1/296} -> (1,-3) (297:1) = {0,1/297} -> (-1,-4) (298:1) = {0,1/298} -> (-2,-2) (299:1) = {0,1/299} -> (-1,-3) (300:1) = {0,1/300} -> (-1,-1) (301:1) = {0,1/301} -> (0,-2) (302:1) = {0,1/302} -> (0,-2) (303:1) = {0,1/303} -> (-2,-2) (304:1) = {0,1/304} -> (-1,-1) (305:1) = {0,1/305} -> (0,-2) (306:1) = {0,1/306} -> (0,0) (307:1) = {0,1/307} -> (-1,-2) (308:1) = {0,1/308} -> (-1,-1) (309:1) = {0,1/309} -> (-2,0) (310:1) = {0,1/310} -> (-2,0) (311:1) = {0,1/311} -> (-2,0) (312:1) = {0,1/312} -> (-2,0) (313:1) = {0,1/313} -> (0,2) (314:1) = {0,1/314} -> (0,0) (315:1) = {0,1/315} -> (-1,2) (316:1) = {0,1/316} -> (-1,1) (317:1) = {0,1/317} -> (-1,1) (318:1) = {0,1/318} -> (0,2) (319:1) = {0,1/319} -> (0,1) (320:1) = {0,1/320} -> (0,2) (321:1) = {0,1/321} -> (0,2) (322:1) = {0,1/322} -> (0,2) (323:1) = {0,1/323} -> (1,-1) (324:1) = {0,1/324} -> (0,0) (325:1) = {0,1/325} -> (2,0) (326:1) = {0,1/326} -> (0,0) (327:1) = {0,1/327} -> (0,-2) (328:1) = {0,1/328} -> (0,-1) (329:1) = {0,1/329} -> (0,-2) (330:1) = {0,1/330} -> (-2,-2) (331:1) = {0,1/331} -> (-1,1) (332:1) = {0,1/332} -> (-1,1) (333:1) = {0,1/333} -> (-1,-1) (334:1) = {0,1/334} -> (-1,1) (335:1) = {0,1/335} -> (0,1) (336:1) = {0,1/336} -> (0,0) (337:1) = {0,1/337} -> (0,-1) (338:1) = {0,1/338} -> (0,1) (339:1) = {0,1/339} -> (0,-1) (340:1) = {0,1/340} -> (0,1) (341:1) = {0,1/341} -> (-2,-1) (342:1) = {0,1/342} -> (-2,-1) (343:1) = {0,1/343} -> (-1,3) (344:1) = {0,1/344} -> (0,2) (345:1) = {0,1/345} -> (-1,1) (346:1) = {0,1/346} -> (1,1) (347:1) = {0,1/347} -> (-1,1) (348:1) = {0,1/348} -> (0,1) (349:1) = {0,1/349} -> (1,0) (350:1) = {0,1/350} -> (0,0) (351:1) = {0,1/351} -> (-1,-1) (352:1) = {0,1/352} -> (0,-1) (353:1) = {0,1/353} -> (0,-1) (354:1) = {0,1/354} -> (-1,0) (355:1) = {0,1/355} -> (-1,0) (356:1) = {0,1/356} -> (-2,1) (357:1) = {0,1/357} -> (-2,1) (358:1) = {0,1/358} -> (-1,3) (359:1) = {0,1/359} -> (0,2) (360:1) = {0,1/360} -> (0,1) (361:1) = {0,1/361} -> (1,1) (362:1) = {0,1/362} -> (1,-1) (363:1) = {0,1/363} -> (0,0) (364:1) = {0,1/364} -> (-1,1) (365:1) = {0,1/365} -> (1,1) (366:1) = {0,1/366} -> (0,-1) (367:1) = {0,1/367} -> (0,0) (368:1) = {0,1/368} -> (0,1) (369:1) = {0,1/369} -> (-1,0) (370:1) = {0,1/370} -> (0,1) (371:1) = {0,1/371} -> (1,1) (372:1) = {0,1/372} -> (0,-1) (373:1) = {0,1/373} -> (1,1) (374:1) = {0,1/374} -> (0,0) (375:1) = {0,1/375} -> (-1,-1) (376:1) = {0,1/376} -> (0,2) (377:1) = {0,1/377} -> (0,1) (378:1) = {0,1/378} -> (1,0) (379:1) = {0,1/379} -> (0,0) (380:1) = {0,1/380} -> (-1,1) (381:1) = {0,1/381} -> (0,-1) (382:1) = {0,1/382} -> (1,1) (383:1) = {0,1/383} -> (0,0) (384:1) = {0,1/384} -> (2,0) (385:1) = {0,1/385} -> (0,0) (386:1) = {0,1/386} -> (0,-2) (387:1) = {0,1/387} -> (0,0) (388:1) = {0,1/388} -> (0,0) (1:0) = {oo,0} -> (0,0) Computation of further modular symbols Base point? (enter 0 for 0, or 1 for oo) Values of {oo,r} for rational r: Enter numerator and denominator of r: {oo,355/113} -> (3,1) Enter numerator and denominator of r: All modular symbols with bounded denominator Enter maximum denominator (0 for none): {oo,0} -> (0,0) {oo,1/2} -> (0,0) {oo,1/3} -> (0,2) {oo,2/3} -> (0,-2) {oo,1/4} -> (0,0) {oo,3/4} -> (0,0) {oo,1/5} -> (2,0) {oo,2/5} -> (-2,0) {oo,3/5} -> (-2,0) {oo,4/5} -> (2,0) {oo,1/6} -> (0,0) {oo,5/6} -> (0,0) {oo,1/7} -> (1,-1) {oo,2/7} -> (1,1) {oo,3/7} -> (-2,0) {oo,4/7} -> (-2,0) {oo,5/7} -> (1,-1) {oo,6/7} -> (1,1) eclib-20250122/progs/out_ntl/h1bsd.out000066400000000000000000000020671474421343600174140ustar00rootroot00000000000000Enter first and last N: 50 a Rank = 0 L^(r)(f,1)/r! = 0.71316498142829676 L(f,1)/period = 1/3 50 b Rank = 0 L^(r)(f,1)/r! = 0.95681122658762796 L(f,1)/period = 1/5 51 a Rank = 0 L^(r)(f,1)/r! = 0.86005901612713837 L(f,1)/period = 1/3 52 a Rank = 0 L^(r)(f,1)/r! = 0.84548320864564628 L(f,1)/period = 1/2 53 a Rank = 1 L^(r)(f,1)/r! = 0.43586382417785716 L(f,1)/period = 0 54 a Rank = 0 L^(r)(f,1)/r! = 0.70157482532401025 L(f,1)/period = 1/3 54 b Rank = 0 L^(r)(f,1)/r! = 1.0305218497010025 L(f,1)/period = 1/3 55 a Rank = 0 L^(r)(f,1)/r! = 1.0286698561781891 L(f,1)/period = 1/4 56 b Rank = 0 L^(r)(f,1)/r! = 0.94801911561386838 L(f,1)/period = 1/2 56 a Rank = 0 L^(r)(f,1)/r! = 0.87454831418833637 L(f,1)/period = 1/4 57 a Rank = 1 L^(r)(f,1)/r! = 0.41749163967630964 L(f,1)/period = 0 57 b Rank = 0 L^(r)(f,1)/r! = 0.58650959165656799 L(f,1)/period = 2/5 57 c Rank = 0 L^(r)(f,1)/r! = 1.0853022722676732 L(f,1)/period = 1/4 58 a Rank = 1 L^(r)(f,1)/r! = 0.46370416478825058 L(f,1)/period = 0 58 b Rank = 0 L^(r)(f,1)/r! = 1.033207509365107 L(f,1)/period = 2/5 eclib-20250122/progs/out_ntl/h1bsdcurisog.out000066400000000000000000000063771474421343600210200ustar00rootroot00000000000000 11 a 1 [0,-1,1,-10,-20] 0 5 5 1.2692093042795534216887946168 0.25384186085591068433775892335 1 1 11 a 2 [0,-1,1,-7820,-263580] 0 1 1 0.25384186085591068433775892335 0.25384186085591068433775892335 1 1 11 a 3 [0,-1,1,0,0] 0 5 1 6.3460465213977671084439730838 0.25384186085591068433775892335 1 1 37 a 1 [0,0,1,-1,0] 1 1 1 5.9869172924639192596640199589 0.30599977383405230182048368332 0.051111408239968840235886099757 1 37 b 1 [0,1,1,-23,-50] 0 3 3 2.1770431858084583470086166231 0.72568106193615278233620554103 1 1 37 b 2 [0,1,1,-3,1] 0 3 1 6.5311295574253750410258498692 0.72568106193615278233620554103 1 1 37 b 3 [0,1,1,-1873,-31833] 0 1 1 0.72568106193615278233620553794 0.72568106193615278233620554103 1 1 57 a 1 [0,-1,1,-2,2] 1 1 2 5.5555045213725043221174270349 0.4174916396763096403893204916 0.037574592736823752824805111217 0.99999999999999999999999999999 57 b 1 [0,1,1,20,-32] 0 5 10 1.4662739791414199639605373858 0.58650959165656798558421495433 1 1 57 b 2 [0,1,1,-4390,-113432] 0 1 2 0.29325479582828399279210747717 0.58650959165656798558421495433 1 1 57 c 1 [1,0,1,-7,5] 0 4 4 4.3412090890706928922224104326 1.0853022722676732230556026082 1 1 57 c 2 [1,0,1,-102,385] 0 4 4 4.3412090890706928922224104325 1.0853022722676732230556026082 1 1 57 c 3 [1,0,1,8,29] 0 2 2 2.1706045445353464461112052163 1.0853022722676732230556026082 1 1 57 c 4 [1,0,1,-2,-1] 0 2 1 4.3412090890706928922224104326 1.0853022722676732230556026082 1 1 90 a 1 [1,-1,0,6,0] 0 6 12 2.4599353711739409903500357626 0.81997845705798033011667858753 1 1 90 a 2 [1,-1,0,-24,18] 0 6 12 2.4599353711739409903500357626 0.81997845705798033011667858753 1 1 90 a 3 [1,-1,0,-69,-235] 0 2 4 0.81997845705798033011667858753 0.81997845705798033011667858753 1 1 90 a 4 [1,-1,0,-1149,-14707] 0 2 4 0.81997845705798033011667858753 0.81997845705798033011667858753 1 1 90 b 1 [1,-1,1,-8,11] 0 6 12 3.9710942585413486372981289183 1.3236980861804495457660429728 1 1 90 b 2 [1,-1,1,-128,587] 0 6 12 3.9710942585413486372981289181 1.3236980861804495457660429728 1 1 90 b 3 [1,-1,1,52,-53] 0 2 4 1.3236980861804495457660429728 1.3236980861804495457660429728 1 1 90 b 4 [1,-1,1,-218,-269] 0 2 4 1.3236980861804495457660429728 1.3236980861804495457660429728 1 1 90 c 1 [1,-1,1,13,-61] 0 4 16 1.3375959945886485057653424429 1.3375959945886485057653424429 1 1 90 c 2 [1,-1,1,-167,-709] 0 4 16 1.3375959945886485057653424429 1.3375959945886485057653424429 1 1 90 c 3 [1,-1,1,-122,1721] 0 12 144 1.3375959945886485057653424429 1.3375959945886485057653424429 1 1 90 c 4 [1,-1,1,-617,5231] 0 2 4 1.3375959945886485057653424429 1.3375959945886485057653424429 1 1 90 c 5 [1,-1,1,-2597,-50281] 0 2 8 0.66879799729432425288267122147 1.3375959945886485057653424429 1 1 90 c 6 [1,-1,1,-3002,63929] 0 12 144 1.3375959945886485057653424429 1.3375959945886485057653424429 1 1 90 c 7 [1,-1,1,-48002,4059929] 0 6 36 1.3375959945886485057653474741 1.3375959945886485057653424429 1 1 90 c 8 [1,-1,1,-4082,14681] 0 6 72 0.66879799729432425288267122147 1.3375959945886485057653424429 1 1 389 a 1 [0,1,1,-2,0] 2 1 1 4.9804251217101101506427155839 0.7593165002884267702301926079 0.15246017794314375162432475705 1 eclib-20250122/progs/out_ntl/h1clist.out000066400000000000000000000001371474421343600177560ustar00rootroot00000000000000 90 a 1 [1,-1,0,6,0] 0 6 0 90 b 1 [1,-1,1,-8,11] 0 6 0 90 c 1 [1,-1,1,13,-61] 0 4 0 eclib-20250122/progs/out_ntl/h1curve.out000066400000000000000000000003351474421343600177640ustar00rootroot00000000000000See detail? Enter first and last N: Table of curves computed from newforms via periods (in LMFDB order) N # [a1,a2,a3,a4,a6] Conductor 90 a [1,-1,0,6,0] N = 90 90 b [1,-1,1,-8,11] N = 90 90 c [1,-1,1,13,-61] N = 90 eclib-20250122/progs/out_ntl/h1first.out000066400000000000000000000001711474421343600177650ustar00rootroot00000000000000Program h1first. Using METHOD = 2 >>>Level 90<<< 1 [1,-1,0,6,0] N = 90 2 [1,-1,1,-8,11] N = 90 3 [1,-1,1,13,-61] N = 90 eclib-20250122/progs/out_ntl/indep_test.out000066400000000000000000000170441474421343600205520ustar00rootroot00000000000000verbose (0/1)? Input a curve: Curve [1,0,1,-19252966408674012828065964616418441723,32685500727716376257923347071452044295907443056345614006] enter number of points: enter point 1 : enter point 2 : enter point 3 : enter point 4 : enter point 5 : enter point 6 : enter point 7 : enter point 8 : enter point 9 : enter point 10 : enter point 11 : enter point 12 : enter point 13 : enter point 14 : enter point 15 : enter point 16 : enter point 17 : enter point 18 : enter point 19 : enter point 20 : enter point 21 : enter point 22 : enter point 23 : 23 points entered. Enter number of primes to use: Processing point [5836121652711390553392352147587734955:-69455519784971993679807552308609739430858248812:41166906143372569] Image = 00 1 1 0 11 0 0 1 0 0 1 0 1 1 00 1 1 11 1 1 After elimination: 00 1 1 0 11 0 0 1 0 0 1 0 1 1 00 1 1 11 1 1 P independent of previous points (using prime 31) rank increases to 1 Processing point [1168425140326369941586705900133272389:-17137023844710987140049387309945953892946213544:5429411004770479] Image = 11 1 1 1 11 0 0 0 1 1 0 0 0 1 00 1 0 01 0 1 After elimination: 11 0 0 1 00 0 0 1 1 1 1 0 1 0 00 0 1 10 1 0 P independent of previous points (using prime 7) rank increases to 2 Processing point [69505543020048021386994294068829048:1443380843339272397458721030742392016696304046:161157926442059] Image = 11 1 0 0 01 1 1 1 0 1 1 1 1 1 01 1 1 11 0 0 After elimination: 00 0 1 1 10 1 1 1 1 0 1 1 1 0 01 0 1 10 0 1 P independent of previous points (using prime 43) rank increases to 3 Processing point [33726169481462771119596650221569:49412130720987886904443301152758710388796:7098921280459] Image = 11 0 1 0 01 0 0 1 0 0 1 0 0 1 00 0 0 01 0 1 After elimination: 00 0 0 0 11 1 1 1 0 1 1 1 0 1 01 0 0 01 1 0 P independent of previous points (using prime 53) rank increases to 4 Processing point [15827793579244286948730141533934:6538434104009303265024749952830709029353:5389750958437] Image = 01 1 0 1 11 1 1 0 1 0 0 1 1 1 01 1 1 11 1 0 After elimination: 01 0 0 0 01 1 1 1 0 1 1 1 1 1 01 0 1 11 1 0 P independent of previous points (using prime 7) rank increases to 5 Processing point [695536410556937814932194749585:230697883363551870088729854504374414548:302787575875] Image = 11 1 1 0 01 0 1 1 0 1 1 1 0 0 11 0 1 00 1 1 After elimination: 00 0 0 1 01 1 0 0 1 1 0 0 0 0 10 1 1 00 0 0 P independent of previous points (using prime 47) rank increases to 6 Processing point [3765485669836998883000769028606015:1411381089291349753164768808558921002947204:1666240341498377] Image = 01 1 1 0 01 1 0 1 0 1 0 0 0 1 10 0 1 10 0 0 After elimination: 00 0 0 0 00 1 0 0 0 1 1 0 0 0 10 1 1 11 1 1 P independent of previous points (using prime 59) rank increases to 7 Processing point [3944555884631464928934930:5657335012046240705357319452802233:2406104] Image = 01 0 0 1 11 1 0 0 0 0 1 1 1 0 00 1 0 10 1 1 After elimination: 00 0 0 0 00 0 0 0 1 1 1 1 0 0 10 0 0 00 1 1 P independent of previous points (using prime 83) rank increases to 8 Processing point [1127027270330215920:3523978127407100674110377602:1] Image = 10 1 1 0 00 1 0 1 1 0 1 0 1 1 11 1 1 11 1 0 After elimination: 00 0 0 0 00 0 0 1 0 1 0 1 0 0 11 1 1 00 0 0 P independent of previous points (using prime 71) rank increases to 9 Processing point [256051163199552568592395095:-394563651945882403580468873435105816:51895117] Image = 00 1 0 1 00 0 0 1 1 1 0 1 0 1 10 0 1 11 1 0 After elimination: 00 0 0 0 01 0 1 0 0 1 1 1 0 0 10 1 1 01 1 1 P independent of previous points (using prime 53) rank increases to 10 Processing point [442619010291205562786415:-1167962768316319592876571517317044:50653] Image = 01 0 1 1 00 1 1 0 0 1 1 0 1 0 01 0 0 11 1 0 After elimination: 00 0 0 0 00 0 0 0 0 1 1 1 1 0 01 1 1 11 0 0 P independent of previous points (using prime 89) rank increases to 11 Processing point [55822325193081529476460202295:-151915114589061403100759698106532333112:6118445789] Image = 11 0 1 0 10 0 1 0 1 1 0 1 1 1 00 1 1 00 0 1 After elimination: 00 0 0 0 00 0 0 0 0 0 0 1 1 1 01 0 0 11 1 0 P independent of previous points (using prime 109) rank increases to 12 Processing point [356145268111068765982119246504180:-1150775031908416918955115365651634494501651:30094741482625] Image = 10 1 1 1 01 1 1 1 1 1 1 0 0 1 11 0 0 10 1 0 After elimination: 00 0 0 0 00 0 1 0 0 0 0 0 0 1 11 1 1 01 1 0 P independent of previous points (using prime 67) rank increases to 13 Processing point [178158613465020969197033760546270:184569435055535326363669745422918052707327:46079082400051] Image = 11 1 0 0 11 0 0 1 1 0 0 0 1 1 01 1 1 10 1 1 After elimination: 00 0 0 0 00 0 0 0 0 0 1 0 1 0 00 0 0 11 1 1 P independent of previous points (using prime 97) rank increases to 14 Processing point [192666510528582744766151703315:-10531550647702714814852169224678207441368:64481201] Image = 10 1 1 0 11 1 0 1 1 1 0 0 1 1 01 0 1 11 1 1 After elimination: 00 0 0 0 00 0 0 0 0 0 0 0 1 0 01 0 1 00 0 1 P independent of previous points (using prime 113) rank increases to 15 Processing point [743072319779988539974981500704194760635:964874722537391293613786748114488474882993683572:437169613520472565481] Image = 00 1 1 0 10 0 1 0 0 0 0 0 1 0 11 1 1 10 1 0 After elimination: 00 0 0 0 00 0 0 0 0 0 0 0 0 1 10 0 0 00 1 0 P independent of previous points (using prime 127) rank increases to 16 Processing point [524227677070779268411695177915:3941156276776007263792745630379334937996:9221366673] Image = 01 0 1 1 11 1 0 1 1 1 1 1 1 0 00 0 0 00 0 0 After elimination: 00 0 0 0 00 0 0 0 0 0 0 0 0 0 10 0 1 10 1 1 P independent of previous points (using prime 131) rank increases to 17 Processing point [109625308172049929108967881865:387496978790653709721061294119215460988:7988005999] Image = 01 0 0 0 11 1 0 1 1 1 0 0 0 1 10 0 0 01 0 0 After elimination: 00 0 0 0 00 0 0 0 0 0 0 0 0 0 01 1 0 11 0 1 P independent of previous points (using prime 131) rank increases to 18 Processing point [90690032605118118988993244301780:-953144078079942906360903670036536669593542:819763055279] Image = 00 0 0 1 10 0 1 0 1 1 0 1 1 1 11 0 1 11 0 1 After elimination: 00 0 0 0 00 0 0 0 0 0 0 0 0 0 00 1 0 01 0 0 P independent of previous points (using prime 139) rank increases to 19 Processing point [244353456546628958634824760:-775394556680837651292166377698874734:21253933] Image = 01 0 0 0 10 0 0 0 1 1 1 1 0 0 00 1 1 00 0 0 After elimination: 00 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 11 0 0 P independent of previous points (using prime 151) rank increases to 20 Processing point [435887272311260175170207520:4712624271973109965160039085789391367:3723875] Image = 11 0 0 0 01 0 1 1 0 1 0 1 0 0 01 0 1 01 0 1 After elimination: 00 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 00 1 0 P independent of previous points (using prime 157) rank increases to 21 Processing point [386870511037825543981230636169542701637111:83015454575998684006900205726968222686505350799684:159996363164349841378621] Image = 11 1 1 0 01 0 1 0 1 1 1 1 1 0 11 0 0 00 1 1 After elimination: 00 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 0 00 0 1 P independent of previous points (using prime 163) rank increases to 22 Processing point [62160011888235162136050:10099849221189668277354753748208:24389] Image = 00 1 0 1 10 0 1 1 0 0 1 0 1 1 11 1 1 11 0 0 After elimination: 00 0 0 0 00 0 0 0 0 0 0 0 0 0 00 0 1 00 0 0 P independent of previous points (using prime 149) rank increases to 23 Points are all independent, their rank is 23 Input a curve: eclib-20250122/progs/out_ntl/list_cubics.out000066400000000000000000000272051474421343600207170ustar00rootroot00000000000000Irreducible cubics with positive discriminant up to 200, up to SL(2,Z)-equivalence 49 [ [1,2,-1,-1] [1,1,-2,-1] ] 81 [ [1,3,0,-1] [1,0,-3,-1] ] 148 [ [1,-1,-3,1] [1,1,-3,-1] ] 169 [ [1,-1,-4,-1] [1,4,1,-1] ] Irreducible cubics with positive discriminant up to 200, up to GL(2,Z)-equivalence 49 [ [1,2,-1,-1] ] 81 [ [1,3,0,-1] ] 148 [ [1,-1,-3,1] ] 169 [ [1,-1,-4,-1] ] Cubics with positive discriminant up to 200, up to SL(2,Z)-equivalence 1 [ [0,1,1,0] ] 4 [ [0,1,0,-1] ] 5 [ [0,1,-1,-1] ] 8 [ [0,1,0,-2] ] 9 [ [0,1,-1,-2] ] 12 [ [0,1,0,-3] ] 13 [ [0,1,-1,-3] ] 16 [ [0,1,0,-4] [0,2,2,0] ] 17 [ [0,1,-1,-4] ] 20 [ [0,1,0,-5] ] 21 [ [0,1,-1,-5] ] 24 [ [0,1,0,-6] ] 25 [ [0,1,-1,-6] ] 28 [ [0,1,0,-7] ] 29 [ [0,1,-1,-7] ] 32 [ [0,1,0,-8] [0,2,0,-1] ] 33 [ [0,1,-1,-8] ] 36 [ [0,1,0,-9] [0,2,-1,-1] [0,2,1,-1] ] 37 [ [0,1,-1,-9] ] 40 [ [0,1,0,-10] ] 41 [ [0,1,-1,-10] ] 44 [ [0,1,0,-11] ] 45 [ [0,1,-1,-11] ] 48 [ [0,1,0,-12] [0,2,-2,-1] ] 49 [ [0,1,-1,-12] [1,2,-1,-1] [1,1,-2,-1] ] 52 [ [0,1,0,-13] ] 53 [ [0,1,-1,-13] ] 56 [ [0,1,0,-14] ] 57 [ [0,1,-1,-14] ] 60 [ [0,1,0,-15] ] 61 [ [0,1,-1,-15] ] 64 [ [0,1,0,-16] [0,2,0,-2] ] 65 [ [0,1,-1,-16] ] 68 [ [0,1,0,-17] [0,2,-1,-2] [0,2,1,-2] ] 69 [ [0,1,-1,-17] ] 72 [ [0,1,0,-18] ] 73 [ [0,1,-1,-18] ] 76 [ [0,1,0,-19] ] 77 [ [0,1,-1,-19] ] 80 [ [0,1,0,-20] [0,2,-2,-2] ] 81 [ [0,1,-1,-20] [0,3,3,0] [1,3,0,-1] [1,0,-3,-1] ] 84 [ [0,1,0,-21] ] 85 [ [0,1,-1,-21] ] 88 [ [0,1,0,-22] ] 89 [ [0,1,-1,-22] ] 92 [ [0,1,0,-23] ] 93 [ [0,1,-1,-23] ] 96 [ [0,1,0,-24] [0,2,0,-3] ] 97 [ [0,1,-1,-24] ] 100 [ [0,1,0,-25] [0,2,-1,-3] [0,2,1,-3] ] 101 [ [0,1,-1,-25] ] 104 [ [0,1,0,-26] ] 105 [ [0,1,-1,-26] ] 108 [ [0,1,0,-27] [1,0,-3,0] ] 109 [ [0,1,-1,-27] ] 112 [ [0,1,0,-28] [0,2,-2,-3] ] 113 [ [0,1,-1,-28] ] 116 [ [0,1,0,-29] ] 117 [ [0,1,-1,-29] [0,3,-1,-1] [0,3,1,-1] ] 120 [ [0,1,0,-30] ] 121 [ [0,1,-1,-30] ] 124 [ [0,1,0,-31] ] 125 [ [0,1,-1,-31] [1,2,-2,-1] ] 128 [ [0,1,0,-32] [0,2,0,-4] ] 129 [ [0,1,-1,-32] ] 132 [ [0,1,0,-33] [0,2,-1,-4] [0,2,1,-4] ] 133 [ [0,1,-1,-33] ] 136 [ [0,1,0,-34] ] 137 [ [0,1,-1,-34] ] 140 [ [0,1,0,-35] ] 141 [ [0,1,-1,-35] ] 144 [ [0,1,0,-36] [0,2,-2,-4] [0,3,-2,-1] [0,3,2,-1] ] 145 [ [0,1,-1,-36] ] 148 [ [0,1,0,-37] [1,-1,-3,1] [1,1,-3,-1] ] 149 [ [0,1,-1,-37] ] 152 [ [0,1,0,-38] ] 153 [ [0,1,-1,-38] ] 156 [ [0,1,0,-39] ] 157 [ [0,1,-1,-39] ] 160 [ [0,1,0,-40] [0,2,0,-5] ] 161 [ [0,1,-1,-40] ] 164 [ [0,1,0,-41] [0,2,-1,-5] [0,2,1,-5] ] 165 [ [0,1,-1,-41] ] 168 [ [0,1,0,-42] ] 169 [ [0,1,-1,-42] [1,-1,-4,-1] [1,4,1,-1] ] 172 [ [0,1,0,-43] ] 173 [ [0,1,-1,-43] ] 176 [ [0,1,0,-44] [0,2,-2,-5] ] 177 [ [0,1,-1,-44] ] 180 [ [0,1,0,-45] ] 181 [ [0,1,-1,-45] ] 184 [ [0,1,0,-46] ] 185 [ [0,1,-1,-46] ] 188 [ [0,1,0,-47] ] 189 [ [0,1,-1,-47] [0,3,-3,-1] ] 192 [ [0,1,0,-48] [0,2,0,-6] ] 193 [ [0,1,-1,-48] ] 196 [ [0,1,0,-49] [0,2,-1,-6] [0,2,1,-6] ] 197 [ [0,1,-1,-49] ] 200 [ [0,1,0,-50] ] Cubics with positive discriminant up to 200, up to GL(2,Z)-equivalence 1 [ [0,1,1,0] ] 4 [ [0,1,0,-1] ] 5 [ [0,1,-1,-1] ] 8 [ [0,1,0,-2] ] 9 [ [0,1,-1,-2] ] 12 [ [0,1,0,-3] ] 13 [ [0,1,-1,-3] ] 16 [ [0,1,0,-4] [0,2,2,0] ] 17 [ [0,1,-1,-4] ] 20 [ [0,1,0,-5] ] 21 [ [0,1,-1,-5] ] 24 [ [0,1,0,-6] ] 25 [ [0,1,-1,-6] ] 28 [ [0,1,0,-7] ] 29 [ [0,1,-1,-7] ] 32 [ [0,1,0,-8] [0,2,0,-1] ] 33 [ [0,1,-1,-8] ] 36 [ [0,1,0,-9] [0,2,-1,-1] ] 37 [ [0,1,-1,-9] ] 40 [ [0,1,0,-10] ] 41 [ [0,1,-1,-10] ] 44 [ [0,1,0,-11] ] 45 [ [0,1,-1,-11] ] 48 [ [0,1,0,-12] [0,2,-2,-1] ] 49 [ [0,1,-1,-12] [1,2,-1,-1] ] 52 [ [0,1,0,-13] ] 53 [ [0,1,-1,-13] ] 56 [ [0,1,0,-14] ] 57 [ [0,1,-1,-14] ] 60 [ [0,1,0,-15] ] 61 [ [0,1,-1,-15] ] 64 [ [0,1,0,-16] [0,2,0,-2] ] 65 [ [0,1,-1,-16] ] 68 [ [0,1,0,-17] [0,2,-1,-2] ] 69 [ [0,1,-1,-17] ] 72 [ [0,1,0,-18] ] 73 [ [0,1,-1,-18] ] 76 [ [0,1,0,-19] ] 77 [ [0,1,-1,-19] ] 80 [ [0,1,0,-20] [0,2,-2,-2] ] 81 [ [0,1,-1,-20] [0,3,3,0] [1,3,0,-1] ] 84 [ [0,1,0,-21] ] 85 [ [0,1,-1,-21] ] 88 [ [0,1,0,-22] ] 89 [ [0,1,-1,-22] ] 92 [ [0,1,0,-23] ] 93 [ [0,1,-1,-23] ] 96 [ [0,1,0,-24] [0,2,0,-3] ] 97 [ [0,1,-1,-24] ] 100 [ [0,1,0,-25] [0,2,-1,-3] ] 101 [ [0,1,-1,-25] ] 104 [ [0,1,0,-26] ] 105 [ [0,1,-1,-26] ] 108 [ [0,1,0,-27] [1,0,-3,0] ] 109 [ [0,1,-1,-27] ] 112 [ [0,1,0,-28] [0,2,-2,-3] ] 113 [ [0,1,-1,-28] ] 116 [ [0,1,0,-29] ] 117 [ [0,1,-1,-29] [0,3,-1,-1] ] 120 [ [0,1,0,-30] ] 121 [ [0,1,-1,-30] ] 124 [ [0,1,0,-31] ] 125 [ [0,1,-1,-31] [1,2,-2,-1] ] 128 [ [0,1,0,-32] [0,2,0,-4] ] 129 [ [0,1,-1,-32] ] 132 [ [0,1,0,-33] [0,2,-1,-4] ] 133 [ [0,1,-1,-33] ] 136 [ [0,1,0,-34] ] 137 [ [0,1,-1,-34] ] 140 [ [0,1,0,-35] ] 141 [ [0,1,-1,-35] ] 144 [ [0,1,0,-36] [0,2,-2,-4] [0,3,-2,-1] ] 145 [ [0,1,-1,-36] ] 148 [ [0,1,0,-37] [1,-1,-3,1] ] 149 [ [0,1,-1,-37] ] 152 [ [0,1,0,-38] ] 153 [ [0,1,-1,-38] ] 156 [ [0,1,0,-39] ] 157 [ [0,1,-1,-39] ] 160 [ [0,1,0,-40] [0,2,0,-5] ] 161 [ [0,1,-1,-40] ] 164 [ [0,1,0,-41] [0,2,-1,-5] ] 165 [ [0,1,-1,-41] ] 168 [ [0,1,0,-42] ] 169 [ [0,1,-1,-42] [1,-1,-4,-1] ] 172 [ [0,1,0,-43] ] 173 [ [0,1,-1,-43] ] 176 [ [0,1,0,-44] [0,2,-2,-5] ] 177 [ [0,1,-1,-44] ] 180 [ [0,1,0,-45] ] 181 [ [0,1,-1,-45] ] 184 [ [0,1,0,-46] ] 185 [ [0,1,-1,-46] ] 188 [ [0,1,0,-47] ] 189 [ [0,1,-1,-47] [0,3,-3,-1] ] 192 [ [0,1,0,-48] [0,2,0,-6] ] 193 [ [0,1,-1,-48] ] 196 [ [0,1,0,-49] [0,2,-1,-6] ] 197 [ [0,1,-1,-49] ] 200 [ [0,1,0,-50] ] Irreducible cubics with negative discriminant down to -200, up to SL(2,Z)-equivalence -23 [ [1,-1,0,1] [1,1,0,-1] ] -31 [ [1,1,0,1] [1,-1,0,-1] ] -44 [ [1,-1,1,1] [1,1,1,-1] ] -59 [ [1,2,0,1] [1,-2,0,-1] ] -76 [ [1,-1,3,-1] [1,1,3,1] ] -83 [ [1,-1,1,-2] [1,1,1,2] ] -87 [ [1,1,2,-1] [1,-1,2,1] ] -104 [ [1,0,-1,2] [1,0,-1,-2] ] -107 [ [1,2,4,1] [1,-2,4,-1] ] -108 [ [1,0,0,2] [1,0,0,-2] ] -116 [ [1,-1,0,-2] [1,1,0,2] ] -135 [ [1,0,3,-1] [1,0,3,1] ] -139 [ [1,-1,1,2] [1,1,1,-2] ] -140 [ [1,0,2,2] [1,0,2,-2] ] -152 [ [1,-1,-2,-2] [1,1,-2,2] ] -172 [ [1,2,0,2] [1,-2,0,-2] ] -175 [ [1,2,3,-1] [1,-2,3,1] ] -176 [ [1,-1,3,1] [1,1,3,-1] ] -199 [ [1,1,4,1] [1,-1,4,-1] ] -200 [ [1,-1,2,2] [1,1,2,-2] ] Irreducible cubics with negative discriminant down to -200, up to GL(2,Z)-equivalence -23 [ [1,-1,0,1] ] -31 [ [1,1,0,1] ] -44 [ [1,-1,1,1] ] -59 [ [1,2,0,1] ] -76 [ [1,-1,3,-1] ] -83 [ [1,-1,1,-2] ] -87 [ [1,1,2,-1] ] -104 [ [1,0,-1,2] ] -107 [ [1,2,4,1] ] -108 [ [1,0,0,2] ] -116 [ [1,-1,0,-2] ] -135 [ [1,0,3,-1] ] -139 [ [1,-1,1,2] ] -140 [ [1,0,2,2] ] -152 [ [1,-1,-2,-2] ] -172 [ [1,2,0,2] ] -175 [ [1,2,3,-1] ] -176 [ [1,-1,3,1] ] -199 [ [1,1,4,1] ] -200 [ [1,-1,2,2] ] Cubics with negative discriminant down to -200, up to SL(2,Z)-equivalence -3 [ [0,1,1,1] ] -4 [ [0,1,0,1] ] -7 [ [0,1,1,2] ] -8 [ [0,1,0,2] ] -11 [ [0,1,1,3] ] -12 [ [0,1,0,3] ] -15 [ [0,1,1,4] ] -16 [ [0,1,0,4] [1,2,2,0] ] -19 [ [0,1,1,5] ] -20 [ [0,1,0,5] ] -23 [ [0,1,1,6] [1,-1,0,1] [1,1,0,-1] ] -24 [ [0,1,0,6] ] -27 [ [0,1,1,7] [1,0,0,1] ] -28 [ [0,1,0,7] [0,2,-1,1] [0,2,1,1] ] -31 [ [0,1,1,8] [1,1,0,1] [1,-1,0,-1] ] -32 [ [0,1,0,8] [0,2,0,1] ] -35 [ [0,1,1,9] ] -36 [ [0,1,0,9] ] -39 [ [0,1,1,10] ] -40 [ [0,1,0,10] ] -43 [ [0,1,1,11] ] -44 [ [0,1,0,11] [1,-1,1,1] [1,1,1,-1] ] -47 [ [0,1,1,12] ] -48 [ [0,1,0,12] [0,2,2,2] ] -51 [ [0,1,1,13] ] -52 [ [0,1,0,13] ] -55 [ [0,1,1,14] ] -56 [ [0,1,0,14] ] -59 [ [0,1,1,15] [1,2,0,1] [1,-2,0,-1] ] -60 [ [0,1,0,15] [0,2,-1,2] [0,2,1,2] ] -63 [ [0,1,1,16] ] -64 [ [0,1,0,16] [0,2,0,2] ] -67 [ [0,1,1,17] ] -68 [ [0,1,0,17] ] -71 [ [0,1,1,18] ] -72 [ [0,1,0,18] [0,3,-2,1] [0,3,2,1] [1,2,3,0] [1,-2,3,0] ] -75 [ [0,1,1,19] ] -76 [ [0,1,0,19] [1,-1,3,-1] [1,1,3,1] ] -79 [ [0,1,1,20] ] -80 [ [0,1,0,20] [0,2,2,3] ] -83 [ [0,1,1,21] [1,-1,1,-2] [1,1,1,2] ] -84 [ [0,1,0,21] ] -87 [ [0,1,1,22] [1,1,2,-1] [1,-1,2,1] ] -88 [ [0,1,0,22] ] -91 [ [0,1,1,23] ] -92 [ [0,1,0,23] [0,2,-1,3] [0,2,1,3] ] -95 [ [0,1,1,24] ] -96 [ [0,1,0,24] [0,2,0,3] ] -99 [ [0,1,1,25] [0,3,-1,1] [0,3,1,1] [1,-1,3,0] [1,1,3,0] ] -100 [ [0,1,0,25] [1,-1,0,2] [1,1,0,-2] ] -103 [ [0,1,1,26] ] -104 [ [0,1,0,26] [1,0,-1,2] [1,0,-1,-2] ] -107 [ [0,1,1,27] [1,2,4,1] [1,-2,4,-1] ] -108 [ [0,1,0,27] [1,0,3,0] [1,0,0,2] [1,0,0,-2] ] -111 [ [0,1,1,28] ] -112 [ [0,1,0,28] [0,2,2,4] [1,0,1,2] [1,0,1,-2] ] -115 [ [0,1,1,29] ] -116 [ [0,1,0,29] [1,-1,0,-2] [1,1,0,2] ] -119 [ [0,1,1,30] ] -120 [ [0,1,0,30] ] -123 [ [0,1,1,31] ] -124 [ [0,1,0,31] [0,2,-1,4] [0,2,1,4] ] -127 [ [0,1,1,32] ] -128 [ [0,1,0,32] [0,2,0,4] ] -131 [ [0,1,1,33] ] -132 [ [0,1,0,33] ] -135 [ [0,1,1,34] [0,3,3,2] [1,0,3,-1] [1,0,3,1] ] -136 [ [0,1,0,34] ] -139 [ [0,1,1,35] [1,-1,1,2] [1,1,1,-2] ] -140 [ [0,1,0,35] [1,0,2,2] [1,0,2,-2] ] -143 [ [0,1,1,36] ] -144 [ [0,1,0,36] [0,2,2,5] ] -147 [ [0,1,1,37] [1,-1,-1,-2] [1,1,-1,2] ] -148 [ [0,1,0,37] ] -151 [ [0,1,1,38] ] -152 [ [0,1,0,38] [1,-1,-2,-2] [1,1,-2,2] ] -155 [ [0,1,1,39] ] -156 [ [0,1,0,39] [0,2,-1,5] [0,2,1,5] ] -159 [ [0,1,1,40] ] -160 [ [0,1,0,40] [0,2,0,5] ] -163 [ [0,1,1,41] ] -164 [ [0,1,0,41] ] -167 [ [0,1,1,42] ] -168 [ [0,1,0,42] ] -171 [ [0,1,1,43] ] -172 [ [0,1,0,43] [1,2,0,2] [1,-2,0,-2] ] -175 [ [0,1,1,44] [1,2,3,-1] [1,-2,3,1] ] -176 [ [0,1,0,44] [0,2,2,6] [1,-1,3,1] [1,1,3,-1] ] -179 [ [0,1,1,45] ] -180 [ [0,1,0,45] [0,3,-2,2] [0,3,2,2] ] -183 [ [0,1,1,46] ] -184 [ [0,1,0,46] ] -187 [ [0,1,1,47] ] -188 [ [0,1,0,47] [0,2,-1,6] [0,2,1,6] ] -191 [ [0,1,1,48] ] -192 [ [0,1,0,48] [0,2,0,6] [0,4,-2,1] [0,4,2,1] [1,2,4,0] [1,-2,4,0] ] -195 [ [0,1,1,49] ] -196 [ [0,1,0,49] ] -199 [ [0,1,1,50] [1,1,4,1] [1,-1,4,-1] ] -200 [ [0,1,0,50] [1,-1,2,2] [1,1,2,-2] ] Cubics with negative discriminant down to -200, up to GL(2,Z)-equivalence -3 [ [0,1,1,1] ] -4 [ [0,1,0,1] ] -7 [ [0,1,1,2] ] -8 [ [0,1,0,2] ] -11 [ [0,1,1,3] ] -12 [ [0,1,0,3] ] -15 [ [0,1,1,4] ] -16 [ [0,1,0,4] [1,2,2,0] ] -19 [ [0,1,1,5] ] -20 [ [0,1,0,5] ] -23 [ [0,1,1,6] [1,-1,0,1] ] -24 [ [0,1,0,6] ] -27 [ [0,1,1,7] [1,0,0,1] ] -28 [ [0,1,0,7] [0,2,-1,1] ] -31 [ [0,1,1,8] [1,1,0,1] ] -32 [ [0,1,0,8] [0,2,0,1] ] -35 [ [0,1,1,9] ] -36 [ [0,1,0,9] ] -39 [ [0,1,1,10] ] -40 [ [0,1,0,10] ] -43 [ [0,1,1,11] ] -44 [ [0,1,0,11] [1,-1,1,1] ] -47 [ [0,1,1,12] ] -48 [ [0,1,0,12] [0,2,2,2] ] -51 [ [0,1,1,13] ] -52 [ [0,1,0,13] ] -55 [ [0,1,1,14] ] -56 [ [0,1,0,14] ] -59 [ [0,1,1,15] [1,2,0,1] ] -60 [ [0,1,0,15] [0,2,-1,2] ] -63 [ [0,1,1,16] ] -64 [ [0,1,0,16] [0,2,0,2] ] -67 [ [0,1,1,17] ] -68 [ [0,1,0,17] ] -71 [ [0,1,1,18] ] -72 [ [0,1,0,18] [0,3,-2,1] [1,2,3,0] ] -75 [ [0,1,1,19] ] -76 [ [0,1,0,19] [1,-1,3,-1] ] -79 [ [0,1,1,20] ] -80 [ [0,1,0,20] [0,2,2,3] ] -83 [ [0,1,1,21] [1,-1,1,-2] ] -84 [ [0,1,0,21] ] -87 [ [0,1,1,22] [1,1,2,-1] ] -88 [ [0,1,0,22] ] -91 [ [0,1,1,23] ] -92 [ [0,1,0,23] [0,2,-1,3] ] -95 [ [0,1,1,24] ] -96 [ [0,1,0,24] [0,2,0,3] ] -99 [ [0,1,1,25] [0,3,-1,1] [1,-1,3,0] ] -100 [ [0,1,0,25] [1,-1,0,2] ] -103 [ [0,1,1,26] ] -104 [ [0,1,0,26] [1,0,-1,2] ] -107 [ [0,1,1,27] [1,2,4,1] ] -108 [ [0,1,0,27] [1,0,3,0] [1,0,0,2] ] -111 [ [0,1,1,28] ] -112 [ [0,1,0,28] [0,2,2,4] [1,0,1,2] ] -115 [ [0,1,1,29] ] -116 [ [0,1,0,29] [1,-1,0,-2] ] -119 [ [0,1,1,30] ] -120 [ [0,1,0,30] ] -123 [ [0,1,1,31] ] -124 [ [0,1,0,31] [0,2,-1,4] ] -127 [ [0,1,1,32] ] -128 [ [0,1,0,32] [0,2,0,4] ] -131 [ [0,1,1,33] ] -132 [ [0,1,0,33] ] -135 [ [0,1,1,34] [0,3,3,2] [1,0,3,-1] ] -136 [ [0,1,0,34] ] -139 [ [0,1,1,35] [1,-1,1,2] ] -140 [ [0,1,0,35] [1,0,2,2] ] -143 [ [0,1,1,36] ] -144 [ [0,1,0,36] [0,2,2,5] ] -147 [ [0,1,1,37] [1,-1,-1,-2] ] -148 [ [0,1,0,37] ] -151 [ [0,1,1,38] ] -152 [ [0,1,0,38] [1,-1,-2,-2] ] -155 [ [0,1,1,39] ] -156 [ [0,1,0,39] [0,2,-1,5] ] -159 [ [0,1,1,40] ] -160 [ [0,1,0,40] [0,2,0,5] ] -163 [ [0,1,1,41] ] -164 [ [0,1,0,41] ] -167 [ [0,1,1,42] ] -168 [ [0,1,0,42] ] -171 [ [0,1,1,43] ] -172 [ [0,1,0,43] [1,2,0,2] ] -175 [ [0,1,1,44] [1,2,3,-1] ] -176 [ [0,1,0,44] [0,2,2,6] [1,-1,3,1] ] -179 [ [0,1,1,45] ] -180 [ [0,1,0,45] [0,3,-2,2] ] -183 [ [0,1,1,46] ] -184 [ [0,1,0,46] ] -187 [ [0,1,1,47] ] -188 [ [0,1,0,47] [0,2,-1,6] ] -191 [ [0,1,1,48] ] -192 [ [0,1,0,48] [0,2,0,6] [0,4,-2,1] [1,2,4,0] ] -195 [ [0,1,1,49] ] -196 [ [0,1,0,49] ] -199 [ [0,1,1,50] [1,1,4,1] ] -200 [ [0,1,0,50] [1,-1,2,2] ] eclib-20250122/progs/out_ntl/moreap.out000066400000000000000000000023641474421343600176760ustar00rootroot00000000000000Program moreap --------------- For each N, assumes that the file newforms/xN exists, and computes more Hecke eigenvalues. Output new eigs to file (1/0)? Output new eigs to screen (1/0)? Display newforms (1/0)? Attempt curve construction (1/0)? Enter level: How many primes for Hecke eigenvalues? >>>Level 11 Retrieving newform data for N = 11 Finished reading newform data for N = 11 1 newform(s) at level 11: p0=2 #ap= 100 1: aplist = [ -2 -1 1 -2 1 4 -2 0 -1 0 7 3 -8 -6 8 -6 5 12 -7 -3 ...] aq = [ -1 ] ap0 = -2, dp0 = 2, np0 = 5 SFE = 1, L/P = 2/5 lplus = 1, mplus = 1 lminus = 3, mminus = 2 [(4,1;1,3),1,1;1] Making homspace...Constructing H1 (with sign=+1) ...done done. Making form_finder (nap=100)...Recovering eigenspace bases with form_finder... Form number 1 with eigs -2 -1 1 -2 -1 4 -2 0 -1 0 ... Entering form_finder, depth = 0, dimension 2 restarting at depth = 0, dimension 2 Computing T(2)...done. eig -2 gives new subspace at depth 1 of dimension 1 Filling in data for for newform #1: bases...type and cuspidal factors...cuspidalfactorplus = 5 coords...denomplus = 5 done. Finished filling in data for newform #1 ...done. About to start computing ap......done. Computing 1 curves... 1 [0,-1,1,-10,-20] N = 11 All curves found OK Enter level: eclib-20250122/progs/out_ntl/mwrank.out000066400000000000000000000272601474421343600177140ustar00rootroot00000000000000Curve [0,1,1,-2,0] : Basic pair: I=112, J=-1712 disc=2688768 2-adic index bound = 2 By Lemma 5.1(a), 2-adic index = 1 2-adic index = 1 One (I,J) pair Looking for quartics with I = 112, J = -1712 Looking for Type 2 quartics: Trying positive a from 1 up to 2 (square a first...) (1,0,-8,4,4) --nontrivial...(x:y:z) = (1 : 1 : 0) Point = [1:0:1] height = 0.47671165934374 Rank of B=im(eps) increases to 1 Trying positive a from 1 up to 2 (...then non-square a) Trying negative a from -1 down to -1 Finished looking for Type 2 quartics. Looking for Type 1 quartics: Trying positive a from 1 up to 3 (square a first...) (1,0,4,12,8) --nontrivial...(x:y:z) = (1 : 1 : 0) Point = [-1:1:1] height = 0.68666708330559 Rank of B=im(eps) increases to 2 (The previous point is on the egg) Exiting search for Type 1 quartics after finding one which is globally soluble. Mordell rank contribution from B=im(eps) = 2 Selmer rank contribution from B=im(eps) = 2 Sha rank contribution from B=im(eps) = 0 Mordell rank contribution from A=ker(eps) = 0 Selmer rank contribution from A=ker(eps) = 0 Sha rank contribution from A=ker(eps) = 0 Used full 2-descent via multiplication-by-2 map Rank = 2 Rank of S^2(E) = 2 Searching for points (bound = 8)...done: found points which generate a subgroup of rank 2 and regulator 0.15246017794314 Processing points found during 2-descent...done: now regulator = 0.15246017794314 Saturating (with bound = 1000)...done: points were already saturated. Transferring points from minimal curve [0,1,1,-2,0] back to original curve [0,1,1,-2,0] Generator 1 is [0:-1:1]; height 0.3270007736516 Generator 2 is [-1:1:1]; height 0.68666708330559 Regulator = 0.15246017794314 The rank and full Mordell-Weil basis have been determined unconditionally. Curve [0,0,0,0,-675/4] : integral model = [0,0,0,0,-10800] with scale factor 2 Working with minimal curve [0,0,1,0,-169] via [u,r,s,t] = [2,0,0,4] Basic pair: I=0, J=291600 disc=-85030560000 2-adic index bound = 2 By Lemma 5.1(a), 2-adic index = 1 2-adic index = 1 One (I,J) pair Looking for quartics with I = 0, J = 291600 Looking for Type 3 quartics: Trying positive a from 1 up to 12 (square a first...) Trying positive a from 1 up to 12 (...then non-square a) (2,-2,-78,298,-328) --trivial Trying negative a from -1 down to -19 (-3,0,0,60,0) --trivial (-7,-4,12,44,8) --trivial (-7,12,36,36,0) --trivial (-7,-13,-42,-28,8) --trivial Finished looking for Type 3 quartics. Mordell rank contribution from B=im(eps) = 0 Selmer rank contribution from B=im(eps) = 0 Sha rank contribution from B=im(eps) = 0 Mordell rank contribution from A=ker(eps) = 0 Selmer rank contribution from A=ker(eps) = 0 Sha rank contribution from A=ker(eps) = 0 Used full 2-descent via multiplication-by-2 map Rank = 0 Rank of S^2(E) = 0 Processing points found during 2-descent...done: now regulator = 1 Regulator = 1 The rank and full Mordell-Weil basis have been determined unconditionally. Curve [0,0,0,0,73/64] : integral model = [0,0,0,0,73] with scale factor 2 Basic pair: I=0, J=-1971 disc=-3884841 2-adic index bound = 2 2-adic index = 2 Two (I,J) pairs Looking for quartics with I = 0, J = -1971 Looking for Type 3 quartics: Trying positive a from 1 up to 3 (square a first...) (1,0,6,3,-3) --nontrivial...(x:y:z) = (1 : 1 : 0) Point = [-4:3:1] height = 0.96257318809238 Rank of B=im(eps) increases to 1 Trying positive a from 1 up to 3 (...then non-square a) Trying negative a from -1 down to -2 Finished looking for Type 3 quartics. Looking for quartics with I = 0, J = -126144 Looking for Type 3 quartics: Trying positive a from 1 up to 14 (square a first...) (1,0,-12,72,-12) --nontrivial...(x:y:z) = (1 : 1 : 0) Point = [2:9:1] height = 0.9239431716004 Doubling global 2-adic index to 2 global 2-adic index is equal to local index so we abort the search for large quartics Rank of B=im(eps) increases to 2 Exiting search for large quartics after finding enough globally soluble ones. Mordell rank contribution from B=im(eps) = 2 Selmer rank contribution from B=im(eps) = 2 Sha rank contribution from B=im(eps) = 0 Mordell rank contribution from A=ker(eps) = 0 Selmer rank contribution from A=ker(eps) = 0 Sha rank contribution from A=ker(eps) = 0 Used full 2-descent via multiplication-by-2 map Rank = 2 Rank of S^2(E) = 2 Searching for points (bound = 8)...done: found points which generate a subgroup of rank 2 and regulator 0.88654328868772 Processing points found during 2-descent...done: now regulator = 0.88654328868772 Saturating (with bound = 1000)...done: points were already saturated. Transferring points from minimal curve [0,0,0,0,73] back to original curve [0,0,0,0,73/64] Generator 1 is [-8:3:8]; height 0.96257318809238 Generator 2 is [4:9:8]; height 0.9239431716004 Regulator = 0.88654328868772 The rank and full Mordell-Weil basis have been determined unconditionally. Curve [0,0,0,677,0] : 1 points of order 2: [0:0:1] Using 2-isogenous curve [0,0,0,-2708,0] ------------------------------------------------------- First step, determining 1st descent Selmer groups ------------------------------------------------------- After first local descent, rank bound = 1 rk(S^{phi}(E'))= 1 rk(S^{phi'}(E))= 2 ------------------------------------------------------- Second step, determining 2nd descent Selmer groups ------------------------------------------------------- After second local descent, rank bound = 1 rk(phi'(S^{2}(E)))= 1 rk(phi(S^{2}(E')))= 2 rk(S^{2}(E))= 2 rk(S^{2}(E'))= 2 Third step, determining E(Q)/phi(E'(Q)) and E'(Q)/phi'(E(Q)) ------------------------------------------------------- 1. E(Q)/phi(E'(Q)) ------------------------------------------------------- (c,d) =(0,677) (c',d')=(0,-2708) This component of the rank is 0 ------------------------------------------------------- 2. E'(Q)/phi'(E(Q)) ------------------------------------------------------- First stage (no second descent yet)... (-1,0,0,0,2708): (x:y:z) = (502:279022:85) Curve E' Point [-21420340:-140069044:614125], height = 12.39488265721 Curve E Point [830499826893070:-7145241014093919:77690502163000], height = 24.789765314421 After first global descent, this component of the rank = 2 ------------------------------------------------------- Summary of results: ------------------------------------------------------- rank(E) = 1 #E(Q)/2E(Q) = 4 Information on III(E/Q): #III(E/Q)[phi'] = 1 #III(E/Q)[2] = 1 Information on III(E'/Q): #phi'(III(E/Q)[2]) = 1 #III(E'/Q)[phi] = 1 #III(E'/Q)[2] = 1 ------------------------------------------------------- List of points on E = [0,0,0,677,0]: I. Points on E mod phi(E') --none (modulo torsion). II. Points on phi(E') mod 2E Point [830499826893070:-7145241014093919:77690502163000], height = 24.789765314421 ------------------------------------------------------- Computing full set of 2 coset representatives for 2E(Q) in E(Q) (modulo torsion), and sorting into height order....done. Used descent via 2-isogeny with isogenous curve E' = [0,0,0,-2708,0] Rank = 1 Rank of S^2(E) = 2 Rank of S^2(E') = 2 Rank of S^phi(E') = 1 Rank of S^phi'(E) = 2 Searching for points (bound = 8)...done: found points which generate a subgroup of rank 0 and regulator 1 Processing points found during 2-descent...done: 2-descent increases rank to 1, now regulator = 24.789765314421 Saturating (with bound = 1000)...done: points were already saturated. Transferring points from minimal curve [0,0,0,677,0] back to original curve [0,0,0,677,0] Generator 1 is [830499826893070:-7145241014093919:77690502163000]; height 24.789765314421 Regulator = 24.789765314421 The rank and full Mordell-Weil basis have been determined unconditionally. Curve [0,0,0,-169,0] : 3 points of order 2: [-13:0:1], [0:0:1], [13:0:1] **************************** * Using 2-isogeny number 1 * **************************** Using 2-isogenous curve [0,78,0,169,0] (minimal model [0,0,0,-1859,30758]) ------------------------------------------------------- First step, determining 1st descent Selmer groups ------------------------------------------------------- After first local descent, rank bound = 1 rk(S^{phi}(E'))= 2 rk(S^{phi'}(E))= 1 ------------------------------------------------------- Second step, determining 2nd descent Selmer groups ------------------------------------------------------- After second local descent, rank bound = 1 rk(phi'(S^{2}(E)))= 2 rk(phi(S^{2}(E')))= 1 rk(S^{2}(E))= 3 rk(S^{2}(E'))= 2 **************************** * Using 2-isogeny number 2 * **************************** Using 2-isogenous curve [0,0,0,676,0] ------------------------------------------------------- First step, determining 1st descent Selmer groups ------------------------------------------------------- After first local descent, rank bound = 1 rk(S^{phi}(E'))= 2 rk(S^{phi'}(E))= 1 ------------------------------------------------------- Second step, determining 2nd descent Selmer groups ------------------------------------------------------- After second local descent, rank bound = 1 rk(phi'(S^{2}(E)))= 2 rk(phi(S^{2}(E')))= 1 rk(S^{2}(E))= 3 rk(S^{2}(E'))= 2 **************************** * Using 2-isogeny number 3 * **************************** Using 2-isogenous curve [0,-78,0,169,0] (minimal model [0,0,0,-1859,-30758]) ------------------------------------------------------- First step, determining 1st descent Selmer groups ------------------------------------------------------- After first local descent, rank bound = 1 rk(S^{phi}(E'))= 3 rk(S^{phi'}(E))= 0 ------------------------------------------------------- Second step, determining 2nd descent Selmer groups ------------------------------------------------------- After second local descent, rank bound = 1 rk(phi'(S^{2}(E)))= 3 rk(phi(S^{2}(E')))= 0 rk(S^{2}(E))= 3 rk(S^{2}(E'))= 2 After second local descent, combined upper bound on rank = 1 Third step, determining E(Q)/phi(E'(Q)) and E'(Q)/phi'(E(Q)) ------------------------------------------------------- 1. E(Q)/phi(E'(Q)) ------------------------------------------------------- (c,d) =(39,338) (c',d')=(-78,169) First stage (no second descent yet)... (-1,0,39,0,-338): (x:y:z) = (19:102:5) Curve E Point [-1805:-1938:125], height = 5.8325117369877 After first global descent, this component of the rank = 3 ------------------------------------------------------- 2. E'(Q)/phi'(E(Q)) ------------------------------------------------------- This component of the rank is 0 ------------------------------------------------------- Summary of results: ------------------------------------------------------- rank(E) = 1 #E(Q)/2E(Q) = 8 Information on III(E/Q): #III(E/Q)[phi'] = 1 #III(E/Q)[2] = 1 Information on III(E'/Q): #phi'(III(E/Q)[2]) = 1 #III(E'/Q)[phi] = 1 #III(E'/Q)[2] = 1 ------------------------------------------------------- List of points on E = [0,0,0,-169,0]: I. Points on E mod phi(E') Point [-180:-1938:125], height = 5.8325117369877 II. Points on phi(E') mod 2E --none (modulo torsion). ------------------------------------------------------- Computing full set of 2 coset representatives for 2E(Q) in E(Q) (modulo torsion), and sorting into height order....done. Used descent via 2-isogeny with isogenous curve E' = [0,0,0,-1859,-30758] Rank = 1 Rank of S^2(E) = 3 Rank of S^2(E') = 2 Rank of S^phi(E') = 3 Rank of S^phi'(E) = 0 Searching for points (bound = 8)...done: found points which generate a subgroup of rank 1 and regulator 5.8325117369877 Processing points found during 2-descent...done: now regulator = 5.8325117369877 Saturating (with bound = 1000)...done: points were already saturated. Transferring points from minimal curve [0,0,0,-169,0] back to original curve [0,0,0,-169,0] Generator 1 is [-180:1938:125]; height 5.8325117369877 Regulator = 5.8325117369877 The rank and full Mordell-Weil basis have been determined unconditionally. eclib-20250122/progs/out_ntl/nfcount.out000066400000000000000000000011401474421343600200560ustar00rootroot00000000000000Verbose? (0/1) Enter first and last N: >>> Level 50 <<< 2 newform(s), 100 eigs on file. >>> Level 51 <<< 1 newform(s), 100 eigs on file. >>> Level 52 <<< 1 newform(s), 100 eigs on file. >>> Level 53 <<< 1 newform(s), 100 eigs on file. >>> Level 54 <<< 2 newform(s), 100 eigs on file. >>> Level 55 <<< 1 newform(s), 100 eigs on file. >>> Level 56 <<< 2 newform(s), 100 eigs on file. >>> Level 57 <<< 3 newform(s), 100 eigs on file. >>> Level 58 <<< 2 newform(s), 100 eigs on file. >>> Level 59 <<< 0 newform(s), 0 eigs on file. >>> Level 60 <<< 0 newform(s), 0 eigs on file. 15 newform(s) in range 50...60 eclib-20250122/progs/out_ntl/nfhpcurve.out000066400000000000000000000106761474421343600204200ustar00rootroot00000000000000Program nfhpcurve. Using METHOD = 2 to find newforms MODULUS for linear algebra = 1073741789 Verbose output? How many primes for Hecke eigenvalues? Output newforms to file? (0/1) Output curves to file? (0/1) Enter level: >>>Level 11: 1 newform(s) found. Computing 1 curves... 1 [0,-1,1,-10,-20] N = 11 [(4,1;1,3),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.11 All curves found successfully! Finished level 11 Enter level: >>>Level 19: 1 newform(s) found. Computing 1 curves... 1 [0,1,1,-9,-15] N = 19 [(5,1;1,4),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.19 All curves found successfully! Finished level 19 Enter level: >>>Level 37: 2 newform(s) found. Computing 2 curves... 1 [0,0,1,-1,0] N = 37 [(14,1;3,8),1,1;2] 2 [0,1,1,-23,-50] N = 37 [(15,1;2,5),1,1;2] Finished finding curves. Outputting curves to ./tcurves/curves.37 All curves found successfully! Finished level 37 Enter level: >>>Level 50: 2 newform(s) found. Computing 2 curves... 1 [1,0,1,-1,-2] N = 50 [(17,1;1,3),1,1;1] 2 [1,1,1,-3,1] N = 50 [(17,1;1,3),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.50 All curves found successfully! Finished level 50 Enter level: >>>Level 51: 1 newform(s) found. Computing 1 curves... 1 [0,1,1,1,-1] N = 51 [(13,1;1,4),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.51 All curves found successfully! Finished level 51 Enter level: >>>Level 52: 1 newform(s) found. Computing 1 curves... 1 [0,0,0,1,-10] N = 52 [(21,1;2,5),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.52 All curves found successfully! Finished level 52 Enter level: >>>Level 53: 1 newform(s) found. Computing 1 curves... 1 [1,-1,1,0,0] N = 53 [(-21,1;-2,5),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.53 All curves found successfully! Finished level 53 Enter level: >>>Level 54: 2 newform(s) found. Computing 2 curves... 1 [1,-1,0,12,8] N = 54 [(11,1;1,5),1,1;1] 2 [1,-1,1,1,-1] N = 54 [(11,1;1,5),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.54 All curves found successfully! Finished level 54 Enter level: >>>Level 55: 1 newform(s) found. Computing 1 curves... 1 [1,-1,0,1,0] N = 55 [(14,1;1,4),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.55 All curves found successfully! Finished level 55 Enter level: >>>Level 56: 2 newform(s) found. Computing 2 curves... 1 [0,0,0,1,2] N = 56 [(19,1;1,3),1,1;1] 2 [0,-1,0,0,-4] N = 56 [(19,1;1,3),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.56 All curves found successfully! Finished level 56 Enter level: >>>Level 57: 3 newform(s) found. Computing 3 curves... 1 [0,-1,1,-2,2] N = 57 [(23,1;2,5),1,1;1] 2 [0,1,1,20,-32] N = 57 [(23,1;2,5),1,1;1] 3 [1,0,1,-7,5] N = 57 [(23,1;2,5),1,1;2] Finished finding curves. Outputting curves to ./tcurves/curves.57 All curves found successfully! Finished level 57 Enter level: >>>Level 58: 2 newform(s) found. Computing 2 curves... 1 [1,-1,0,-1,1] N = 58 [(-23,1;-2,5),1,1;1] 2 [1,1,1,5,9] N = 58 [(-23,1;-2,5),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.58 All curves found successfully! Finished level 58 Enter level: >>>Level 59: 0 newform(s) found. No newforms. Finished level 59 Enter level: >>>Level 60: 0 newform(s) found. No newforms. Finished level 60 Enter level: >>>Level 73: 1 newform(s) found. Computing 1 curves... 1 [1,-1,0,4,-3] N = 73 [(-29,1;-2,5),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.73 All curves found successfully! Finished level 73 Enter level: >>>Level 77: 3 newform(s) found. Computing 3 curves... 1 [0,0,1,2,0] N = 77 [(31,1;2,5),1,1;1] 2 [0,1,1,-49,600] N = 77 [(26,1;1,3),2,2;1] 3 [1,1,0,4,11] N = 77 [(26,1;1,3),1,1;1] Finished finding curves. Outputting curves to ./tcurves/curves.77 All curves found successfully! Finished level 77 Enter level: >>>Level 90: 3 newform(s) found. Computing 3 curves... 1 [1,-1,0,6,0] N = 90 [(-77,2;-3,7),1,1;1] 2 [1,-1,1,-8,11] N = 90 [(-77,2;-3,7),1,1;1] 3 [1,-1,1,13,-61] N = 90 [(13,1;1,7),2,2;1] Finished finding curves. Outputting curves to ./tcurves/curves.90 All curves found successfully! Finished level 90 Enter level: >>>Level 389: 1 newform(s) found. Computing 1 curves... 1 [0,1,1,-2,0] N = 389 [(-111,1;-2,7),1,1;2] Finished finding curves. Outputting curves to ./tcurves/curves.389 All curves found successfully! Finished level 389 Enter level: eclib-20250122/progs/out_ntl/nfhpcurve_prof.out000066400000000000000000000062601474421343600214400ustar00rootroot00000000000000Program nfhpcurve. Using METHOD = 2 to find newforms MODULUS for linear algebra = 1073741789 Verbose output? How many primes for Hecke eigenvalues? Output newforms to file? (0/1) Enter level: >>>Level 11: 1 newform(s) found. Computing 1 curves... 1 [0,-1,1,-10,-20] N = 11 [(4,1;1,3),1,1;1] All curves found successfully! Finished level 11 Enter level: >>>Level 37: 2 newform(s) found. Computing 2 curves... 1 [0,0,1,-1,0] N = 37 [(14,1;3,8),1,1;2] 2 [0,1,1,-23,-50] N = 37 [(15,1;2,5),1,1;2] All curves found successfully! Finished level 37 Enter level: >>>Level 50: 2 newform(s) found. Computing 2 curves... 1 [1,0,1,-1,-2] N = 50 [(17,1;1,3),1,1;1] 2 [1,1,1,-3,1] N = 50 [(17,1;1,3),1,1;1] All curves found successfully! Finished level 50 Enter level: >>>Level 51: 1 newform(s) found. Computing 1 curves... 1 [0,1,1,1,-1] N = 51 [(13,1;1,4),1,1;1] All curves found successfully! Finished level 51 Enter level: >>>Level 52: 1 newform(s) found. Computing 1 curves... 1 [0,0,0,1,-10] N = 52 [(21,1;2,5),1,1;1] All curves found successfully! Finished level 52 Enter level: >>>Level 53: 1 newform(s) found. Computing 1 curves... 1 [1,-1,1,0,0] N = 53 [(-21,1;-2,5),1,1;1] All curves found successfully! Finished level 53 Enter level: >>>Level 54: 2 newform(s) found. Computing 2 curves... 1 [1,-1,0,12,8] N = 54 [(11,1;1,5),1,1;1] 2 [1,-1,1,1,-1] N = 54 [(11,1;1,5),1,1;1] All curves found successfully! Finished level 54 Enter level: >>>Level 55: 1 newform(s) found. Computing 1 curves... 1 [1,-1,0,1,0] N = 55 [(14,1;1,4),1,1;1] All curves found successfully! Finished level 55 Enter level: >>>Level 56: 2 newform(s) found. Computing 2 curves... 1 [0,0,0,1,2] N = 56 [(19,1;1,3),1,1;1] 2 [0,-1,0,0,-4] N = 56 [(19,1;1,3),1,1;1] All curves found successfully! Finished level 56 Enter level: >>>Level 57: 3 newform(s) found. Computing 3 curves... 1 [0,-1,1,-2,2] N = 57 [(23,1;2,5),1,1;1] 2 [0,1,1,20,-32] N = 57 [(23,1;2,5),1,1;1] 3 [1,0,1,-7,5] N = 57 [(23,1;2,5),1,1;2] All curves found successfully! Finished level 57 Enter level: >>>Level 58: 2 newform(s) found. Computing 2 curves... 1 [1,-1,0,-1,1] N = 58 [(-23,1;-2,5),1,1;1] 2 [1,1,1,5,9] N = 58 [(-23,1;-2,5),1,1;1] ******************************L(f,31)/ip = 19.99999933184035365079434 is not integral! (denom = 1496649) Using rounded value mminus=20 All curves found successfully! Finished level 58 Enter level: >>>Level 59: 0 newform(s) found. No newforms. Finished level 59 Enter level: >>>Level 60: 0 newform(s) found. No newforms. Finished level 60 Enter level: >>>Level 77: 3 newform(s) found. Computing 3 curves... 1 [0,0,1,2,0] N = 77 [(31,1;2,5),1,1;1] 2 [0,1,1,-49,600] N = 77 [(26,1;1,3),2,2;1] 3 [1,1,0,4,11] N = 77 [(26,1;1,3),1,1;1] All curves found successfully! Finished level 77 Enter level: >>>Level 90: 3 newform(s) found. Computing 3 curves... 1 [1,-1,0,6,0] N = 90 [(-77,2;-3,7),1,1;1] 2 [1,-1,1,-8,11] N = 90 [(-77,2;-3,7),1,1;1] 3 [1,-1,1,13,-61] N = 90 [(13,1;1,7),2,2;1] All curves found successfully! Finished level 90 Enter level: >>>Level 389: 1 newform(s) found. Computing 1 curves... 1 [0,1,1,-2,0] N = 389 [(-111,1;-2,7),1,1;2] All curves found successfully! Finished level 389 Enter level: eclib-20250122/progs/out_ntl/nfhpmcurve.out000066400000000000000000000006201474421343600205610ustar00rootroot00000000000000Program nfhpmcurve. Using METHOD = 2 to find newforms MODULUS for linear algebra = 1073741789 Verbose output? How many primes for Hecke eigenvalues? Output newforms to file? (0/1) Enter first and last N: >>>Level 2002: 3 newform(s) found. Computing 3 curves... 1 [1,-1,0,-691,-27531] N = 2002 2 [1,-1,0,-26,52] N = 2002 3 [1,-1,1,17,19] N = 2002 All curves found successfully! Finished level 2002 eclib-20250122/progs/out_ntl/pcurve.out000066400000000000000000000001271474421343600177120ustar00rootroot00000000000000 N = 11 1 [0,-1,1,-10,-20] N = 11 [(4,1;1,3),1,1;1] Curve = [0,-1,1,-10,-20] N = 11 eclib-20250122/progs/out_ntl/point_search.out000066400000000000000000000023721474421343600210700ustar00rootroot00000000000000Input curve [0,0,1,-7,6] Rank of points found is 3 Generator 1 is [1:-1:1]; height 0.66820516565192793503 Generator 2 is [-2:3:1]; height 1.3685725053539301121 Generator 3 is [-14:25:8]; height 2.7173593928122930897 Regulator = 0.41714355875838396982 Points have been successfully saturated [[1,-1],[-2,3],[-7/4,25/8]] Input curve [0,1,1,-2,0] Rank of points found is 2 Generator 1 is [0:-1:1]; height 0.32700077365160495184 Generator 2 is [-1:1:1]; height 0.68666708330558658572 Regulator = 0.15246017794314375162 Points have been successfully saturated [[0,-1],[-1,1]] Input curve [2/5,-1/45,1/1800,-7/810000,7/60750000] Searching on standard minimal model [0,1,1,-2,0] (points found will be transferred back at end) Transformation: [u,r,s,t] = [1,-5,-6,23] with scale factor 30 [-6:1:900] maps to [-1:1:1] on [0,1,1,-2,0], with height 0.68666708330558658572 Rank of known points is 1 with regulator 0.68666708330558658572 Rank of points found is 2 Generator 1 is [0:-1:1]; height 0.32700077365160495184 --maps back to [-75:11:13500] on input curve Generator 2 is [-2:0:1]; height 0.92075778268510239272 --maps back to [-42:7:5400] on input curve Regulator = 0.15246017794314375162 Points have been successfully saturated [[-1/180,11/13500],[-7/900,7/5400]] eclib-20250122/progs/out_ntl/qexp.out000066400000000000000000000021541474421343600173650ustar00rootroot0000000000000050a: -1,1,0,2,-3,-4,-3,5,6,0,2,2,-3,-4,12,6,0,2,-13,12,11,-10,-9,15,2,... 50b: 1,-1,0,-2,-3,4,3,5,-6,0,2,-2,-3,4,-12,-6,0,2,13,12,-11,-10,9,15,-2,... 51a: 0,1,3,-4,-3,-1,-1,-1,9,6,2,-4,-3,-7,-6,-6,6,8,-4,12,2,-10,-6,0,-16,... 52a: 0,0,2,-2,-2,-1,6,-6,8,2,10,-6,-6,4,-2,6,-10,-2,10,10,2,-4,-6,-6,2,... 53a: -1,-3,0,-4,0,-3,-3,-5,7,-7,4,5,6,-2,-2,-1,-2,-8,-12,1,-4,-1,-1,-14,1,... 54a: -1,0,3,-1,-3,-4,0,2,-6,6,5,2,-6,-10,6,9,12,8,14,0,-7,8,-3,-18,-1,... 54b: 1,0,-3,-1,3,-4,0,2,6,-6,5,2,6,-10,-6,-9,-12,8,14,0,-7,8,3,18,-1,... 55a: 1,0,1,0,-1,2,6,-4,4,6,-8,-2,2,4,-12,-2,4,-10,-16,8,14,8,-4,10,10,... 56a: 0,0,2,-1,-4,2,-6,8,0,6,8,-2,2,-4,-8,6,0,-6,-4,-8,10,16,8,-6,-6,... 56b: 0,2,-4,1,0,0,-2,-2,8,2,4,-6,-2,8,-4,-10,6,4,-12,0,-14,-8,6,10,-2,... 57a: -2,-1,-3,-5,1,2,-1,-1,-4,-2,-6,0,0,-1,-9,10,-8,-1,8,-12,-11,16,12,-6,-10,... 57b: -2,1,1,3,-3,-6,3,-1,4,-10,2,8,-8,-1,3,-6,0,7,8,12,-11,0,4,10,-2,... 57c: 1,1,-2,0,0,6,-6,-1,4,2,8,-10,-2,-4,12,-6,-12,-2,-4,0,10,0,16,-2,10,... 58a: -1,-3,-3,-2,-1,3,-4,-8,0,-1,3,-8,-2,7,11,1,-4,4,-4,-2,-12,-7,0,-6,-6,... 58b: 1,-1,1,-2,-3,-1,8,0,4,-1,-3,8,2,-11,13,-11,0,-8,-12,2,4,15,4,-10,-2,... eclib-20250122/progs/out_ntl/quartic_points.out000066400000000000000000000021641474421343600214550ustar00rootroot00000000000000Verbose? Enter quartic coefficients a,b,c,d,e ? Limit on height? I = -26356388845395184406350565808061369918064, J = -352166609661875954997390187329873130323434589147579770870730368 Minimal model for Jacobian: [1,0,1,34318214642441646362435632562579908747,3184376895814127197244886284686214848599453811643486936756] Checking local solublity in R: Checking local solublity at primes [ 2 3 5 7 11 17 67 89 139 211 281 431 443 577 647 977 1613 3863 10567 11923 15361 73277 ]: Everywhere locally soluble. Searching for points on (-76507605796482039669,0,334447602052445326228,0,150542317465449993216) up to height 6 (x:y:z) = (-4:456379274456:5) Point = [2717410306797994865322390215100882986749083600480:31945036659247177505290259298595196252256878326866123825847:541269629646463252964269919701] height = 43.74623851 Curve = [1,0,1,34318214642441646362435632562579908747,3184376895814127197244886284686214848599453811643486936756] Point = [2717410306797994865322390215100882986749083600480:31945036659247177505290259298595196252256878326866123825847:541269629646463252964269919701] height = 43.74623851 Enter quartic coefficients a,b,c,d,e ? eclib-20250122/progs/out_ntl/reduce_cubics.out000066400000000000000000000012011474421343600211770ustar00rootroot00000000000000Enter cubic coeffs a, b, c, d: Input cubic = [123,234,345,456] Discriminant = -40491312264 Using Mathews reduction ... Mathews reduced cubic = [123,234,345,456] after transform by [1,0;0,1] Using JC/Julia reduction ... JC/Julia reduced cubic = [123,-135,246,222] after transform by [1,-1;0,1] Enter cubic coeffs a, b, c, d: Input cubic = [11276,-159331,750302,-1177513] Discriminant = -104060401000 Using Mathews reduction ... Mathews reduced cubic = [83,149,294,878] after transform by [-14,-23;-3,-5] Using JC/Julia reduction ... JC/Julia reduced cubic = [83,-100,245,650] after transform by [-14,-9;-3,-2] Enter cubic coeffs a, b, c, d: eclib-20250122/progs/out_ntl/reduce_quartics.out000066400000000000000000000017021474421343600215700ustar00rootroot00000000000000Computed 78519 primes, largest is 1000253 Extra primes in list: Enter quartic coefficients a,b,c,d,e ? Quartic is (-33,-2159,-52689,-568174,-2282844) I = 73947 J = 0 Bad primes: [ 2 3 157 ] Attempting to minimize the quartic. First partial minimization without assuming local solvability: p=2: minimal already p=3: minimal already p=157: minimal already Result has coefficients: (-33,-2159,-52689,-568174,-2282844) I = 73947 J = 0 Bad primes: [ 2 3 157 ] Now check local solvability: Everywhere locally soluble Final minimization of I, J: p=2: minimal already p=3: minimal already p=157: minimal already Result has coefficients: (-33,-2159,-52689,-568174,-2282844) I = 73947 J = 0 Bad primes: [ 2 3 157 ] transform = [1,0;0,1] / 1 Attempting to reduce the quartic. Finished reducing g, new coefficients: (-33,-47,255,434,132) I = 73947 J = 0 extra reducing transform = [-17,-18;1,1] total transform = [-17,-18;1,1] / 1 OK Enter quartic coefficients a,b,c,d,e ? eclib-20250122/progs/out_ntl/solve_conic.out000066400000000000000000000664771474421343600207350ustar00rootroot00000000000000Solving ax^2 + bxz + cz^2 = dy^2 Using method 4 Enter coefficients a b c d: -113922743 0 310146482690273725409 1 Solution: (x:y:z) = (6632499416:70647575606369:5679) Solution is correct! Solution: (x:y:z) = (6632499416:70647575606369:5679) Parametric solution: x = [6632499416,837303821112076122246270,26425848118343941811659972709016629276]*[u^2,uv,v^2] y = [70647575606369,8918732034082630564118638188,281480929858691034492171567319911251675821]*[u^2,uv,v^2] z = [5679,716931597253432612,22626823170468308838277461581301]*[u^2,uv,v^2] disc(qx) = 1240585930761094901636 = 4cd disc(qz) = -455690972 = 4ad resultant(qx,qz) = 141330952159512008877688307548 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 7 0 -4 -1 Solution: (x:y:z) = (0:2:1) Solution is correct! Solution: (x:y:z) = (0:2:1) Parametric solution: x = [0,-4,0]*[u^2,uv,v^2] y = [2,0,-14]*[u^2,uv,v^2] z = [1,0,7]*[u^2,uv,v^2] disc(qx) = 16 = 4cd disc(qz) = -28 = 4ad resultant(qx,qz) = 112 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -5 0 4 -1 Solution: (x:y:z) = (2:4:1) Solution is correct! Solution: (x:y:z) = (2:4:1) Parametric solution: x = [2,8,10]*[u^2,uv,v^2] y = [4,12,4]*[u^2,uv,v^2] z = [1,8,11]*[u^2,uv,v^2] disc(qx) = -16 = 4cd disc(qz) = 20 = 4ad resultant(qx,qz) = 80 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 61 0 -4 -3 Solution: (x:y:z) = (1:1:4) Solution is correct! Solution: (x:y:z) = (1:1:4) Parametric solution: x = [1,-32,244]*[u^2,uv,v^2] y = [1,0,-244]*[u^2,uv,v^2] z = [4,-122,976]*[u^2,uv,v^2] disc(qx) = 48 = 4cd disc(qz) = -732 = 4ad resultant(qx,qz) = 8784 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 8 0 1 1 Solution: (x:y:z) = (0:1:1) Solution is correct! Solution: (x:y:z) = (0:1:1) Parametric solution: x = [0,2,0]*[u^2,uv,v^2] y = [1,0,8]*[u^2,uv,v^2] z = [1,0,-8]*[u^2,uv,v^2] disc(qx) = 4 = 4cd disc(qz) = 32 = 4ad resultant(qx,qz) = -32 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -5 0 1 -1 Solution: (x:y:z) = (1:2:1) Solution is correct! Solution: (x:y:z) = (1:2:1) Parametric solution: x = [1,4,5]*[u^2,uv,v^2] y = [2,6,2]*[u^2,uv,v^2] z = [1,8,11]*[u^2,uv,v^2] disc(qx) = -4 = 4cd disc(qz) = 20 = 4ad resultant(qx,qz) = 20 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 525973 0 1 1 Solution: (x:y:z) = (0:1:1) Solution is correct! Solution: (x:y:z) = (0:1:1) Parametric solution: x = [0,2,0]*[u^2,uv,v^2] y = [1,0,525973]*[u^2,uv,v^2] z = [1,0,-525973]*[u^2,uv,v^2] disc(qx) = 4 = 4cd disc(qz) = 2103892 = 4ad resultant(qx,qz) = -2103892 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 22729 0 32 1 Solution: (x:y:z) = (1:173:15) Solution is correct! Solution: (x:y:z) = (1:173:15) Parametric solution: x = [1,346,29897]*[u^2,uv,v^2] y = [173,58898,5017173]*[u^2,uv,v^2] z = [15,4844,389557]*[u^2,uv,v^2] disc(qx) = 128 = 4cd disc(qz) = 90916 = 4ad resultant(qx,qz) = -2909312 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -4097 0 27 -5 Solution: (x:y:z) = (3:69:22) Solution is correct! Solution: (x:y:z) = (3:69:22) Parametric solution: x = [3,138,1632]*[u^2,uv,v^2] y = [69,2778,26358]*[u^2,uv,v^2] z = [22,1242,16598]*[u^2,uv,v^2] disc(qx) = -540 = 4cd disc(qz) = 81940 = 4ad resultant(qx,qz) = 11061900 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 21127 0 48 7 Solution: (x:y:z) = (1:55:1) Solution is correct! Solution: (x:y:z) = (1:55:1) Parametric solution: x = [1,110,2689]*[u^2,uv,v^2] y = [55,5954,179575]*[u^2,uv,v^2] z = [1,-660,-38989]*[u^2,uv,v^2] disc(qx) = 1344 = 4cd disc(qz) = 591556 = 4ad resultant(qx,qz) = -198762816 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 8779 0 17 3 Solution: (x:y:z) = (1:182:73) Solution is correct! Solution: (x:y:z) = (1:182:73) Parametric solution: x = [1,364,33073]*[u^2,uv,v^2] y = [182,63766,5586126]*[u^2,uv,v^2] z = [73,25480,2223031]*[u^2,uv,v^2] disc(qx) = 204 = 4cd disc(qz) = 105348 = 4ad resultant(qx,qz) = -5372748 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 15182006953 0 -40426 -1 Solution: (x:y:z) = (3:2723347:13669) Solution is correct! Solution: (x:y:z) = (3:2723347:13669) Parametric solution: x = [3,10893388,9888825163070]*[u^2,uv,v^2] y = [2723347,9889193565208,8977569638361942354]*[u^2,uv,v^2] z = [13669,49635722422,45060080115856346]*[u^2,uv,v^2] disc(qx) = 161704 = 4cd disc(qz) = -60728027812 = 4ad resultant(qx,qz) = 2454991252327912 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -4103 0 23 -2 Solution: (x:y:z) = (5:118:57) Solution is correct! Solution: (x:y:z) = (5:118:57) Parametric solution: x = [5,944,44566]*[u^2,uv,v^2] y = [118,21754,1001820]*[u^2,uv,v^2] z = [57,10856,516754]*[u^2,uv,v^2] disc(qx) = -184 = 4cd disc(qz) = 32824 = 4ad resultant(qx,qz) = 1509904 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -3140477 0 43 -1 Solution: (x:y:z) = (2:2771:337) Solution is correct! Solution: (x:y:z) = (2:2771:337) Parametric solution: x = [2,5542,3839242]*[u^2,uv,v^2] y = [2771,7663950,5299132934]*[u^2,uv,v^2] z = [337,936598,650744252]*[u^2,uv,v^2] disc(qx) = -172 = 4cd disc(qz) = 12561908 = 4ad resultant(qx,qz) = 540162044 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -239743087 0 78 -1 Solution: (x:y:z) = (1:4087:1691) Solution is correct! Solution: (x:y:z) = (1:4087:1691) Parametric solution: x = [1,8174,16703647]*[u^2,uv,v^2] y = [4087,33143342,67189033465]*[u^2,uv,v^2] z = [1691,13830408,28279010419]*[u^2,uv,v^2] disc(qx) = -312 = 4cd disc(qz) = 958972348 = 4ad resultant(qx,qz) = 74799843144 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -134593 0 56 -1 Solution: (x:y:z) = (3:1079:29) Solution is correct! Solution: (x:y:z) = (3:1079:29) Parametric solution: x = [3,2158,388099]*[u^2,uv,v^2] y = [1079,775078,139183447]*[u^2,uv,v^2] z = [29,21580,4009983]*[u^2,uv,v^2] disc(qx) = -224 = 4cd disc(qz) = 538372 = 4ad resultant(qx,qz) = 30148832 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -47287 0 8 -7 Solution: (x:y:z) = (3:245:26) Solution is correct! Solution: (x:y:z) = (3:245:26) Parametric solution: x = [3,490,20027]*[u^2,uv,v^2] y = [245,39878,1621165]*[u^2,uv,v^2] z = [26,5390,266616]*[u^2,uv,v^2] disc(qx) = -224 = 4cd disc(qz) = 1324036 = 4ad resultant(qx,qz) = 74146016 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -4431282451 0 4719 -7 Solution: (x:y:z) = (11:72611:10286) Solution is correct! Solution: (x:y:z) = (11:72611:10286) Parametric solution: x = [11,580888,7668886379]*[u^2,uv,v^2] y = [72611,3825616300,50389253797421]*[u^2,uv,v^2] z = [10286,543275502,7173540418954]*[u^2,uv,v^2] disc(qx) = -132132 = 4cd disc(qz) = 124075908628 = 4ad resultant(qx,qz) = 4098599489708724 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -336649 0 300 -1 Solution: (x:y:z) = (5:2695:62) Solution is correct! Solution: (x:y:z) = (5:2695:62) Parametric solution: x = [5,10780,5810480]*[u^2,uv,v^2] y = [2695,5802980,3123763720]*[u^2,uv,v^2] z = [62,134750,73210548]*[u^2,uv,v^2] disc(qx) = -1200 = 4cd disc(qz) = 1346596 = 4ad resultant(qx,qz) = 403978800 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 51018545 0 -412 -83 Solution: (x:y:z) = (17:14461:8827) Solution is correct! Solution: (x:y:z) = (17:14461:8827) Parametric solution: x = [17,260298,996395765]*[u^2,uv,v^2] y = [14461,221849578,850860092321]*[u^2,uv,v^2] z = [8827,135297116,518446996037]*[u^2,uv,v^2] disc(qx) = 136784 = 4cd disc(qz) = -16938156940 = 4ad resultant(qx,qz) = 579217214720240 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 134873197 0 1791 13 Solution: (x:y:z) = (31:143486:8779) Solution is correct! Solution: (x:y:z) = (31:143486:8779) Parametric solution: x = [31,8035216,520683032851]*[u^2,uv,v^2] y = [143486,37190630858,2409891948660938]*[u^2,uv,v^2] z = [8779,2275400988,147438479587025]*[u^2,uv,v^2] disc(qx) = 93132 = 4cd disc(qz) = 7013406244 = 4ad resultant(qx,qz) = -163293137579052 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 9400805511 0 2437 1 Solution: (x:y:z) = (2:259691:3499) Solution is correct! Solution: (x:y:z) = (2:259691:3499) Parametric solution: x = [2,519382,33719706522]*[u^2,uv,v^2] y = [259691,67430888418,4377245268877068]*[u^2,uv,v^2] z = [3499,908399118,58958911116030]*[u^2,uv,v^2] disc(qx) = 9748 = 4cd disc(qz) = 37603222044 = 4ad resultant(qx,qz) = -91639052121228 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 2607882701 0 -17205 -1 Solution: (x:y:z) = (2:55721:887) Solution is correct! Solution: (x:y:z) = (2:55721:887) Parametric solution: x = [2,111442,1552406318]*[u^2,uv,v^2] y = [55721,3120090676,43676470056059]*[u^2,uv,v^2] z = [887,49480248,690052247371]*[u^2,uv,v^2] disc(qx) = 68820 = 4cd disc(qz) = -10431530804 = 4ad resultant(qx,qz) = 179474487482820 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 153 0 -13 -1 Solution: (x:y:z) = (1:30:9) Solution is correct! Solution: (x:y:z) = (1:30:9) Parametric solution: x = [1,0,-13]*[u^2,uv,v^2] y = [30,234,390]*[u^2,uv,v^2] z = [9,60,117]*[u^2,uv,v^2] disc(qx) = 52 = 4cd disc(qz) = -612 = 4ad resultant(qx,qz) = 7956 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -15152 0 5 -3 Solution: (x:y:z) = (1:68:16) Solution is correct! Solution: (x:y:z) = (1:68:16) Parametric solution: x = [1,136,4639]*[u^2,uv,v^2] y = [68,9088,302532]*[u^2,uv,v^2] z = [16,2584,101488]*[u^2,uv,v^2] disc(qx) = -60 = 4cd disc(qz) = 181824 = 4ad resultant(qx,qz) = 2727360 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 4293 0 13 10 Solution: (x:y:z) = (1:135:117) Solution is correct! Solution: (x:y:z) = (1:135:117) Parametric solution: x = [1,270,18095]*[u^2,uv,v^2] y = [135,33408,2067255]*[u^2,uv,v^2] z = [117,28890,1783035]*[u^2,uv,v^2] disc(qx) = 520 = 4cd disc(qz) = 171720 = 4ad resultant(qx,qz) = -22323600 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 32432 0 -15 -7 Solution: (x:y:z) = (1:88:76) Solution is correct! Solution: (x:y:z) = (1:88:76) Parametric solution: x = [1,0,-105]*[u^2,uv,v^2] y = [88,2280,9240]*[u^2,uv,v^2] z = [76,1232,7980]*[u^2,uv,v^2] disc(qx) = 420 = 4cd disc(qz) = -908096 = 4ad resultant(qx,qz) = 95350080 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 7185786 0 -1465 -1 Solution: (x:y:z) = (28:179:1961) Solution is correct! Solution: (x:y:z) = (28:179:1961) Parametric solution: x = [28,-30430,8267670]*[u^2,uv,v^2] y = [179,10670,-58652035]*[u^2,uv,v^2] z = [1961,-2131174,579032555]*[u^2,uv,v^2] disc(qx) = 5860 = 4cd disc(qz) = -28743144 = 4ad resultant(qx,qz) = 42108705960 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 21328386 0 4537 1 Solution: (x:y:z) = (2:111187:1645) Solution is correct! Solution: (x:y:z) = (2:111187:1645) Parametric solution: x = [2,222374,6181272216]*[u^2,uv,v^2] y = [111187,12355085604,343223894585778]*[u^2,uv,v^2] z = [1645,182791428,5077918854858]*[u^2,uv,v^2] disc(qx) = 18148 = 4cd disc(qz) = 85313544 = 4ad resultant(qx,qz) = -387067549128 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -30940374 0 1871 -1 Solution: (x:y:z) = (10:54161:293) Solution is correct! Solution: (x:y:z) = (10:54161:293) Parametric solution: x = [10,324966,2640072716]*[u^2,uv,v^2] y = [54161,1759938712,14297114337062]*[u^2,uv,v^2] z = [293,9532336,77530124450]*[u^2,uv,v^2] disc(qx) = -7484 = 4cd disc(qz) = 123761496 = 4ad resultant(qx,qz) = 231557759016 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 29239123130 0 -165321 -1 Solution: (x:y:z) = (4:1332167:3683) Solution is correct! Solution: (x:y:z) = (4:1332167:3683) Parametric solution: x = [4,2664334,443667187642]*[u^2,uv,v^2] y = [1332167,887638896566,147861114890539577]*[u^2,uv,v^2] z = [3683,2453851614,408728472745513]*[u^2,uv,v^2] disc(qx) = 661284 = 4cd disc(qz) = -116956492520 = 4ad resultant(qx,qz) = 19335364299898920 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 86807326430 0 57649 1 Solution: (x:y:z) = (36:17911481:60113) Solution is correct! Solution: (x:y:z) = (36:17911481:60113) Parametric solution: x = [36,179114810,222792466396566]*[u^2,uv,v^2] y = [17911481,89116794034026,110847938522267219119]*[u^2,uv,v^2] z = [60113,299085909738,372017622658409387]*[u^2,uv,v^2] disc(qx) = 230596 = 4cd disc(qz) = 347229305720 = 4ad resultant(qx,qz) = -20017422245452280 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -17194283526 0 62471 -1 Solution: (x:y:z) = (142:17514733:25285) Solution is correct! Solution: (x:y:z) = (142:17514733:25285) Parametric solution: x = [142,2206856358,8574322156417736]*[u^2,uv,v^2] y = [17514733,272200681130732,1057584075190157670370]*[u^2,uv,v^2] z = [25285,392960549588,1526774703702137926]*[u^2,uv,v^2] disc(qx) = -249884 = 4cd disc(qz) = 68777134104 = 4ad resultant(qx,qz) = 4296576344610984 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 130017558910 0 31761 1 Solution: (x:y:z) = (8:3982759:15409) Solution is correct! Solution: (x:y:z) = (8:3982759:15409) Parametric solution: x = [8,7965518,1982796152540]*[u^2,uv,v^2] y = [3982759,3965469961708,987063994691016814]*[u^2,uv,v^2] z = [15409,15341587668,3818617555565894]*[u^2,uv,v^2] disc(qx) = 127044 = 4cd disc(qz) = 520070235640 = 4ad resultant(qx,qz) = -16517950754162040 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 188060224470 0 -31489 -1 Solution: (x:y:z) = (40:9268177:110831) Solution is correct! Solution: (x:y:z) = (40:9268177:110831) Parametric solution: x = [40,166827186,173945687428454]*[u^2,uv,v^2] y = [9268177,38654771704366,40304349374557883467]*[u^2,uv,v^2] z = [110831,462241059698,481965328453867241]*[u^2,uv,v^2] disc(qx) = 125956 = 4cd disc(qz) = -752240897880 = 4ad resultant(qx,qz) = 23687313633343320 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -2568561397757146 0 1015687 -1 Solution: (x:y:z) = (928:43406907117:17966105) Solution is correct! Solution: (x:y:z) = (928:43406907117:17966105) Parametric solution: x = [928,54779516781654,808403949038661694481422]*[u^2,uv,v^2] y = [43406907117,2562294608641058264066,37812839577435366501816592631511]*[u^2,uv,v^2] z = [17966105,1060532920727663418,15650722234273210852556256967]*[u^2,uv,v^2] disc(qx) = -4062748 = 4cd disc(qz) = 10274245591028584 = 4ad resultant(qx,qz) = 10435417681615049397208 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 6819 0 29 5 Solution: (x:y:z) = (1:332:137) Solution is correct! Solution: (x:y:z) = (1:332:137) Parametric solution: x = [1,664,110079]*[u^2,uv,v^2] y = [332,212502,34004436]*[u^2,uv,v^2] z = [137,87648,14018313]*[u^2,uv,v^2] disc(qx) = 580 = 4cd disc(qz) = 136380 = 4ad resultant(qx,qz) = -19775100 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 9987 0 -91 -1 Solution: (x:y:z) = (1:227:26) Solution is correct! Solution: (x:y:z) = (1:227:26) Parametric solution: x = [1,0,-91]*[u^2,uv,v^2] y = [227,4732,20657]*[u^2,uv,v^2] z = [26,454,2366]*[u^2,uv,v^2] disc(qx) = 364 = 4cd disc(qz) = -39948 = 4ad resultant(qx,qz) = 3635268 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -9476 0 319 -1 Solution: (x:y:z) = (2:173:5) Solution is correct! Solution: (x:y:z) = (2:173:5) Parametric solution: x = [2,346,15124]*[u^2,uv,v^2] y = [173,28334,1142665]*[u^2,uv,v^2] z = [5,1038,51977]*[u^2,uv,v^2] disc(qx) = -1276 = 4cd disc(qz) = 37904 = 4ad resultant(qx,qz) = 12091376 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -242324 0 61 -43 Solution: (x:y:z) = (2:113:83) Solution is correct! Solution: (x:y:z) = (2:113:83) Parametric solution: x = [2,226,7696]*[u^2,uv,v^2] y = [113,7706,565]*[u^2,uv,v^2] z = [83,14238,485063]*[u^2,uv,v^2] disc(qx) = -10492 = 4cd disc(qz) = 41679728 = 4ad resultant(qx,qz) = 109325926544 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 132963927 0 -1145 -2 Solution: (x:y:z) = (1:4183:383) Solution is correct! Solution: (x:y:z) = (1:4183:383) Parametric solution: x = [1,0,-2290]*[u^2,uv,v^2] y = [4183,877070,9579070]*[u^2,uv,v^2] z = [383,16732,877070]*[u^2,uv,v^2] disc(qx) = 9160 = 4cd disc(qz) = -1063711416 = 4ad resultant(qx,qz) = 2435899142640 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 7 0 2 1 Solution: (x:y:z) = (1:3:1) Solution is correct! Solution: (x:y:z) = (1:3:1) Parametric solution: x = [1,6,7]*[u^2,uv,v^2] y = [3,14,21]*[u^2,uv,v^2] z = [1,0,-7]*[u^2,uv,v^2] disc(qx) = 8 = 4cd disc(qz) = 28 = 4ad resultant(qx,qz) = -56 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 5 0 -83 2 Solution: (x:y:z) = (7:9:1) Solution is correct! Solution: (x:y:z) = (7:9:1) Parametric solution: x = [7,36,70]*[u^2,uv,v^2] y = [9,70,90]*[u^2,uv,v^2] z = [1,0,-10]*[u^2,uv,v^2] disc(qx) = -664 = 4cd disc(qz) = 40 = 4ad resultant(qx,qz) = 6640 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 257 0 -116044 1 Solution: (x:y:z) = (85:11:4) Solution is correct! Solution: (x:y:z) = (85:11:4) Parametric solution: x = [85,-82742,20137361]*[u^2,uv,v^2] y = [11,214,-2710169]*[u^2,uv,v^2] z = [4,-3894,947638]*[u^2,uv,v^2] disc(qx) = -464176 = 4cd disc(qz) = 1028 = 4ad resultant(qx,qz) = 119293232 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 1027986085027861747937 0 722974121783 604305613931 Solution: (x:y:z) = (171311893342:7402533838782499:2018398374852981) Solution is correct! Solution: (x:y:z) = (171311893342:7402533838782499:2018398374852981) Parametric solution: x = [171311893342,2010117937494774948517315634,5896517229209259273774341786566912927034598]*[u^2,uv,v^2] y = [7402533838782499,86858920078263347398188000098360,254793566685099590042491875352393376532792008429]*[u^2,uv,v^2] z = [2018398374852981,23683228870762677156565927669748,69472822701041623149476476182622950258251362709]*[u^2,uv,v^2] disc(qx) = 1747589282081205501435892 = 4cd disc(qz) = 2484871048901148643309038230841388 = 4ad resultant(qx,qz) = -1085633503103382611516316228062412935649076964148325574524 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 21458238196506826611317 0 155590763477 429392673713 Solution: (x:y:z) = (195924828285:57363880008362257:61540493626424234) Solution is correct! Solution: (x:y:z) = (195924828285:57363880008362257:61540493626424234) Parametric solution: x = [195924828285,2145280581885379595193169688,5872442016792135409459129921769285835917671]*[u^2,uv,v^2] y = [57363880008362257,628106294443357445996190963797188,1719363809865435325426625130926352481483793500685]*[u^2,uv,v^2] z = [61540493626424234,673838160952041003544277567799686,1844549175667748953847496454031950661610608575242]*[u^2,uv,v^2] disc(qx) = 267238135737744073520404 = 4cd disc(qz) = 36856041089473957501961224216840084 = 4ad resultant(qx,qz) = -2462334927856178605269320611019391015762951921790644768484 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 293911884200387681576093 0 106205605559 687223946819 Solution: (x:y:z) = (23840892990:54824084629796371:133700736855785209) Solution is correct! Solution: (x:y:z) = (23840892990:54824084629796371:133700736855785209) Parametric solution: x = [23840892990,257854110770079285408328222,697213213331782985887885426456233671379650]*[u^2,uv,v^2] y = [54824084629796371,592956631151746394411322223236130,1603298845758285007862010568052580920857024251572]*[u^2,uv,v^2] z = [133700736855785209,1446056765814659443319843363200930,3910001207049952259367656820325232372843306383962]*[u^2,uv,v^2] disc(qx) = 291948141706231627067284 = 4cd disc(qz) = 807933140308797241690526567735192668 = 4ad resultant(qx,qz) = -58968644734008364224834765146537500431921600165901384868428 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 206207486824798778186641 0 769034410087 80703111317 Solution: (x:y:z) = (25472865203:55836550914326161:12377002765101082) Solution is correct! Solution: (x:y:z) = (25472865203:55836550914326161:12377002765101082) Parametric solution: x = [25472865203,2076178487649254090497454584,42304988840339445343515873913409503516614895]*[u^2,uv,v^2] y = [55836550914326161,4550985721826192070758237216624452,92732586008244371371661349355055269020223310542763]*[u^2,uv,v^2] z = [12377002765101082,1008793737088194157229386470804738,20555558225652004372148847014220148014677041760902]*[u^2,uv,v^2] disc(qx) = 248253878415418354618316 = 4cd disc(qz) = 66566343054482186688488320101264788 = 4ad resultant(qx,qz) = -4131338208801612207997140177843018188754934920213147664252 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 79 0 -8 -1 Solution: (x:y:z) = (1:7:4) Solution is correct! Solution: (x:y:z) = (1:7:4) Parametric solution: x = [1,0,-8]*[u^2,uv,v^2] y = [7,64,56]*[u^2,uv,v^2] z = [4,14,32]*[u^2,uv,v^2] disc(qx) = 32 = 4cd disc(qz) = -316 = 4ad resultant(qx,qz) = 2528 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 125965 0 -134 -1 Solution: (x:y:z) = (1:53:31) Solution is correct! Solution: (x:y:z) = (1:53:31) Parametric solution: x = [1,-106,2675]*[u^2,uv,v^2] y = [53,2690,-284345]*[u^2,uv,v^2] z = [31,-3180,85615]*[u^2,uv,v^2] disc(qx) = 536 = 4cd disc(qz) = -503860 = 4ad resultant(qx,qz) = 67517240 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -163184 0 223 -1 Solution: (x:y:z) = (2:767:17) Solution is correct! Solution: (x:y:z) = (2:767:17) Parametric solution: x = [2,1534,294256]*[u^2,uv,v^2] y = [767,584498,111307807]*[u^2,uv,v^2] z = [17,13806,2793425]*[u^2,uv,v^2] disc(qx) = -892 = 4cd disc(qz) = 652736 = 4ad resultant(qx,qz) = 145560128 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: -1115479181 0 2065 -61 Solution: (x:y:z) = (193:350542:128419) Solution is correct! Solution: (x:y:z) = (193:350542:128419) Parametric solution: x = [193,4907588,31197435857]*[u^2,uv,v^2] y = [350542,8910804882,56628331577398]*[u^2,uv,v^2] z = [128419,3265649272,20761072924445]*[u^2,uv,v^2] disc(qx) = -503860 = 4cd disc(qz) = 272176920164 = 4ad resultant(qx,qz) = 34284765748458260 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 88727009405 0 -50601 -1 Solution: (x:y:z) = (67:13528438:107183) Solution is correct! Solution: (x:y:z) = (67:13528438:107183) Parametric solution: x = [67,108227504,43705942618909]*[u^2,uv,v^2] y = [13528438,21853133207354,8825102923197774598]*[u^2,uv,v^2] z = [107183,173136949524,69918744788891503]*[u^2,uv,v^2] disc(qx) = 202404 = 4cd disc(qz) = -354908037620 = 4ad resultant(qx,qz) = 17958701611609620 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 263422353799 0 -497480 -1 Solution: (x:y:z) = (7:11875043:17590) Solution is correct! Solution: (x:y:z) = (7:11875043:17590) Parametric solution: x = [7,23750086,20145235107767]*[u^2,uv,v^2] y = [11875043,40292970550014,34179317818472448803]*[u^2,uv,v^2] z = [17590,59683966118,50627854073738792]*[u^2,uv,v^2] disc(qx) = 1989920 = 4cd disc(qz) = -1053689415196 = 4ad resultant(qx,qz) = 524189410271706080 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 62063469603854588654579 0 68044230041 1 Solution: (x:y:z) = (30740:11344956855892619:32088063161) Solution is correct! Solution: (x:y:z) = (30740:11344956855892619:32088063161) Parametric solution: x = [30740,185172385801879327318,278861519710149973050991236497202376]*[u^2,uv,v^2] y = [11344956855892619,68340036689167845457583539158036,102917108324017159669476036949895222133813471677]*[u^2,uv,v^2] z = [32088063161,193292882605196512607887604,291090632974354925439361272040802233485625]*[u^2,uv,v^2] disc(qx) = 272176920164 = 4cd disc(qz) = 248253878415418354618316 = 4ad resultant(qx,qz) = -16892244011469171082902408656030956 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 1 0 7535987 13 Solution: (x:y:z) = (4735:1518:1) Solution is correct! Solution: (x:y:z) = (4735:1518:1) Parametric solution: x = [4735,39468,61555]*[u^2,uv,v^2] y = [1518,9470,19734]*[u^2,uv,v^2] z = [1,0,-13]*[u^2,uv,v^2] disc(qx) = 391871324 = 4cd disc(qz) = 52 = 4ad resultant(qx,qz) = -5094327212 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 19 0 4776762553 6836 Solution: (x:y:z) = (1267471:67699:13) Solution is correct! Solution: (x:y:z) = (1267471:67699:13) Parametric solution: x = [1267471,105679222184,2202831045207236]*[u^2,uv,v^2] y = [67699,5644510578,117654987622372]*[u^2,uv,v^2] z = [13,1083184,22563212660]*[u^2,uv,v^2] disc(qx) = 130615795249232 = 4cd disc(qz) = 519536 = 4ad resultant(qx,qz) = -16964901950151249088 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 1 0 52753834808 23209 Solution: (x:y:z) = (5849111:40721:9) Solution is correct! Solution: (x:y:z) = (5849111:40721:9) Parametric solution: x = [5849111,53139276160,120692604968248]*[u^2,uv,v^2] y = [40721,369788656,839516840952]*[u^2,uv,v^2] z = [9,81442,184241848]*[u^2,uv,v^2] disc(qx) = 4897455008235488 = 4cd disc(qz) = 92836 = 4ad resultant(qx,qz) = -113665033286137440992 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 555143 0 1 193 Solution: (x:y:z) = (3:176:991) Solution is correct! Solution: (x:y:z) = (3:176:991) Parametric solution: x = [3,352,10261]*[u^2,uv,v^2] y = [176,19990,570768]*[u^2,uv,v^2] z = [991,93632,2103527]*[u^2,uv,v^2] disc(qx) = 772 = 4cd disc(qz) = 428570396 = 4ad resultant(qx,qz) = -82714086428 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 1 0 316 5 Solution: (x:y:z) = (2:8:1) Solution is correct! Solution: (x:y:z) = (2:8:1) Parametric solution: x = [2,80,10]*[u^2,uv,v^2] y = [8,4,40]*[u^2,uv,v^2] z = [1,0,-5]*[u^2,uv,v^2] disc(qx) = 6320 = 4cd disc(qz) = 20 = 4ad resultant(qx,qz) = -31600 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 388 0 152441 1 Solution: (x:y:z) = (143:4206:8) Solution is correct! Solution: (x:y:z) = (143:4206:8) Parametric solution: x = [143,151416,40080761]*[u^2,uv,v^2] y = [4206,4436480,1169911518]*[u^2,uv,v^2] z = [8,8412,2211256]*[u^2,uv,v^2] disc(qx) = 609764 = 4cd disc(qz) = 1552 = 4ad resultant(qx,qz) = -236588432 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 831 0 1 92742160 Solution: (x:y:z) = (309:2:17077) Solution is correct! Solution: (x:y:z) = (309:2:17077) Parametric solution: x = [309,18004,-37884]*[u^2,uv,v^2] y = [2,6,420]*[u^2,uv,v^2] z = [17077,-205548,-3894492]*[u^2,uv,v^2] disc(qx) = 370968640 = 4cd disc(qz) = 308274939840 = 4ad resultant(qx,qz) = -28590083794631654400 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 1 0 29526647 489 Solution: (x:y:z) = (8597:1057:4) Solution is correct! Solution: (x:y:z) = (8597:1057:4) Parametric solution: x = [8597,13888980,5607944961]*[u^2,uv,v^2] y = [1057,1680172,667714299]*[u^2,uv,v^2] z = [4,6342,2513688]*[u^2,uv,v^2] disc(qx) = 57754121532 = 4cd disc(qz) = 1956 = 4ad resultant(qx,qz) = -28241765429148 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 7 0 4715959977 21016 Solution: (x:y:z) = (227529:6663:11) Solution is correct! Solution: (x:y:z) = (227529:6663:11) Parametric solution: x = [227529,301100970,99180051417]*[u^2,uv,v^2] y = [6663,8361504,2628200361]*[u^2,uv,v^2] z = [11,13326,4022587]*[u^2,uv,v^2] disc(qx) = 396442459506528 = 4cd disc(qz) = 588448 = 4ad resultant(qx,qz) = -58321443102924347136 = d^2(b^2-4ac) Parametric solution is correct! Enter coefficients a b c d: 0 0 0 0 eclib-20250122/progs/out_ntl/solve_legendre.out000066400000000000000000000471341474421343600214140ustar00rootroot00000000000000Solving ax^2 + by^2 + cz^2 = 0 Using method 4 Enter coefficients a b c: -113922743 310146482690273725409 -1 Solution: (x:y:z) = (11931641701:7244:7523107023591) --OK x = [11931641701,-4873846170,-25495895384] * [u^2,uv,v^2] y = [7244,-1698,15826] * [u^2,uv,v^2] z = [7523107023591,373522427721722,-60212759924226] * [u^2,uv,v^2] Disc(qx) = 1240585930761094901636 Disc(qy) = -455690972 Disc(qz) = 141330952159512008877688307548 Parametric solution is OK Enter coefficients a b c: 7 -4 1 Solution: (x:y:z) = (0:1:2) --OK x = [0,4,0] * [u^2,uv,v^2] y = [1,0,7] * [u^2,uv,v^2] z = [-2,0,14] * [u^2,uv,v^2] Disc(qx) = 16 Disc(qy) = -28 Disc(qz) = 112 Parametric solution is OK Enter coefficients a b c: -5 4 1 Solution: (x:y:z) = (1:1:1) --OK x = [1,0,4] * [u^2,uv,v^2] y = [-1,-2,4] * [u^2,uv,v^2] z = [-1,8,4] * [u^2,uv,v^2] Disc(qx) = -16 Disc(qy) = 20 Disc(qz) = 80 Parametric solution is OK Enter coefficients a b c: 61 -4 3 Solution: (x:y:z) = (1:4:1) --OK x = [-3,0,4] * [u^2,uv,v^2] y = [12,6,16] * [u^2,uv,v^2] z = [-3,-32,-4] * [u^2,uv,v^2] Disc(qx) = 48 Disc(qy) = -732 Disc(qz) = 976 Parametric solution is OK Enter coefficients a b c: 8 1 -1 Solution: (x:y:z) = (0:1:1) --OK x = [0,-2,0] * [u^2,uv,v^2] y = [1,0,-8] * [u^2,uv,v^2] z = [1,0,8] * [u^2,uv,v^2] Disc(qx) = 4 Disc(qy) = 32 Disc(qz) = -32 Parametric solution is OK Enter coefficients a b c: -5 1 1 Solution: (x:y:z) = (1:2:1) --OK x = [1,0,1] * [u^2,uv,v^2] y = [2,2,-2] * [u^2,uv,v^2] z = [1,-4,-1] * [u^2,uv,v^2] Disc(qx) = -4 Disc(qy) = 20 Disc(qz) = 20 Parametric solution is OK Enter coefficients a b c: 525973 1 -1 Solution: (x:y:z) = (0:1:1) --OK x = [0,-2,0] * [u^2,uv,v^2] y = [1,0,-525973] * [u^2,uv,v^2] z = [1,0,525973] * [u^2,uv,v^2] Disc(qx) = 4 Disc(qy) = 2103892 Disc(qz) = -2103892 Parametric solution is OK Enter coefficients a b c: 22729 32 -1 Solution: (x:y:z) = (1:15:173) --OK x = [1,-6,-23] * [u^2,uv,v^2] y = [15,256,-423] * [u^2,uv,v^2] z = [173,-78,4213] * [u^2,uv,v^2] Disc(qx) = 128 Disc(qy) = 90916 Disc(qz) = -2909312 Parametric solution is OK Enter coefficients a b c: -4097 27 5 Solution: (x:y:z) = (3:22:69) --OK x = [9,0,15] * [u^2,uv,v^2] y = [66,230,-110] * [u^2,uv,v^2] z = [207,-396,-345] * [u^2,uv,v^2] Disc(qx) = -540 Disc(qy) = 81940 Disc(qz) = 442476 Parametric solution is OK Enter coefficients a b c: 21127 48 -7 Solution: (x:y:z) = (1:1:55) --OK x = [7,0,-48] * [u^2,uv,v^2] y = [7,770,48] * [u^2,uv,v^2] z = [385,96,2640] * [u^2,uv,v^2] Disc(qx) = 1344 Disc(qy) = 591556 Disc(qz) = -4056384 Parametric solution is OK Enter coefficients a b c: 8779 17 -12 Solution: (x:y:z) = (5:67:157) --OK x = [-1,28,8] * [u^2,uv,v^2] y = [-73,-140,1376] * [u^2,uv,v^2] z = [91,-66,1652] * [u^2,uv,v^2] Disc(qx) = 816 Disc(qy) = 421392 Disc(qz) = -596972 Parametric solution is OK Enter coefficients a b c: 15182006953 -40426 9 Solution: (x:y:z) = (9:41007:2723347) --OK x = [-9,1194,825] * [u^2,uv,v^2] y = [41007,6432,3332319] * [u^2,uv,v^2] z = [-2723347,-7091294,220749027] * [u^2,uv,v^2] Disc(qx) = 1455336 Disc(qy) = -546552250308 Disc(qz) = 2454991252327912 Parametric solution is OK Enter coefficients a b c: -4103 23 8 Solution: (x:y:z) = (5:57:59) --OK x = [11,10,19] * [u^2,uv,v^2] y = [55,-286,-225] * [u^2,uv,v^2] z = [-231,-440,199] * [u^2,uv,v^2] Disc(qx) = -736 Disc(qy) = 131296 Disc(qz) = 377476 Parametric solution is OK Enter coefficients a b c: -3140477 43 25 Solution: (x:y:z) = (10:1685:2771) --OK x = [10,-10,110] * [u^2,uv,v^2] y = [-1685,-12170,24620] * [u^2,uv,v^2] z = [-2771,17262,21850] * [u^2,uv,v^2] Disc(qx) = -4300 Disc(qy) = 314047700 Disc(qz) = 540162044 Parametric solution is OK Enter coefficients a b c: -239743087 78 25 Solution: (x:y:z) = (1:1623:1171) --OK x = [25,0,78] * [u^2,uv,v^2] y = [-40575,-58550,126594] * [u^2,uv,v^2] z = [-29275,253188,91338] * [u^2,uv,v^2] Disc(qx) = -7800 Disc(qy) = 23974308700 Disc(qz) = 74799843144 Parametric solution is OK Enter coefficients a b c: -134593 56 1 Solution: (x:y:z) = (3:136:419) --OK x = [3,2,19] * [u^2,uv,v^2] y = [-136,-370,738] * [u^2,uv,v^2] z = [-419,4798,4253] * [u^2,uv,v^2] Disc(qx) = -224 Disc(qy) = 538372 Disc(qz) = 30148832 Parametric solution is OK Enter coefficients a b c: -47287 8 7 Solution: (x:y:z) = (3:26:245) --OK x = [5,4,12] * [u^2,uv,v^2] y = [384,254,-820] * [u^2,uv,v^2] z = [-19,-1244,-452] * [u^2,uv,v^2] Disc(qx) = -224 Disc(qy) = 1324036 Disc(qz) = 1513184 Parametric solution is OK Enter coefficients a b c: -4431282451 4719 7 Solution: (x:y:z) = (11:10286:72611) --OK x = [77,0,429] * [u^2,uv,v^2] y = [-72002,-92414,401154] * [u^2,uv,v^2] z = [-508277,8825388,2831829] * [u^2,uv,v^2] Disc(qx) = -132132 Disc(qy) = 124075908628 Disc(qz) = 83644887545076 Parametric solution is OK Enter coefficients a b c: -336649 300 1 Solution: (x:y:z) = (5:62:2695) --OK x = [5,0,60] * [u^2,uv,v^2] y = [-62,-1078,744] * [u^2,uv,v^2] z = [-2695,7440,32340] * [u^2,uv,v^2] Disc(qx) = -1200 Disc(qy) = 1346596 Disc(qz) = 403978800 Parametric solution is OK Enter coefficients a b c: 51018545 -412 83 Solution: (x:y:z) = (17:8827:14461) --OK x = [140,-128,-215] * [u^2,uv,v^2] y = [54140,9810,78659] * [u^2,uv,v^2] z = [50020,272920,-47947] * [u^2,uv,v^2] Disc(qx) = 136784 Disc(qy) = -16938156940 Disc(qz) = 84078562160 Parametric solution is OK Enter coefficients a b c: 134873197 1791 -13 Solution: (x:y:z) = (9:964:31119) --OK x = [117,-156,-147] * [u^2,uv,v^2] y = [12532,73190,-33048] * [u^2,uv,v^2] z = [404547,-155724,612093] * [u^2,uv,v^2] Disc(qx) = 93132 Disc(qy) = 7013406244 Disc(qz) = -966231583308 Parametric solution is OK Enter coefficients a b c: 9400805511 2437 -4 Solution: (x:y:z) = (4:6998:259691) --OK x = [4,-132,-1348] * [u^2,uv,v^2] y = [6998,288448,-2401066] * [u^2,uv,v^2] z = [259691,-42740,88221077] * [u^2,uv,v^2] Disc(qx) = 38992 Disc(qy) = 150412888176 Disc(qz) = -91639052121228 Parametric solution is OK Enter coefficients a b c: 2607882701 -17205 4 Solution: (x:y:z) = (4:1774:55721) --OK x = [-4,252,13236] * [u^2,uv,v^2] y = [1774,-320,5880246] * [u^2,uv,v^2] z = [-55721,-11750412,185757189] * [u^2,uv,v^2] Disc(qx) = 275280 Disc(qy) = -41726123216 Disc(qz) = 179474487482820 Parametric solution is OK Enter coefficients a b c: 153 -13 1 Solution: (x:y:z) = (1:9:30) --OK x = [-1,6,4] * [u^2,uv,v^2] y = [9,6,18] * [u^2,uv,v^2] z = [-30,-54,42] * [u^2,uv,v^2] Disc(qx) = 52 Disc(qy) = -612 Disc(qz) = 7956 Parametric solution is OK Enter coefficients a b c: -15152 5 3 Solution: (x:y:z) = (1:16:68) --OK x = [3,0,5] * [u^2,uv,v^2] y = [-48,-408,80] * [u^2,uv,v^2] z = [-204,160,340] * [u^2,uv,v^2] Disc(qx) = -60 Disc(qy) = 181824 Disc(qz) = 303040 Parametric solution is OK Enter coefficients a b c: 4293 13 -10 Solution: (x:y:z) = (1:3:21) --OK x = [10,0,-13] * [u^2,uv,v^2] y = [30,420,39] * [u^2,uv,v^2] z = [210,78,273] * [u^2,uv,v^2] Disc(qx) = 520 Disc(qy) = 171720 Disc(qz) = -223236 Parametric solution is OK Enter coefficients a b c: 32432 -15 7 Solution: (x:y:z) = (2:93:1) --OK x = [4,-22,4] * [u^2,uv,v^2] y = [508,-372,515] * [u^2,uv,v^2] z = [692,4,-703] * [u^2,uv,v^2] Disc(qx) = 420 Disc(qy) = -908096 Disc(qz) = 1945920 Parametric solution is OK Enter coefficients a b c: 7185786 -1465 1 Solution: (x:y:z) = (28:1961:179) --OK x = [-28,22,48] * [u^2,uv,v^2] y = [1961,-1528,3962] * [u^2,uv,v^2] z = [-179,-205064,80254] * [u^2,uv,v^2] Disc(qx) = 5860 Disc(qy) = -28743144 Disc(qz) = 42108705960 Parametric solution is OK Enter coefficients a b c: 21328386 4537 -1 Solution: (x:y:z) = (2:1645:111187) --OK x = [2,-134,-24] * [u^2,uv,v^2] y = [1645,972,-12822] * [u^2,uv,v^2] z = [111187,13836,870738] * [u^2,uv,v^2] Disc(qx) = 18148 Disc(qy) = 85313544 Disc(qz) = -387067549128 Parametric solution is OK Enter coefficients a b c: -30940374 1871 1 Solution: (x:y:z) = (10:293:54161) --OK x = [10,6,188] * [u^2,uv,v^2] y = [-293,-11008,2206] * [u^2,uv,v^2] z = [-54161,77144,1041370] * [u^2,uv,v^2] Disc(qx) = -7484 Disc(qy) = 123761496 Disc(qz) = 231557759016 Parametric solution is OK Enter coefficients a b c: 29239123130 -165321 1 Solution: (x:y:z) = (4:3683:1332167) --OK x = [-4,722,8750] * [u^2,uv,v^2] y = [3683,1302,7939057] * [u^2,uv,v^2] z = [-1332167,-63982478,2860303327] * [u^2,uv,v^2] Disc(qx) = 661284 Disc(qy) = -116956492520 Disc(qz) = 19335364299898920 Parametric solution is OK Enter coefficients a b c: 86807326430 57649 -1 Solution: (x:y:z) = (36:60113:17911481) --OK x = [36,-410,-434] * [u^2,uv,v^2] y = [60113,310462,-1043213] * [u^2,uv,v^2] z = [17911481,-11466626,281228919] * [u^2,uv,v^2] Disc(qx) = 230596 Disc(qy) = 347229305720 Disc(qz) = -20017422245452280 Parametric solution is OK Enter coefficients a b c: -17194283526 62471 1 Solution: (x:y:z) = (142:25285:17514733) --OK x = [142,-6,440] * [u^2,uv,v^2] y = [-25285,-245618,83537] * [u^2,uv,v^2] z = [-17514733,22987654,53785349] * [u^2,uv,v^2] Disc(qx) = -249884 Disc(qy) = 68777134104 Disc(qz) = 4296576344610984 Parametric solution is OK Enter coefficients a b c: 130017558910 31761 -1 Solution: (x:y:z) = (8:15409:3982759) --OK x = [8,-238,-2200] * [u^2,uv,v^2] y = [15409,537272,-3754446] * [u^2,uv,v^2] z = [3982759,3864232,1037778274] * [u^2,uv,v^2] Disc(qx) = 127044 Disc(qy) = 520070235640 Disc(qz) = -16517950754162040 Parametric solution is OK Enter coefficients a b c: 188060224470 -31489 1 Solution: (x:y:z) = (6:145223:25638331) --OK x = [-6,358,-92] * [u^2,uv,v^2] y = [145223,-118862,1319297] * [u^2,uv,v^2] z = [-25638331,5444734,230686511] * [u^2,uv,v^2] Disc(qx) = 125956 Disc(qy) = -752240897880 Disc(qz) = 23687313633343320 Parametric solution is OK Enter coefficients a b c: -2568561397757146 1015687 9 Solution: (x:y:z) = (2568:128318463:4885038233) --OK x = [2568,594,3594] * [u^2,uv,v^2] y = [-128318463,-63922062,172193031] * [u^2,uv,v^2] z = [-4885038233,100374251070,18445475069] * [u^2,uv,v^2] Disc(qx) = -36564732 Disc(qy) = 92468210319257256 Disc(qz) = 10435417681615049397208 Parametric solution is OK Enter coefficients a b c: 6819 29 -5 Solution: (x:y:z) = (3:61:184) --OK x = [-8,-6,17] * [u^2,uv,v^2] y = [26,-358,-79] * [u^2,uv,v^2] z = [302,38,656] * [u^2,uv,v^2] Disc(qx) = 580 Disc(qy) = 136380 Disc(qz) = -791004 Parametric solution is OK Enter coefficients a b c: 9987 -91 1 Solution: (x:y:z) = (1:26:227) --OK x = [-1,18,10] * [u^2,uv,v^2] y = [26,-14,386] * [u^2,uv,v^2] z = [-227,-646,3544] * [u^2,uv,v^2] Disc(qx) = 364 Disc(qy) = -39948 Disc(qz) = 3635268 Parametric solution is OK Enter coefficients a b c: -9476 319 1 Solution: (x:y:z) = (2:5:173) --OK x = [2,-2,160] * [u^2,uv,v^2] y = [-5,-168,484] * [u^2,uv,v^2] z = [-173,1768,12956] * [u^2,uv,v^2] Disc(qx) = -1276 Disc(qy) = 37904 Disc(qz) = 12091376 Parametric solution is OK Enter coefficients a b c: -242324 61 43 Solution: (x:y:z) = (13:514:760) --OK x = [8,-6,329] * [u^2,uv,v^2] y = [-332,5108,11738] * [u^2,uv,v^2] z = [452,4724,-20360] * [u^2,uv,v^2] Disc(qx) = -10492 Disc(qy) = 41679728 Disc(qz) = 59127056 Parametric solution is OK Enter coefficients a b c: 132963927 -1145 2 Solution: (x:y:z) = (1:383:4183) --OK x = [-2,44,903] * [u^2,uv,v^2] y = [766,-120,347169] * [u^2,uv,v^2] z = [-8366,-693018,3845949] * [u^2,uv,v^2] Disc(qx) = 9160 Disc(qy) = -1063711416 Disc(qz) = 608974785660 Parametric solution is OK Enter coefficients a b c: 7 2 -1 Solution: (x:y:z) = (1:1:3) --OK x = [1,-2,-1] * [u^2,uv,v^2] y = [1,4,-3] * [u^2,uv,v^2] z = [3,-2,5] * [u^2,uv,v^2] Disc(qx) = 8 Disc(qy) = 28 Disc(qz) = -56 Parametric solution is OK Enter coefficients a b c: 5 -83 -2 Solution: (x:y:z) = (7:1:9) --OK x = [13,8,14] * [u^2,uv,v^2] y = [-3,-4,2] * [u^2,uv,v^2] z = [-7,34,18] * [u^2,uv,v^2] Disc(qx) = -664 Disc(qy) = 40 Disc(qz) = 1660 Parametric solution is OK Enter coefficients a b c: 257 -116044 -1 Solution: (x:y:z) = (85:4:11) --OK x = [85,-48,1372] * [u^2,uv,v^2] y = [4,-2,-64] * [u^2,uv,v^2] z = [11,-10928,2908] * [u^2,uv,v^2] Disc(qx) = -464176 Disc(qy) = 1028 Disc(qz) = 119293232 Parametric solution is OK Enter coefficients a b c: 1027986085027861747937 722974121783 -604305613931 Solution: (x:y:z) = (96169054998:8355012676083151:9962270515504999) --OK x = [-171311893342,-398643135954,2318392642282] * [u^2,uv,v^2] y = [2018398374852981,-47528310472702492,-27983914786891851] * [u^2,uv,v^2] z = [7402533838782499,189535693811400,100400259446190829] * [u^2,uv,v^2] Disc(qx) = 1747589282081205501435892 Disc(qy) = 2484871048901148643309038230841388 Disc(qz) = -2972829348112650849204367548046684 Parametric solution is OK Enter coefficients a b c: 21458238196506826611317 155590763477 -429392673713 Solution: (x:y:z) = (133174840374:12323039517012895:30681131636462597) --OK x = [-120839066706,-69074898358,543008981510] * [u^2,uv,v^2] y = [-3653109691455587,-194702538229996066,-72064445956284564] * [u^2,uv,v^2] z = [27102622202551825,24899986468074458,128906567389794722] * [u^2,uv,v^2] Disc(qx) = 267238135737744073520404 Disc(qy) = 36856041089473957501961224216840084 Disc(qz) = -13354814655463282827589091033876836 Parametric solution is OK Enter coefficients a b c: 293911884200387681576093 106205605559 -687223946819 Solution: (x:y:z) = (23840892990:133700736855785209:54824084629796371) --OK x = [-120543758034,-289421995022,431758255050] * [u^2,uv,v^2] y = [201353504898388438,-790335940111425618,-227587597953023497] * [u^2,uv,v^2] z = [111714818825405396,-86582800060098558,296193784378457843] * [u^2,uv,v^2] Disc(qx) = 291948141706231627067284 Disc(qy) = 807933140308797241690526567735192668 Disc(qz) = -124860358569955432897412098409203948 Parametric solution is OK Enter coefficients a b c: 206207486824798778186641 769034410087 -80703111317 Solution: (x:y:z) = (165865026463:38107219971077702:290056531374297691) --OK x = [25472865203,323082507022,-1412008140086] * [u^2,uv,v^2] y = [-12377002765101082,196820171004354090,562094148891299246] * [u^2,uv,v^2] z = [55836550914326161,-39134552764402442,2846943958532790128] * [u^2,uv,v^2] Disc(qx) = 248253878415418354618316 Disc(qy) = 66566343054482186688488320101264788 Disc(qz) = -634322611943327812420967300076191068 Parametric solution is OK Enter coefficients a b c: 79 -8 1 Solution: (x:y:z) = (1:4:7) --OK x = [-1,4,4] * [u^2,uv,v^2] y = [4,-2,20] * [u^2,uv,v^2] z = [-7,-36,44] * [u^2,uv,v^2] Disc(qx) = 32 Disc(qy) = -316 Disc(qz) = 2528 Parametric solution is OK Enter coefficients a b c: 125965 -134 1 Solution: (x:y:z) = (1:31:53) --OK x = [-1,4,130] * [u^2,uv,v^2] y = [31,-18,4066] * [u^2,uv,v^2] z = [-53,-8096,9302] * [u^2,uv,v^2] Disc(qx) = 536 Disc(qy) = -503860 Disc(qz) = 67517240 Parametric solution is OK Enter coefficients a b c: -163184 223 1 Solution: (x:y:z) = (1:5:397) --OK x = [1,0,223] * [u^2,uv,v^2] y = [-5,-794,1115] * [u^2,uv,v^2] z = [-397,2230,88531] * [u^2,uv,v^2] Disc(qx) = -892 Disc(qy) = 652736 Disc(qz) = 145560128 Parametric solution is OK Enter coefficients a b c: -1115479181 2065 61 Solution: (x:y:z) = (271:196736:180889) --OK x = [386,370,415] * [u^2,uv,v^2] y = [-256838,-467778,51940] * [u^2,uv,v^2] z = [-701084,2076010,1748735] * [u^2,uv,v^2] Disc(qx) = -503860 Disc(qy) = 272176920164 Disc(qz) = 9213858035060 Parametric solution is OK Enter coefficients a b c: 88727009405 -50601 1 Solution: (x:y:z) = (67:107183:13528438) --OK x = [-67,276,471] * [u^2,uv,v^2] y = [107183,-37696,831123] * [u^2,uv,v^2] z = [-13528438,-106168434,123572382] * [u^2,uv,v^2] Disc(qx) = 202404 Disc(qy) = -354908037620 Disc(qz) = 17958701611609620 Parametric solution is OK Enter coefficients a b c: 263422353799 -497480 1 Solution: (x:y:z) = (7:17590:11875043) --OK x = [-7,1348,6172] * [u^2,uv,v^2] y = [17590,5538,14976124] * [u^2,uv,v^2] z = [-11875043,-213398348,10076817308] * [u^2,uv,v^2] Disc(qx) = 1989920 Disc(qy) = -1053689415196 Disc(qz) = 524189410271706080 Parametric solution is OK Enter coefficients a b c: 62063469603854588654579 68044230041 -1 Solution: (x:y:z) = (30740:32088063161:11344956855892619) --OK x = [30740,-409478,-849908] * [u^2,uv,v^2] y = [32088063161,310688281872,-1182111469003] * [u^2,uv,v^2] z = [11344956855892619,-9066204972113032,374052548186839105] * [u^2,uv,v^2] Disc(qx) = 272176920164 Disc(qy) = 248253878415418354618316 Disc(qz) = -16892244011469171082902408656030956 Parametric solution is OK Enter coefficients a b c: 1 7535987 -52 Solution: (x:y:z) = (4735:1:759) --OK x = [4735,22116,-56936] * [u^2,uv,v^2] y = [-1,12,16] * [u^2,uv,v^2] z = [759,362,9972] * [u^2,uv,v^2] Disc(qx) = 1567485296 Disc(qy) = 208 Disc(qz) = -30143948 Parametric solution is OK Enter coefficients a b c: 19 4776762553 -6836 Solution: (x:y:z) = (1267471:13:67699) --OK x = [1903532,10105320,-3742819] * [u^2,uv,v^2] y = [-316,352,313] * [u^2,uv,v^2] z = [282572,-85858,327709] * [u^2,uv,v^2] Disc(qx) = 130615795249232 Disc(qy) = 519536 Disc(qz) = -363033954028 Parametric solution is OK Enter coefficients a b c: 1 52753834808 -208881 Solution: (x:y:z) = (17547333:27:40721) --OK x = [17547333,52950174,-588029163] * [u^2,uv,v^2] y = [-27,888,435] * [u^2,uv,v^2] z = [40721,-39466,1305057] * [u^2,uv,v^2] Disc(qx) = 44077095074119392 Disc(qy) = 835524 Disc(qz) = -211015339232 Parametric solution is OK Enter coefficients a b c: 221916530122928255 1 -370095536 Solution: (x:y:z) = (7508:1539105595944:200502439) --OK x = [-7508,-10400,45692] * [u^2,uv,v^2] y = [1539105595944,-17634978298376,-2847239512744] * [u^2,uv,v^2] z = [200502439,-132257036,1128612261] * [u^2,uv,v^2] Disc(qx) = 1480382144 Disc(qy) = 328521268652421113695078720 Disc(qz) = -887666120491713020 Parametric solution is OK Enter coefficients a b c: 555143 1 -1737 Solution: (x:y:z) = (9:2973:176) --OK x = [-9,-30,168] * [u^2,uv,v^2] y = [2973,-58026,-41214] * [u^2,uv,v^2] z = [176,-74,3162] * [u^2,uv,v^2] Disc(qx) = 6948 Disc(qy) = 3857133564 Disc(qz) = -2220572 Parametric solution is OK Enter coefficients a b c: 1 23121989 -2313 Solution: (x:y:z) = (8707:4:439) --OK x = [8707,416280,-1166751] * [u^2,uv,v^2] y = [-4,42,468] * [u^2,uv,v^2] z = [439,-256,52707] * [u^2,uv,v^2] Disc(qx) = 213924642228 Disc(qy) = 9252 Disc(qz) = -92487956 Parametric solution is OK Enter coefficients a b c: 14299777 2 -5276187762844563 Solution: (x:y:z) = (19356219:36672694683:1235) --OK x = [-38712438,-118025652,182625075] * [u^2,uv,v^2] y = [73345389366,-449667627426,-339463255227] * [u^2,uv,v^2] z = [2470,-48,11579] * [u^2,uv,v^2] Disc(qx) = 42209502102756504 Disc(qy) = 301793233675224546249804 Disc(qz) = -114398216 Parametric solution is OK Enter coefficients a b c: 1 316 -5 Solution: (x:y:z) = (2:1:8) --OK x = [2,80,10] * [u^2,uv,v^2] y = [-1,0,5] * [u^2,uv,v^2] z = [8,4,40] * [u^2,uv,v^2] Disc(qx) = 6320 Disc(qy) = 20 Disc(qz) = -1264 Parametric solution is OK Enter coefficients a b c: 388 152441 -1 Solution: (x:y:z) = (56:9:3683) --OK x = [56,-694,-572] * [u^2,uv,v^2] y = [9,20,-32] * [u^2,uv,v^2] z = [3683,3356,16824] * [u^2,uv,v^2] Disc(qx) = 609764 Disc(qy) = 1552 Disc(qz) = -236588432 Parametric solution is OK Enter coefficients a b c: 831 1 -92742160 Solution: (x:y:z) = (309:17077:2) --OK x = [-309,-16768,72656] * [u^2,uv,v^2] y = [17077,-273856,-3415088] * [u^2,uv,v^2] z = [2,-2,416] * [u^2,uv,v^2] Disc(qx) = 370968640 Disc(qy) = 308274939840 Disc(qz) = -3324 Parametric solution is OK Enter coefficients a b c: 1 29526647 -1956 Solution: (x:y:z) = (17194:8:1057) --OK x = [17194,439500,-550428] * [u^2,uv,v^2] y = [-8,36,204] * [u^2,uv,v^2] z = [1057,-458,27984] * [u^2,uv,v^2] Disc(qx) = 231016486128 Disc(qy) = 7824 Disc(qz) = -118106588 Parametric solution is OK Enter coefficients a b c: 7 4715959977 -21016 Solution: (x:y:z) = (227529:11:6663) --OK x = [1592703,15324546,-25365801] * [u^2,uv,v^2] y = [-77,490,1131] * [u^2,uv,v^2] z = [46641,-7224,708063] * [u^2,uv,v^2] Disc(qx) = 396442459506528 Disc(qy) = 588448 Disc(qz) = -132046879356 Parametric solution is OK Enter coefficients a b c: 6404148857786219 1 -3120332 Solution: (x:y:z) = (394:19843986872:21090393) --OK x = [-394,-1984,5422] * [u^2,uv,v^2] y = [19843986872,-234130929916,-316405547352] * [u^2,uv,v^2] z = [21090393,5470472,304007155] * [u^2,uv,v^2] Disc(qx) = 12481328 Disc(qy) = 79932282454855153218832 Disc(qz) = -25616595431144876 Parametric solution is OK Enter coefficients a b c: 0 0 0 eclib-20250122/progs/pcurve.cc000066400000000000000000000131711474421343600160070ustar00rootroot00000000000000// FILE PCURVE.CC ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // // computes a possible equation from periods for newforms // ONLY needs eigs data, not full intdata // BUT only finds curves "up to isogeny" as it does not // determine the full Gamma_0(N) period lattice. #include #include #include #include #include #include #include //from qcurves, for computing conductors #include #include #include //#define SINGLE #ifndef SINGLE #define AUTOLOOP #endif #define DMAX 50 // Upper bound for d = (2,2) matrix entry used #define LMAX 200 // Upper bound twisting prime l- int main(void) { initprimes("PRIMES",0); set_precision(80); long n=1; int dump=1, detail; long maxn, dmax=DMAX; //#ifdef SINGLE detail=2; //#else cerr << "See details? "; cin>>detail; //#endif cerr << "Enter max d: "; cin>>dmax; cerr << "Enter max scaling factor for periods: "; cin>>maxn; #ifdef AUTOLOOP long limit; cerr<<"Enter first and last N: ";cin>>n>>limit; n--; cout<<"\n"; while (n1) { cerr<<"Enter level: "; cin>>n; #endif if (n>1) { cout << "N = " << n << endl; newforms nf(n,detail); int noldap=25; nf.createfromdata(1,noldap); int squarelevel=nf.squarelevel; long fac=nf.sqfac; long nnf, inf; #ifdef SINGLE cout << "Enter form number: "; cin>>inf; nnf=inf; inf--; #else nnf = nf.n1ds; inf = 0; #endif primevar pr; long p0; // First "good" prime while (p0=(long)pr, ::divides(p0,n)) pr++; int anyfound=0; for(long i=inf; i1) {cout<<"\n Newform details:\n";nfi->display();cout<dotminus=1; // In case wrong values were on the file! // STEP 1: find the real period using L(f,1) is L/P nonzero, // or via L(f,chi,1) // Now done within get_matrix_periods() // STEP 2: compute periods of lots of matriced in Gamma_0(N) over all // symbols {0,b/d} for da<<","<b<<";"<c<<","<d<<"):\t"; cout << "dotplus = "<< nfi->dotplus << ", dotminus = "<< nfi->dotminus<< "\n"; cout << "Searching for scaling factors.\n"; } // STEP 3: Now we have nonzero integer multiples of real and imag // periods, we search for a sub-multiple of both which gives a genuine // curve. long nx, ny; int type; long maxnx=maxn; if(rp_known) maxnx=1; int found = get_curve(n, fac, maxnx, maxn, x0, y0, nx, ny, type, detail); if(found) { anyfound=1; // cout<<"before rescaling, dotplus="<dotplus<<", dotminus="<dotminus<a<<","<b<<";"<c <<","<d<<"),"<dotplus<<","<dotminus <<";"<type<<"]"<display(); cout<<"test reconstruction of curve from updated data:"<>dump; if(dump) // dump complete data file into (S)NF_DIR/x$N. { nf.output_to_file(1,0); nf.output_to_file(1,1); } } } // end of if(n) } // end of while() } // end of main() eclib-20250122/progs/point_search.cc000066400000000000000000000116501474421343600171610ustar00rootroot00000000000000// point_search.cc: program to find points up to given naive height ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include #include #include #include #include #include #include #include int main() { #ifdef MPFP set_precision(70); #endif initprimes("PRIMES",0); bigfloat ht_limit; bigint u,r,s,t; int verbose = 1, modopt=0, pp=1; long blength, rank, maxrank; cerr<<"\nenter search limit: "; cin>>ht_limit; cerr<<"verbose (0/1)? "; cin >>verbose; cerr<<"process points found (1) or just list them (0): "; cin>>pp; // cout<<"moduli option (0 (Stoll)/ 1/2/3)?"; cin >> modopt; int verb=1; bigint v; vector ai(5); while (getcurve(ai,verb)) { Curvedata C(ai,v); cout << "Input curve "; cout <<"["<>blength; cerr<<"enter max rank to stop when this is reached (-ve for none): "; cin >>maxrank; if(maxrank<0) maxrank=999; vector known_points(blength); if (blength) { for (long j=0; j> P0; Point P(C,scale(P0,v,1)); if ( P.isvalid() ) { Point Q = transform(P,&C_min,u,r,s,t,0); known_points[j] = Q; if(change_flag) { cout< unsat; if(verbose) { cout <<"Regulator (before saturation) = "< b = mwbasis.getbasis(); vector bb(rank); for (long i=0; i1) cout<<"Regulator = "< #include #include #include #include #include #include #include #include #define AUTOLOOP #define LMFDB_ORDER // if defined, sorts newforms into LMFDB order before output #define NAP 25 // number of ap to output #define SEPCHAR "," // char to separate ap in output int main(void) { cerr<<"q-expansions of rational newforms"; #ifdef LMFDB_ORDER cerr<<" in LMFDB order (simple lexicographic)"; #else cerr<<" in Cremona order"; #endif cerr<>firstn>>limit; cerr<1) { cerr<<"Enter level: "; cin>>n; #endif if (n>1) { newforms nf(n,verbose); nf.createfromdata(1,25); int i, num = nf.n1ds; if(num>0){ nap = nf.nflist[0].aplist.size(); if (nap>NAP) nap=NAP; if(verbose) { cout << ">>> Level " << n << " <<<\t"; cout << num << " newform(s) "<v = nf.nflist[i].aplist; copy(v.begin(),v.begin()+nap, ostream_iterator(cout, SEPCHAR)); //vec_out(cout,v,20); cout<<"..."< #include #include #include #include #include int getquartic(quartic& g) { bigint a, b, c, d, e; cout << "Enter quartic coefficients a,b,c,d,e ?" << endl; char ch; cin>>ch; if(ch=='(') cin>>a>>ch>>b>>ch>>c>>ch>>d>>ch>>e>>ch; else { cin.putback(ch); cin >> a >> b >> c >> d >> e; } if (is_zero(a)&&is_zero(b)&&is_zero(c)&&is_zero(d)&&is_zero(e)) return 0; g=quartic(a,b,c,d,e); // will set its own invariants, roots and type return 1; } int main() { show_version(cerr); cout.precision(10); cin.flags( cin.flags() | ios::dec ); int verb; cout << "Verbose? "; cin >> verb; initprimes("PRIMES",0); int modopt=0; // cout<<"moduli option (0 (Stoll)/ 1/2/3)?"; cin >> modopt; quartic g; while (getquartic(g)) { double hlim; cout << "Limit on height? "; cin >> hlim; bigint I = g.getI(), J=g.getJ(), zero(0); Curvedata IJ_curve(zero,zero,zero,-27*I,-27*J,0); bigint tr_u,tr_r,tr_s,tr_t; Curvedata E = IJ_curve.minimalize(tr_u,tr_r,tr_s,tr_t); cout << "I = " << I << ", J = " << J << "\n"; cout << "Minimal model for Jacobian: " << (Curve)E << endl; bigint badp; vector plist = pdivs(6*g.getdisc()); unsigned int i, els, els1; cout << "Checking local solublity in R:\n"; els = ((g.gettype()>1)||is_positive((g.geta()))); if(!els) cout << "Not locally soluble over R\n"; cout << "Checking local solublity at primes " << plist << ":\n"; els1 = qpsoluble(g,bigint(2)); if(!els1) cout << "Not locally soluble at p = 2\n"; els = els&els1; for (i=1; i #include #include #include #include int main() { initprimes("PRIMES"); bigint a, b, c, d, disc; unimod m; while(cout << "Enter cubic coeffs a, b, c, d: ", cin >> a >> b >> c >> d, !(is_zero(a)&&is_zero(b)&&is_zero(c)&&is_zero(d))) { cubic g0(a,b,c,d); cubic g(g0); cout << "Input cubic = "< #include #include #include #include #include #include #include int getquartic(quartic& g); int main() { set_precision(600); cin.flags( cin.flags() | ios::dec ); int verb=1; //0; // cout << "Verbose? "; cin >> verb; initprimes("PRIMES",verb); quartic g; while (getquartic(g)) { cout<<"Quartic is "<>ch; if(ch=='(') cin>>a>>ch>>b>>ch>>c>>ch>>d>>ch>>e>>ch; else { cin.putback(ch); cin >> a >> b >> c >> d >> e; } if (sign(a)==0&&sign(b)==0&&sign(c)==0&&sign(d)==0&&sign(e)==0) return 0; g=quartic(a,b,c,d,e); // will set its own invariants, roots and type return 1; } eclib-20250122/progs/solve_conic.cc000066400000000000000000000060241474421343600170050ustar00rootroot00000000000000// solve_conic.cc: conic solving program for semi-diagonal conics over Q ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #include #include #ifndef VERBOSITY #define VERBOSITY 0 #endif #ifndef CONIC_METHOD #define CONIC_METHOD 4 #endif #define TEST_PARAM int main() { initprimes("PRIMES",VERBOSITY); cout<<"Solving ax^2 + bxz + cz^2 = dy^2\n"; cout<<"Using method "<>ws; if(cin.eof()) {cerr<> a >> b >> c >> d; cout< #include #include #include #ifndef CONIC_METHOD #define CONIC_METHOD 4 #endif #define TEST_PARAM int main() { initprimes("PRIMES"); cout<<"Solving ax^2 + by^2 + cz^2 = 0\n"; cout<<"Using method "<> a >> b >> c; cout<npl) {getline; k=2;}; \ printf("sfe: \t"); for(j=0; jnpl) {getline; k=2;}; printf("%d\t",$k);k++;};\ printf("\n");\ printf("ap0: \t"); for(j=0; jnpl) {getline; k=2;}; printf("%d\t",$k);k++;};\ printf("\n");\ printf("np0: \t"); for(j=0; jnpl) {getline; k=2;}; printf("%d\t",$k);k++;};\ printf("\n");\ printf("dp0: \t"); for(j=0; jnpl) {getline; k=2;}; printf("%d\t",$k);k++;};\ printf("\n");\ printf("lplus: \t"); for(j=0; jnpl) {getline; k=2;}; printf("%d\t",$k);k++;};\ printf("\n");\ printf("mplus: \t"); for(j=0; jnpl) {getline; k=2;}; printf("%d\t",$k);k++;};\ printf("\n");\ printf("lminus: \t"); for(j=0; jnpl) {getline; k=2;}; printf("%d\t",$k);k++;};\ printf("\n");\ printf("mminus: \t"); for(j=0; jnpl) {getline; k=2;}; printf("%d\t",$k);k++;};\ printf("\n");\ printf("a: \t"); for(j=0; jnpl) {getline; k=2;}; printf("%d\t",$k);k++;};\ printf("\n");\ printf("b: \t"); for(j=0; jnpl) {getline; k=2;}; printf("%d\t",$k);k++;};\ printf("\n");\ printf("c: \t"); for(j=0; jnpl) {getline; k=2;}; printf("%d\t",$k);k++;};\ printf("\n");\ printf("d: \t"); for(j=0; jnpl) {getline; k=2;}; printf("%d\t",$k);k++;};\ printf("\n");\ printf("dotplus: \t"); for(j=0; jnpl) {getline; k=2;}; printf("%d\t",$k);k++;};\ printf("\n");\ printf("dotminus: \t"); for(j=0; jnpl) {getline; k=2;}; printf("%d\t",$k);k++;};\ printf("\n");\ printf("type: \t"); for(j=0; jnpl) {getline; k=2;}; printf("%d\t",$k);k++;};\ printf("\n");\ printf("degphi: \t"); for(j=0; jnpl) {getline; k=2;}; printf("%d\t",$k);k++;};\ printf("\n");\ }' eclib-20250122/scripts/showeigs000077500000000000000000000010731474421343600163050ustar00rootroot00000000000000#!/bin/bash NNF=`./nnf $1` NAP=`./nap $1` N=`expr $NNF '*' 64` N=`expr $N + 12` NQ=`factor $1 | cut -d " " -f 2- | fmt -1 | uniq | wc -l` #echo "N = "$1":" #echo ${NNF}" newforms, "${NQ}" bad primes, "${NAP}" ap" #echo od -j ${N} -v -t dS newforms/x$1 | awk 'NF>1' | cut -d " " -f 2- | \ awk -v RS="" -v OFS=" " -v ORS=" " -vnf=$NNF -vnq=$NQ -vnp=$NAP \ '{i=1;\ print "aq:\n"; for(iq=0;iq $${prog}.testout 2>/dev/null && echo "$${prog} completed" && diff $${prog}.testout $(test_output_dir)/$${prog}.out || exit $$? ################ PROCS ############################################# PROCS_TESTS = smattest1 smattest2 smattest3 comptest rattest bigrattest ptest mptest tbessel mvectest mmattest mspace thilbert tp2points tilll vectest1 vectest2 vectest3 mattest1 mattest2 mattest3 space1 space2 space3 svectest1 svectest2 svectest3 tcon2 tlegcert timing threading tversion PROCS_TESTS_SUFFIXED = $(PROCS_TESTS:=$(EXEEXT)) procs_tests: $(PROCS_TESTS_SUFFIXED) ptest_SOURCES=ptest.cc mptest_SOURCES=mptest.cc comptest_SOURCES=comptest.cc rattest_SOURCES=rattest.cc bigrattest_SOURCES=bigrattest.cc mvectest_SOURCES=mvectest.cc mmattest_SOURCES=mmattest.cc mspace_SOURCES=mspace.cc tbessel_SOURCES=tbessel.cc thilbert_SOURCES=thilbert.cc tp2points_SOURCES=tp2points.cc tilll_SOURCES=tilll.cc vectest1_SOURCES=vectest.cc vectest1_CPPFLAGS=${AM_CPPFLAGS} -DSCALAR_OPTION=1 vectest2_SOURCES=vectest.cc vectest2_CPPFLAGS=${AM_CPPFLAGS} -DSCALAR_OPTION=2 vectest3_SOURCES=vectest.cc vectest3_CPPFLAGS=${AM_CPPFLAGS} -DSCALAR_OPTION=3 mattest1_SOURCES=mattest.cc mattest1_CPPFLAGS=${AM_CPPFLAGS} -DSCALAR_OPTION=1 mattest2_SOURCES=mattest.cc mattest2_CPPFLAGS=${AM_CPPFLAGS} -DSCALAR_OPTION=2 mattest3_SOURCES=mattest.cc mattest3_CPPFLAGS=${AM_CPPFLAGS} -DSCALAR_OPTION=3 space1_SOURCES=space.cc space1_CPPFLAGS=${AM_CPPFLAGS} -DSCALAR_OPTION=1 space2_SOURCES=space.cc space2_CPPFLAGS=${AM_CPPFLAGS} -DSCALAR_OPTION=2 space3_SOURCES=space.cc space3_CPPFLAGS=${AM_CPPFLAGS} -DSCALAR_OPTION=3 svectest1_SOURCES=svectest.cc svectest1_CPPFLAGS=${AM_CPPFLAGS} -DSCALAR_OPTION=1 svectest2_SOURCES=svectest.cc svectest2_CPPFLAGS=${AM_CPPFLAGS} -DSCALAR_OPTION=2 svectest3_SOURCES=svectest.cc svectest3_CPPFLAGS=${AM_CPPFLAGS} -DSCALAR_OPTION=3 smattest1_SOURCES=smattest.cc smattest1_CPPFLAGS=${AM_CPPFLAGS} -DSCALAR_OPTION=1 smattest2_SOURCES=smattest.cc smattest2_CPPFLAGS=${AM_CPPFLAGS} -DSCALAR_OPTION=2 smattest3_SOURCES=smattest.cc smattest3_CPPFLAGS=${AM_CPPFLAGS} -DSCALAR_OPTION=3 tcon2_SOURCES=tcon2.cc tlegcert_SOURCES=tlegcert.cc timing_SOURCES=timing.cc threading_SOURCES=threading.cc tversion_SOURCES=tversion.cc check_procs: procs_tests @echo Running procs checks... for prog in $(PROCS_TESTS); do $(check_run); done ################ QCURVES ############################################# QCURVES_TESTS = tcurve tpoints theight thtconst tlatconst tegr telog tdivpol tperiods tsatbnd tsat tsat2 tsat3 conductor tate torsion twist allisog checkgens QCURVES_TESTS_SUFFIXED = $(QCURVES_TESTS:=$(EXEEXT)) qcurves_tests: $(QCURVES_TESTS_SUFFIXED) tcurve_SOURCES=tcurve.cc tpoints_SOURCES=tpoints.cc theight_SOURCES=theight.cc thtconst_SOURCES=thtconst.cc tlatconst_SOURCES=tlatconst.cc tegr_SOURCES=tegr.cc telog_SOURCES=telog.cc tdivpol_SOURCES=tdivpol.cc tperiods_SOURCES=tperiods.cc tsatbnd_SOURCES=tsatbnd.cc tsat_SOURCES=tsat.cc tsat2_SOURCES=tsat2.cc tsat3_SOURCES=tsat3.cc conductor_SOURCES=conductor.cc tate_SOURCES=tate.cc torsion_SOURCES=torsion.cc twist_SOURCES=twist.cc allisog_SOURCES=allisog.cc checkgens_SOURCES=checkgens.cc check_qcurves: qcurves_tests @echo Running qcurves checks... cp $(test_input_dir)/allgens.268605 . for prog in $(QCURVES_TESTS); do $(check_run); done rm -f ./allgens.268605 ################ QRANK ############################################# QRANK_TESTS = tmrank tequiv d2 QRANK_TESTS_SUFFIXED = $(QRANK_TESTS:=$(EXEEXT)) qrank_tests: $(QRANK_TESTS_SUFFIXED) tmrank_SOURCES=tmrank.cc tequiv_SOURCES=tequiv.cc d2_SOURCES=d2.cc check_qrank: qrank_tests @echo Running qrank checks... for prog in $(QRANK_TESTS); do $(check_run); done rm -f PRIMES 1 ################ G0N ############################################# G0N_TESTS = modtest homtest hecketest mhcount tmanin nftest oftest tnfd G0N_TESTS_SUFFIXED = $(G0N_TESTS:=$(EXEEXT)) g0n_tests: $(G0N_TESTS_SUFFIXED) # NB The order of the above does matter: tmanin must be run before # nftest and oftest modtest_SOURCES=modtest.cc homtest_SOURCES=homtest.cc hecketest_SOURCES=hecketest.cc nftest_SOURCES=nftest.cc mhcount_SOURCES=mhcount.cc oftest_SOURCES=oftest.cc tmanin_SOURCES=tmanin.cc tnfd_SOURCES=tnfd.cc # This is the name of a directory which will be used for newform # input/output in the "make check" tests and removed afterwards. export NF_DIR:=nftmp export SNF_DIR:=snftmp export TCURVE_DIR:=tcurves check_g0n: g0n_tests @echo Running g0n checks... rm -rf $(NF_DIR) rm -rf $(SNF_DIR) rm -rf $(TCURVE_DIR) mkdir $(NF_DIR) mkdir $(SNF_DIR) mkdir $(TCURVE_DIR) for prog in $(G0N_TESTS); do $(check_run); done rm -rf $(NF_DIR) rm -rf $(SNF_DIR) rm -rf $(TCURVE_DIR) check: $(MAKE) check_procs check_qcurves check_qrank check_g0n rm -f *.testout PRIMES 1 check_PROGRAMS=$(PROCS_TESTS) $(QCURVES_TESTS) $(QRANK_TESTS) $(G0N_TESTS) # We list here the directories in and out which contain the test input # and expected output files for the tests run by "make check". EXTRA_DIST = in_ntl in_no_ntl out_ntl out_no_ntl ACLOCAL_AMFLAGS = -I m4 eclib-20250122/tests/allisog.cc000066400000000000000000000051131474421343600161420ustar00rootroot00000000000000// allisog.cc: program to find curves isogenous to input curves ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// //#define TEST //#define DUMP_DATA #include #include #include int main(){ #ifdef MPFP set_precision("Enter precision in bits"); #endif int verbose=0; cout << "Verbose? (0/1) " << flush; cin >> verbose; initprimes("PRIMES",0); bigint v; vector ai(5); while (getcurve(ai,verbose)) { Curvedata D(Curvedata(ai,v),1); CurveRed C(D); IsogenyClass cl(C ,verbose); cl.grow(); // cl.display(cout); vector crs=cl.getcurves(); vector cs; for(unsigned int i=0; i curves = cl.getcurves(); cout << "Curve list via getcurves(): " << curves << endl; vector m = cl.getmat(); long ncurves = curves.size(); long i,j; cout << "Isogeny matrix via getmat():\n"; cout << "\t"; for(j=0; j #include int main(void) { cout << "Test run of bigrational number procs.\n\n"; bigint n(4), d(6), g; g = gcd(n,d); cout << "gcd(" << n << "," << d << ") = " << g << "\n"; bigrational q = bigrational(n,d); cout << "q = " << q << " has denominator " << den(q) << \ " and numerator " << num(q) << "\n"; cout << "Enter a rational (either n or n/d): "; cin>>q; cout << "q = " << q << " has denominator " << den(q) << \ " and numerator " << num(q) << "\n"; cout<<"floor(q) = "<>q1>>q2>>q3; cout << "q1 = " << q1 << "\t"; cout << "q2 = " << q2 << "\t"; cout << "q3 = " << q3 << "\n"; cout << "Enter three rationals in the format [q1:q2:q3]: "; char c; cin>>c>>q1>>c>>q2>>c>>q3>>c; cout << "[q1:q2:q3] = [" << q1 << ":"; cout << q2 << ":"; cout << q3 << "]\n"; } eclib-20250122/tests/checkgens.cc000066400000000000000000000156631474421343600164550ustar00rootroot00000000000000// FILE CHECKGENS.CC -- Program to check input gens are Mordell-Weil basis ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include #include #define INPUT_CLASS_IS_LETTER // we only use letters now! Curve C; Curvedata CD; vector plist; int verbose; string genfile; string ccode; #include // for codeletter() function // Utility function for parsing input of lists of integers such as [], [2], [2,2] vector input_list(istream & is); int main() { set_precision(100); cin.flags( cin.flags() | ios::dec ); int rank, rank2, i; long cond, ncurve; bigfloat reg, hmax;; cerr<<"verbose (0/1)? "; cin >>verbose; verbose=0; // cerr<<"\nLimit on height of search (-1 to just check points are on curve)? "; // cin >> hmax; hmax=-1; cerr <<"\n"; cerr << "input filename for curves and generators? "; cin >> genfile; ifstream genin; genin.open(genfile.c_str()); if(!genin.is_open()) {cerr<<"Unable to open file " << genfile << endl; exit(1);} cerr<>ws, !genin.eof()) { genin >> cond; // cout<<"input conductor="<> ccode; #else int nclass; genin >> nclass; ccode = codeletter(nclass-1); // cout<<"After input, nclass="<> ncurve; // cout<<"After input, ncurve="<>C; // cout<<"After input, C="<> rank; cout << "r = "< torsion_group = input_list(genin); int trank = torsion_group.size(); cout<<"torsion group structure = "< points; points.reserve(rank); int j=0; Point P(CD); int oP; bigfloat htP; while(j> P; if ( P.isvalid() ) { cout<<"P = "< tpoints; points.reserve(trank); j=0; while(j> P; if ( P.isvalid() ) { cout<<"P = "<maxht) maxht=ht; } mw mwbasis(&CD,verbose,1); mwbasis.process(plist); rank2 = mwbasis.getrank(); int rank_under = (rank2hmax)) { if(!verbose) cout<<"\n"; cout<<"Bound on naive height of extra generators = "<hmax) { cout<<"Only searching up to height "<1) { if(!verbose) cout<<"\n"; cout << "Points found contain original with index " << index <<"\n"; vector b = mwbasis.getbasis(); for (i=0; i input_list(istream & is) { char c; int a; vector ai; is>>c; // swallow first [ is>>ws>>c; if (c==']') return ai; is.unget(); while (c!=']') { is >> a >> c; // c is a comma or ] ai.push_back(a); } return ai; } eclib-20250122/tests/comptest.cc000066400000000000000000000063421474421343600163530ustar00rootroot00000000000000// comptest.cc: test program for complex functions ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #include int main(void) { set_precision("Enter precision in bits"); #ifdef MPFP long original_output_precision = RR::OutputPrecision(); RR::SetOutputPrecision(original_output_precision-1); #endif bigfloat x=to_bigfloat(double(3.125)), y=to_bigfloat(4.25); bigcomplex z = bigcomplex(x,y); bigcomplex a = bigcomplex(to_bigfloat(1),to_bigfloat(1)); bigcomplex b = bigcomplex(to_bigfloat(2),to_bigfloat(1)); bigcomplex c; cout << "z = " << z << "\n"; cout << " has real part = " << real(z) << "\n"; cout << " and imaginary part = " << imag(z) << "i\n"; cout << "z has complex conjugate = " << conj(z) << "\n"; c = cagm(z,bigcomplex(to_bigfloat(1))); cout << "AGM(" << z << "," << bigcomplex(to_bigfloat(1)) << ") = "; cout << c << "\n\n"; cout << "AGM(" << a << "," << b << ") = "< roots; cout << "Enter Integer coefficients of a (monic) cubic:"; cin>>ia>>ib>>ic; roots = Introotscubic(ia,ib,ic); nr=roots.size(); if (nr==0) cout << "No integer roots"<> z; rootz=exp(log(z)/three); cout << "Main cube root = " << rootz << endl; cout << "whose cube is " << pow(rootz,3) << endl; rootz*=w; cout << "Next cube root = " << rootz << endl; cout << "whose cube is " << pow(rootz,3) << endl; rootz*=w; cout << "Next cube root = " << rootz << endl; cout << "whose cube is " << pow(rootz,3) << endl; // Test for quartic root-finding: bigfloat xa,xb,xc,xd,xe; cout << "Enter real coefficients a b c d e of a quartic:"; cin>>xa>>xb>>xc>>xd>>xe; int iroot; vector croots = solverealquartic((xa), (xb),(xc),(xd),(xe)); cout<<"Quartic [" < #include int main(void) { initprimes("PRIMES",0); int verb=1; bigint v; vector ai(5); while (getcurve(ai,verb)) { cout <<"["<> verb; initprimes("PRIMES",0); double hlim=8; cout << "Limit on height? "; cin >> hlim; cout << "Stop after first point found? "; cin >> alldesc; alldesc=1-alldesc; cout << "Selmer only (0/1: if 1, just tests whether second descent possible)? "; cin >> selmer_only; quartic g; while (getquartic(g)) { bigint I = g.getI(), J=g.getJ(); Curvedata IJ_curve(zero,zero,zero,-27*I,-27*J,0); bigint tr_u,tr_r,tr_s,tr_t; Curvedata E = IJ_curve.minimalize(tr_u,tr_r,tr_s,tr_t); bigint d1=g.geta(), c=g.getcc(), d2=g.gete(); bigint d = d1*d2, cdash = -2*c, ddash = sqr(c)-4*d; vector plist = pdivs(6*d*ddash); vector supp = support(ddash); long mask=0; Curvedata E_cd(zero,c,zero,d,zero, 0); cout << "cd-curve (nearer):\t" << (Curve)E_cd << endl; Curvedata E_cd_dash(zero,cdash,zero,ddash,zero, 0); cout << "cd-dash-curve (further):\t" << (Curve)E_cd_dash << endl; Point P(&E_cd); Point Q(&E_cd_dash); cout << "I = " << I << ", J = " << J << "\n"; cout << "Minimal model for Jacobian: " << (Curve)E << endl; cout << "Checking local solublity at primes " << plist << ":\n"; int els, els1; bigint two(2); els = els1 = qpsoluble(g,two); if(!els1) cout << "Not locally soluble at p = 2\n"; for (const auto& p : plist) { if (p>2) { els1=new_qpsoluble(g,p); if(!els1) cout << "Not locally soluble at p = "<>ch; if(ch=='(') cin>>a>>ch>>b>>ch>>c>>ch>>d>>ch>>e>>ch; else { cin.putback(ch); cin >> a >> c >> e; b=0; d=0; } if (sign(a)==0) return 0; g=quartic(a,b,c,d,e); return 1; } eclib-20250122/tests/hecketest.cc000066400000000000000000000257531474421343600165030ustar00rootroot00000000000000// FILE HECKETEST.CC -- Test program for Hecke operators ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // #include #include #include #include #include #include #include #include #include #include #include #include #include //#define AUTOLOOP //#define COMPARE_OLD //#define CHECK_COMMUTE //#define TEST_EIGS double sparsity(const mat_m& m); double sparsity(const mat& m); vector eigrange(long p) { long aplim=3, four_p=p<<2; while (aplim*aplim<=four_p) aplim++; aplim--; vector ans(1+2*aplim); iota(ans.begin(),ans.end(),-aplim); return ans; } int main(void) { cout << "Program hecketest. Using METHOD = " << METHOD << " to find newforms" << endl; #ifdef MODULAR cout << "MODULUS for linear algebra = " << MODULUS << endl; #endif init_time(); start_time(); int n=2; int plus=1; int verbose=0; cout << "See the hecke matrices (0/1)? "; cin >> verbose; cout << "Plus space (0/1)? "; cin >> plus; #ifdef AUTOLOOP int limit; cout<<"Enter limit on level: ";cin>>limit; while (n1) { cout<<"Enter level: "; cin>>n; #endif if (n>1) { cout << ">>>Level " << n << "\t"; homspace hplus(n,plus,0,0); int genus = hplus.h1dim(); long den = hplus.h1denom(); bigint den2; den2 = den*den; cout << "Dimension = " << genus << "\n"; cout << "denominator = " << den << "\n"; vector badprimes = hplus.plist; int nq = badprimes.size(); int firstq=0; // =0 for all W's if (genus>0) { mat_m id = mat_m::identity_matrix(genus); mat_m id2 = den2*id; vector wqlist(nq); cout << "Computing conjmat... " << flush; smat conjmat = hplus.s_conj(1); cout<<" done."<>w_eigs; for (int i=0; i1) cout<<" (scaled by "<>np; vector tplist(np); for (primevar pr(np+nq); pr.ok()&&ip1) cout<<" (scaled by "< eigs = eigrange(p); // hplus.eigrange(nq+ip); cout<<"\nChecking for eigenvalues from "<0) cout<<" IS "; else cout<<" is NOT "; cout<<"an eigenvalue"; if(nulty>0) cout<<", of multiplicity "<0) MT = MT * addscalar(m2,(-e*e)); } stop_time(); cout<<"...done, sparsity = "<0) cout<<" IS "; else cout<<" is NOT "; cout<<"an eigenvalue"; if(nulty>0) cout<<", of multiplicity "<0) } // end of if(n) } // end of while(n>1) or while(n #include #include #include #include #define AUTOLOOP //#define SHOW_TIMES int main(void) { init_time(); int n=1; int plus=1; int verbose=0; int cuspidal=0; vector dims(3), cdims(3); // cout << "Verbose? "; cin >> verbose; // cout << "Plus space, minus space or full space (+1,-1,0)? "; cin >> plus; int s,limit; #ifdef AUTOLOOP cout<<"Enter first and last levels: ";cin>>n>>limit; n--; while (n1) { cout<<"Enter level: "; cin>>n; #endif if (n>1) { { cout << "\n>>>Level " << n << "\n"; for (s=0; s<3; s++) { plus=(s==0? 1 : (s==1? -1: 0)); if(verbose) { cout<<"Computing sign="< #include #include #include #include int main(void) { init_time(); start_time(); cout << "\nMatrix package test program.\n\n"; { long i; scalar r; mat a,aug,ref; vec_i pc(1),npc(1); vec poly(1); { cout << "Enter size of a square matrix A: "; cin >> r; a.init(r,r); cout << "Enter entries of A: "; cin >> a; cout << "A = " << a; cout << "Using A.output(cout): "; a.output(cout); cout << "Using A.output_pari(cout): "; a.output_pari(cout); cout << "Using A.output_pretty(cout): \n"; a.output_pretty(cout); } string filename; cout<< "Enter a filename for matrix binary output: "; cin>>filename; a.dump_to_file(filename); cout<< "Matrix dumped to file " << filename << endl; mat ax; ax.read_from_file(filename); cout<< "Matrix reread from file " << filename << endl; cout << "B = " << ax; if(a==ax) cout<<"agree"; else cout << "WRONG!"; cout<> i; { cout << "Creating an array of 3 matrices\n"; vector matlist(3); matlist[0] = a; matlist[1] = 2*a; matlist[2] = 3*a; cout << " A=" << matlist[0]; cout << "2A=" << matlist[1]; cout << "3A=" << matlist[2]; } { for (i=1; i<=r; i++) cout << "row(A,"<> i; } mat b = a; { cout << "B = A = " << b; cout << "Enter any number "; cin >> i; cout << "B==A?" << (b==a) << endl; cout << "B!=A?" << (b!=a) << endl; b+=a; cout << "after B+:=A, A = " << a << "and B = " << b; cout << "Enter any number "; cin >> i; } { b-=a; cout << "after B-:=A, A = " << a << "and B = " << b; cout << "Enter any number "; cin >> i; b*=2; cout << "after B*:=2, A = " << a << "and B = " << b; cout << "Enter any number "; cin >> i; b/=2; cout << "after B/:=2, A = " << a << "and B = " << b; cout << "Enter any number "; cin >> i; } { cout << "A+B=" << (a+b); cout << "Now A = " << a << "and B = " << b; cout << "Enter any number "; cin >> i; cout << "A-B=" << (a-b); cout << "Now A = " << a << "and B = " << b; cout << "Enter any number "; cin >> i; cout << "A*B=" << (a*b); cout << "Now A = " << a << "and B = " << b; } { cout << "Enter any number "; cin >> i; cout << "-A=" << (-a); cout << "Now A = " << a; cout << "-A=" << (-a); cout << "Now A = " << a; cout << "Enter any number "; cin >> i; } { vector cp = a.charpoly(); cout << "char. poly. of A has coefficients " << cp << endl; cout << "det(A) = " << a.determinant() << endl; } { aug = colcat(a,mat::identity_matrix(r)); cout << "Augmented matrix = " << aug << endl; } long rk, ny; scalar denom; { int method=0; cout << "Which echelon method? (0=standard,1=longlong,2=modular) "; cin>>method; cout << "\nUsing method " << method; if(method==2) cout << " (modulus = " << DEFAULT_MODULUS << ")"; cout << endl; ref = echelon(aug, pc, npc, rk, ny, denom, method); cout << "Echelon matrix = " << ref; cout << "pivotal columns: " << pc << endl; cout << "nonpivotal columns: " << npc << endl; cout << "Denom = " << denom << endl; } for (i=1,rk=0; (i<=r)&&(pc[i]<=r); i++,rk++) ; ny = r-rk; cout << "Rank = " << rk << endl; cout << "Nullity = " << ny << endl; if (rk1) cout << "(1/" << denom << ")*"; cout << ainv; cout << "Check: A.A^(-1) = I ?"; if (a*ainv == mat::scalar_matrix(r,denom)) cout << " True!"; else cout << " False!"; cout << endl; } // Clear up: ref.init(); pc.init(); npc.init(); aug.init(); a.init(); } stop_time(); //cout << "cpu time = "; show_time(); cout << endl; } eclib-20250122/tests/mhcount.cc000066400000000000000000000042511474421343600161670ustar00rootroot00000000000000// FILE MHCOUNT.CC: Program to list/count Manin-Heilbronn matrices ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // #include void outmat(int n, long a, long b, long c, long d) { cout<<"mats["<>seemats; cout << "How many primes? "; cin >> np; for(primevar pr(np); pr.ok(); pr++) { long p = (long)pr; if(p==2) continue; long p2 = (p-1)/2; int nmats=0; cout << "p = " << p << ";\t"; if(seemats) { cout << "\n"; outmat(nmats,1,0,0,p); } nmats++; if(seemats) outmat(nmats,p,0,0,1); nmats++; for(int s=1; s>-2; s-=2) for(long r=1; r<=p2; r++) { // cout<<"r = " << s*r << ":" << endl; long x1=p, x2=-s*r, y1=0, y2=1, a=-p, b=s*r; if(seemats) outmat(nmats,x1,x2,y1,y2); nmats++; while(b!=0) { long c=mod(a,b); long q=(a-c)/b; long x3=q*x2-x1; long y3=q*y2-y1; a=-b; b=c; x1=x2; x2=x3; y1=y2; y2=y3; if(seemats) outmat(nmats,x1,x2,y1,y2); nmats++; } } if(seemats) cout<<"\n"; cout << "nmats = " << nmats << ";" << endl; } } eclib-20250122/tests/mmattest.cc000066400000000000000000000104561474421343600163540ustar00rootroot00000000000000// mmattest.cc: Multiprecision matrix package test program ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #include #include int main(void) { time_t starttime,stoptime; time(&starttime); cout << "\nMultiprecision matrix package test program.\n\n"; { long i; scalar r; mat_m a,aug,ref; vec_i pc(1),npc(1); vec_m poly(1); { cout << "Enter size of a square matrix A: "; cin >> r; a.init(r,r); cout << "Enter entries of A: "; cin >> a; cout << "A = " << a; } { cout << "Creating an array of 3 matrices\n"; vector matlist(3); matlist[0] = a; matlist[1] = bigint(2)*a; matlist[2] = bigint(3)*a; cout << " A=" << matlist[0]; cout << "2A=" << matlist[1]; cout << "3A=" << matlist[2]; } { for (i=1; i<=r; i++) cout << "row(A,"<> i; } { mat sa = to_mat_i(a); cout << "After shortening to a matrix of ints, A = " << sa; } mat_m b = a; { cout << "B = A = " << b; cout << "Enter any number "; cin >> i; cout << "B==A?" << (b==a) << endl; cout << "B!=A?" << (b!=a) << endl; b+=a; cout << "after B+:=A, A = " << a << "and B = " << b; cout << "Enter any number "; cin >> i; } { b-=a; cout << "after B-:=A, A = " << a << "and B = " << b; cout << "Enter any number "; cin >> i; bigint two; two=2; b*=two; cout << "after B*:=2, A = " << a << "and B = " << b; cout << "Enter any number "; cin >> i; b/=two; cout << "after B/:=2, A = " << a << "and B = " << b; cout << "Enter any number "; cin >> i; } { cout << "A+B=" << (a+b); cout << "Now A = " << a << "and B = " << b; cout << "Enter any number "; cin >> i; cout << "A-B=" << (a-b); cout << "Now A = " << a << "and B = " << b; cout << "Enter any number "; cin >> i; cout << "A*B=" << (a*b); cout << "Now A = " << a << "and B = " << b; } { cout << "Enter any number "; cin >> i; cout << "-A=" << (-a); cout << "Now A = " << a; cout << "-A=" << (-a); cout << "Now A = " << a; cout << "Enter any number "; cin >> i; } { vector cp = a.charpoly(); cout << "char. poly. of A has coefficients " << cp << endl; cout << "det(A) = " << a.determinant() << endl; } { aug = colcat(a, mat_m::identity_matrix(r)); cout << "Augmented matrix = " << aug << endl; } long rk, ny; bigint denom; { int method; cout << "Which echelon method? (0=standard,1=longlong,2=modular) "; cin>>method; ref = echelon(aug, pc, npc, rk, ny, denom, method); cout << "Echelon matrix = " << ref; cout << "pivotal columns: " << pc << endl; cout << "nonpivotal columns: " << npc << endl; cout << "Denom = " << denom << endl; } for (i=1,rk=0; (i<=r)&&(pc[i]<=r); i++,rk++) ; ny = r-rk; cout << "Rank = " << rk << endl; cout << "Nullity = " << ny << endl; if (rk #include #include #include #define AUTOLOOP int main(void) { init_time(); start_time(); int n=1; int verbose=0; cout << "Display symbol details (0/1)? " << flush; cin >> verbose; int limit; #ifdef AUTOLOOP cout<<"Enter first and last levels: ";cin>>n>>limit; n--; while (n1) { cout<<"Enter level: "; cin>>n; #endif if (n>1) { cout << ">>>Level " << n << "\t"; symbdata symbols(n); cout<<"("< #define MAXPRIME 1000000 int main() { initprimes("PRIMES",1); cout<<"long prime factors of 420:\n"; vector lplist = pdivs(420); cout< lqlist = posdivs(420, lplist); cout< a(3); a[0]=10; a[1]=20; a[2]=30; vector b = a; cout << "Elements of a are: " << a[0]<<"\t"< iplist = pdivs(num); cout< iqlist = posdivs(num, iplist); cout< of iplist (alldivs)\n"; vector irary(iplist); cout<<"stream output: "<> aaa, aaa!=astop) { int res = sign(aaa); cout << "a = " << aaa << ", sign(a) = " << res << "\n"; roota = sqrt(aaa); cout << "a = " << aaa << ", sqrt(a) = " << roota << " (rounded down)\n"; res = isqrt(aaa,roota); if(res) cout << "a is a square with exact square root " << roota << "\n"; else cout << "a is not a square\n"; } cout<<"\n\nTest of sqrt mod p\n"; bigint bb,p,r; while(cout << "Enter a prime p: ", cin>>p, cout<> m, sign(m)!=0) { cout << "m = " << m << endl; vector plist=pdivs(m); cout << "m has " << plist.size() << " prime divisors: " << plist << endl; cout << "with exponents: "; for( const auto& pi : plist) cout << pi <<":"< dlist=alldivs(m,plist); cout << "m has " << dlist.size() << " divisors: " << dlist << endl; dlist = posdivs(m,plist); cout << "m has " << dlist.size() << " positive divisors: " << dlist << endl; dlist = sqdivs(m,plist); cout << "m has " << dlist.size() << " positive divisors whose square divides m: " << dlist << endl; dlist = sqfreedivs(m,plist); cout << "m has " << dlist.size() << " positive square-free divisors: " << dlist << endl; } cout< const bigint MBIGPRIME=to_ZZ("6074000003"); // will convert this string to an bigint //This is nearly the largest p such that (p/2)^2 < 2^63. int main() { cin.flags( cin.flags() | ios::dec ); cout << "\nM-Subspace package test program\n\n"; int i,r=0; while (cout << "Enter size of square matrix M: ", cin >> r, r>0 ) { mat_m m(r,r); cout << "Enter entries of M: "; cin >> m; cout << " M = " << m; cout << "Trace(M) = " << m.trace() << endl; // mat_m mpower=m; for (i=2; i<=r; i++) {mpower=mpower*m; cout << "m^" << i << " = " << mpower; cout << "Trace(m^" << i << ") = " << mpower.trace() << endl; } // { vector cp = m.charpoly(); cout << "char. poly. of m has coefficients " << cp << endl; } cout << "det(M) = " << m.determinant() << endl; cout << "rank(M) = " << m.rank() << endl; cout << "nullity(M) = " << m.nullity() << endl; { subspace_m ker = kernel(m); mat_m kerbasis = basis(ker); cout << "kernel(m) has basis\n" << kerbasis; vec_i kerpivs = pivots(ker); cout << "pivots: " << kerpivs << "\n"; bigint kerdenom = denom(ker); cout << "denom: " << kerdenom << "\n"; } { subspace_m im = image(m); cout << "image(m) has basis\n" << basis(im); cout << "pivots: " << pivots(im) << "\n"; cout << "denom: " << denom(im) << "\n"; } { bigint lambda; cout << "Enter lambda: "; cin >> lambda; subspace_m elambda = eigenspace(m,lambda); cout << "eigenspace for lambda = " << lambda << " has basis\n" << basis(elambda); cout << "with dimension " << dim(elambda) << endl; cout << "\nNow repeating eigenspace calculation modulo " << MBIGPRIME << endl; subspace_m elp; lift(peigenspace(m,lambda,MBIGPRIME),MBIGPRIME, elp); cout << "eigenspace for lambda has basis\n" << basis(elp); cout << "with dimension " << dim(elp) << endl; } } cout< #include int main(void) { cout << "Test run of vector package.\n\n"; int i,j,k; scalar n; cout << "Enter n : "; cin >> n; vec_m v; cout << "Uninitialized new vector v = " << v << endl; vec_m v2(v); cout << "Copy of v = " << v2 << endl; v.init(n); cout << "Initialized new vector v = " << v << endl; vec_m v3(v); cout << "Copy of v = " << v3 << endl; cout << "Enter new entries of v: "; cin >> v; cout << "Now v = " << v << endl; vec_m w(3); cout << "w = " << w << endl; w = v; cout << "After w=v, " << endl; cout << "Now v = " << v << endl; cout << "Now w = " << w << endl; cout << "w==v: " << (w==v) << endl; cout << "w!=v: " << (w!=v) << endl; cout << "Enter i : "; cin >> i; bigint two; two=2; w*=two; cout << "After w*=2, w = " << w << endl; cout << "3*v = " << (bigint(3)*v) << endl; cout << "Now v = " << v << endl; cout << "v+w = " << v+w << endl; cout << "Now v = " << v << endl; cout << "v-w = " << v-w << endl; cout << "Now v = " << v << endl; cout << "v*w = " << v*w << endl; cout << "Now v = " << v << endl; cout << "w/2 = " << w/two << endl; cout << "Now w = " << w << endl; cout << "-v = " << -v << endl; cout << "+v = " << +v << endl; cout << "+w = " << +w << endl; cout << "v = " << v << "; w = " << w << endl; cout << "Elements of v: \n"; for (i=1; i<=n; i++) cout << "v[" << i << "] = " << v[i] << endl; cout << "Member test: Enter a test number: " ; bigint vi; cin >> vi; cout << vi; if (member(vi,v)) cout << " IS "; else cout << " IS NOT "; cout << "a member of v." << endl; cout << "Subscript test\n"; cout << "Enter length of subscript vector:"; int m; cin >> m; vec index(m); cout << "Enter subscript vector:"; cin >> index; vec_m vv = v[index]; cout << "The sub-vector is " << vv << endl; cout << "Change one entry of v. Index?"; cin >> i; cout << "New entry?"; bigint x; cin >> x; v[i]=x; cout << "New entry: v[" << i << "] = " << v[i] << endl; cout << "Now v = " << v << endl; cout << "Initial slice; length? "; cin >> j; cout << "Slice = " << v.slice(j) << endl; cout << "Now v = " << v << endl; cout << "General slice; beginning, end? "; cin >> j >> k; cout << "Slice = " << v.slice(j,k) << endl; cout << "Now v = " << v << endl; cout << "w = " << w << "; content(w) = " << content(w) << endl; makeprimitive(w); cout << "After makeprimitive(w), w = " << w << endl; vec sv = to_vec_i(v); cout << "v shortened to a vector of ints: " << sv << endl; vec_m u(n); cout << "u = "<< u << endl; swapvec(u,v); cout << "After swapvec(u,v):\nu = " << u << "\nv = " << v << endl; } eclib-20250122/tests/nftest.cc000066400000000000000000000042121474421343600160120ustar00rootroot00000000000000// FILE NFTEST.CC: test program for newform constructor ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // // #include #include #include #include #include #include #include #include //#define AUTOLOOP #define LMFDB_ORDER // if defined, sorts newforms into LMFDB order before output int main(void) { int n=2; int verbose=1; #ifdef AUTOLOOP int firstn, limit, count=0; cerr<<"Enter first and last N: ";cin>>firstn>>limit; n=firstn-1; cout<1) { cerr<<"Enter level: "; cin>>n; #endif if (n>1) { cout << ">>> Level " << n << " <<<\t"; newforms nf(n,verbose); cout << "\nAfter constructor, about to createfromdata() \n"; nf.createfromdata(1,25); int num = nf.n1ds; #ifdef AUTOLOOP count+=num; #endif cout << num << " newform(s), "< #include #include #define AUTOLOOP int main(void) { int n=11, limit; int verbose; cout << "Verbose details of oldform constructor? "; cin >> verbose; #ifdef AUTOLOOP cout<<"Enter first and last N: ";cin>>n>>limit; n--; while (n>n, n>1) { #endif cout << ">>>Level " << n << "\t"; moddata symbols(n); // (not really needed except //that the level data gets initialized properly //which IS needed for oldforms) oldforms of(10,&symbols,verbose); // default args ntp=5, verbose=0 of.display(); } // end of while() } // end of main() eclib-20250122/tests/out_no_ntl/000077500000000000000000000000001474421343600163615ustar00rootroot00000000000000eclib-20250122/tests/out_no_ntl/allisog.out000066400000000000000000000033261474421343600205500ustar00rootroot00000000000000Verbose? (0/1) [ [0,-1,1,-10,-20] [0,-1,1,-7820,-263580] [0,-1,1,0,0] ] [0,5,5;5,0,0;5,0,0] [ [1,0,1,4,-6] [1,0,1,-36,-70] [1,0,1,-1,0] [1,0,1,-171,-874] [1,0,1,-11,12] [1,0,1,-2731,-55146] ] [0,2,3,3,0,0;2,0,0,0,3,3;3,0,0,0,2,0;3,0,0,0,0,2;0,3,2,0,0,0;0,3,0,2,0,0] [ [1,1,1,-10,-10] [1,1,1,35,-28] [1,1,1,-135,-660] [1,1,1,-5,2] [1,1,1,-110,-880] [1,1,1,-2160,-39540] [1,1,1,-80,242] [1,1,1,0,0] ] [0,2,2,2,0,0,0,0;2,0,0,0,0,0,0,0;2,0,0,0,2,2,0,0;2,0,0,0,0,0,2,2;0,0,2,0,0,0,0,0;0,0,2,0,0,0,0,0;0,0,0,2,0,0,0,0;0,0,0,2,0,0,0,0] [ [1,-1,1,-1,-14] [1,-1,1,-6,-4] [1,-1,1,-91,-310] [1,-1,1,-1,0] ] [0,2,0,0;2,0,2,2;0,2,0,0;0,2,0,0] [ [0,1,1,-9,-15] [0,1,1,1,0] [0,1,1,-769,-8470] ] [0,3,3;3,0,0;3,0,0] [ [0,1,0,4,4] [0,1,0,-1,0] [0,1,0,-36,-140] [0,1,0,-41,-116] ] [0,2,3,0;2,0,0,3;3,0,0,2;0,3,2,0] [ [1,0,0,-4,-1] [1,0,0,-39,90] [1,0,0,-49,-136] [1,0,0,1,0] [1,0,0,-34,-217] [1,0,0,-784,-8515] ] [0,2,2,2,0,0;2,0,0,0,0,0;2,0,0,0,2,2;2,0,0,0,0,0;0,0,2,0,0,0;0,0,2,0,0,0] [ [0,-1,0,-4,4] [0,-1,0,-64,220] [0,-1,0,1,0] [0,-1,0,-24,-36] [0,-1,0,16,-180] [0,-1,0,-384,-2772] ] [0,2,2,2,0,0;2,0,0,0,0,0;2,0,0,0,0,0;2,0,0,0,2,2;0,0,0,2,0,0;0,0,0,2,0,0] [ [1,0,1,-5,-8] [1,0,1,0,0] [1,0,1,-460,-3830] ] [0,3,3;3,0,0;3,0,0] [ [1,-1,1,-3,3] [1,-1,1,-213,-1257] ] [0,7;7,0] [ [0,0,1,0,-7] [0,0,1,0,0] [0,0,1,-270,-1708] [0,0,1,-30,63] ] [0,3,3,0;3,0,0,3;3,0,0,0;0,3,0,0] [ [1,0,1,1,2] [1,0,1,-19,26] [1,0,1,-14,-64] [1,0,1,-289,1862] [1,0,1,-69,-194] [1,0,1,-334,-2368] [1,0,1,-454,-544] [1,0,1,-5334,-150368] ] [0,2,3,0,0,0,0,0;2,0,0,2,2,3,0,0;3,0,0,0,0,2,0,0;0,2,0,0,0,0,3,0;0,2,0,0,0,0,0,3;0,3,2,0,0,0,2,2;0,0,0,3,0,2,0,0;0,0,0,0,3,2,0,0] [ [0,0,0,4,0] [0,0,0,-1,0] [0,0,0,-11,14] [0,0,0,-11,-14] ] [0,2,0,0;2,0,2,2;0,2,0,0;0,2,0,0] eclib-20250122/tests/out_no_ntl/bigrattest.out000066400000000000000000000006771474421343600212740ustar00rootroot00000000000000Test run of bigrational number procs. gcd(4,6) = 2 q = 2/3 has denominator 3 and numerator 2 Enter a rational (either n or n/d): q = 123456789/234567890 has denominator 234567890 and numerator 123456789 floor(q) = 0 ceil(q) = 1 Enter three rationals separated by whitespace: q1 = 111111111111/2222222222222 q2 = 33333333333/4444444444444 q3 = 185185185185185/22222222222 Enter three rationals in the format [q1:q2:q3]: [q1:q2:q3] = [1/2:3/4:5/6] eclib-20250122/tests/out_no_ntl/checkgens.out000066400000000000000000000045031474421343600210460ustar00rootroot00000000000000268605a1 [0,0,1,1032,2673]: r = 1 torsion group structure = [ ] (torsion rank 0). P = [41:337:1] OK, order=oo, height=0.5999065173477. 268605b1 [0,0,1,14802,-4767741]: r = 1 torsion group structure = [ ] (torsion rank 0). P = [52199:344443:343] OK, order=oo, height=4.8009119417026. 268605c1 [1,-1,0,-450,2781]: r = 2 torsion group structure = [ ] (torsion rank 0). P = [-154:585:8] OK, order=oo, height=2.4620339650023. P = [76:597:1] OK, order=oo, height=1.9744004986562. 268605d1 [1,-1,0,-1194,15983]: r = 1 torsion group structure = [ 2 ] (torsion rank 1). P = [-314:437:8] OK, order=oo, height=4.2655328871552. P = [22:-11:1] OK, order=2, height=0. 268605d2 [1,-1,0,-2319,-17992]: r = 1 torsion group structure = [ 2 2 ] (torsion rank 2). P = [-117782:149171:2744] OK, order=oo, height=8.5310657743105. P = [52:-26:1] OK, order=2, height=0. P = [-8:4:1] OK, order=2, height=0. 268605d3 [1,-1,0,8256,-142777]: r = 1 torsion group structure = [ 2 ] (torsion rank 1). P = [2451471778:11277201335:138991832] OK, order=oo, height=17.062131548621. P = [134:-67:8] OK, order=2, height=0. 268605d4 [1,-1,0,-30894,-2081107]: r = 1 torsion group structure = [ 2 ] (torsion rank 1). P = [-64232978894:39611125679:622835864] OK, order=oo, height=17.062131548621. P = [-826:413:8] OK, order=2, height=0. 268605e1 [1,-1,0,8256,753083]: r = 1 torsion group structure = [ 2 ] (torsion rank 1). P = [395144:10859243:512] OK, order=oo, height=8.5829151366781. P = [-62:31:1] OK, order=2, height=0. 268605e2 [1,-1,0,-91149,9441080]: r = 1 torsion group structure = [ 2 2 ] (torsion rank 2). P = [317636:-1639318:1331] OK, order=oo, height=4.2914575683391. P = [998:-499:8] OK, order=2, height=0. P = [220:-110:1] OK, order=2, height=0. 268605e3 [1,-1,0,-1413024,646849205]: r = 1 torsion group structure = [ 2 ] (torsion rank 1). P = [7372618:-6306479:10648] OK, order=oo, height=8.5829151366779. P = [5510:-2755:8] OK, order=2, height=0. 268605e4 [1,-1,0,-359754,-73128097]: r = 1 torsion group structure = [ 2 ] (torsion rank 1). P = [265770428:14415192911:85184] OK, order=oo, height=8.5829151366781. P = [-3514:1757:8] OK, order=2, height=0. 268605f1 [0,0,1,-110937,14226165]: r = 1 torsion group structure = [ ] (torsion rank 0). P = [1554:631:8] OK, order=oo, height=1.9389206422901. 268605g1 [0,0,1,-747,8255]: r = 0 torsion group structure = [ ] (torsion rank 0). eclib-20250122/tests/out_no_ntl/comptest.out000066400000000000000000000014011474421343600207440ustar00rootroot00000000000000z = (3.125,4.25) has real part = 3.125 and imaginary part = 4.25i z has complex conjugate = (3.125,-4.25) AGM((3.125,4.25),(1,0)) = (2.0783161721733,1.5633615899066) AGM((1,1),(2,1)) = (1.4713493628647,1.0200541263377) Enter Integer coefficients of a (monic) cubic:The 1 root(s) are: [ -1 ] Enter a real or complex: Main cube root = (1.6289371459222,0.52017450230455) whose cube is (3,4) Next cube root = (-1.2649529063578,1.1506136983845) whose cube is (3,4) Next cube root = (-0.36398423956442,-1.670788200689) whose cube is (3,4) Enter real coefficients a b c d e of a quartic:Quartic [1,2,3,4,5] has roots: (-1.2878154795576,-0.85789675832849) (-1.2878154795576,0.85789675832849) (0.28781547955765,1.4160930801719) (0.28781547955765,-1.4160930801719) eclib-20250122/tests/out_no_ntl/conductor.out000066400000000000000000000041431474421343600211140ustar00rootroot00000000000000[0,-1,1,-10,-20]: N = 11 [1,0,1,4,-6]: N = 14 [1,1,1,-10,-10]: N = 15 [1,-1,1,-1,-14]: N = 17 [0,1,1,-9,-15]: N = 19 [0,1,0,4,4]: N = 20 [1,0,0,-4,-1]: N = 21 [0,-1,0,-4,4]: N = 24 [1,0,1,-5,-8]: N = 26 [1,-1,1,-3,3]: N = 26 [0,0,1,0,-7]: N = 27 [1,0,1,1,2]: N = 30 [0,0,0,4,0]: N = 32 [1,1,0,-11,0]: N = 33 [1,0,0,-3,1]: N = 34 [0,1,1,9,1]: N = 35 [0,0,0,0,1]: N = 36 [0,0,1,-1,0]: N = 37 [0,1,1,-23,-50]: N = 37 [1,0,1,9,90]: N = 38 [1,1,1,0,1]: N = 38 [1,1,0,-4,-5]: N = 39 [0,0,0,-7,-6]: N = 40 [1,1,1,-4,5]: N = 42 [0,1,1,0,0]: N = 43 [0,1,0,3,-1]: N = 44 [1,-1,0,0,-5]: N = 45 [1,-1,0,-10,-12]: N = 46 [0,1,0,-4,-4]: N = 48 [1,-1,0,-2,-1]: N = 49 [1,0,1,-1,-2]: N = 50 [1,1,1,-3,1]: N = 50 [0,1,1,1,-1]: N = 51 [0,0,0,1,-10]: N = 52 [1,-1,1,0,0]: N = 53 [1,-1,0,12,8]: N = 54 [1,-1,1,1,-1]: N = 54 [1,-1,0,-4,3]: N = 55 [0,-1,0,0,-4]: N = 56 [0,0,0,1,2]: N = 56 [0,-1,1,-2,2]: N = 57 [1,0,1,-7,5]: N = 57 [0,1,1,20,-32]: N = 57 [1,-1,0,-1,1]: N = 58 [1,1,1,5,9]: N = 58 [1,0,0,-2,1]: N = 61 [1,-1,1,-1,1]: N = 62 [1,-1,0,9,0]: N = 63 [0,0,0,-4,0]: N = 64 [1,0,0,-1,0]: N = 65 [1,0,1,-6,4]: N = 66 [1,1,1,-2,-1]: N = 66 [1,0,0,-45,81]: N = 66 [0,1,1,-12,-21]: N = 67 [1,0,1,-1,-1]: N = 69 [1,-1,1,2,-3]: N = 70 [0,0,0,6,-7]: N = 72 [1,-1,0,4,-3]: N = 73 [0,-1,1,-8,-7]: N = 75 [1,0,1,-1,23]: N = 75 [0,1,1,2,4]: N = 75 [0,-1,0,-21,-31]: N = 76 [0,0,1,2,0]: N = 77 [1,1,0,4,11]: N = 77 [0,1,1,-49,600]: N = 77 [1,1,0,-19,685]: N = 78 [1,1,1,-2,0]: N = 79 [0,0,0,-7,6]: N = 80 [0,-1,0,4,-4]: N = 80 [1,0,1,-2,0]: N = 82 [1,1,1,1,0]: N = 83 [0,-1,0,-1,-2]: N = 84 [0,1,0,7,0]: N = 84 [1,1,0,-8,-13]: N = 85 [0,0,0,-4,4]: N = 88 [1,1,1,-1,0]: N = 89 [1,1,0,4,5]: N = 89 [1,-1,0,6,0]: N = 90 [1,-1,1,-8,11]: N = 90 [1,-1,1,13,-61]: N = 90 [0,0,1,1,0]: N = 91 [0,1,1,-7,5]: N = 91 [0,1,0,2,1]: N = 92 [0,0,0,-1,1]: N = 92 [1,-1,1,0,-1]: N = 94 [0,1,0,-2,0]: N = 96 [0,-1,0,-2,0]: N = 96 [1,1,0,-25,-111]: N = 98 [1,-1,1,-2,0]: N = 99 [1,-1,0,-15,8]: N = 99 [1,-1,1,-59,186]: N = 99 [0,0,1,-3,-5]: N = 99 [0,-1,0,-33,62]: N = 100 [0,0,0,-16/9,0]: N = 288 eclib-20250122/tests/out_no_ntl/d2.out000066400000000000000000000013471474421343600174240ustar00rootroot00000000000000Verbose? Limit on height? Stop after first point found? Selmer only (0/1: if 1, just tests whether second descent possible)? Enter quartic coefficients (a,0,c,0,e) or just a c e cd-curve (nearer): [0,111,0,2738,0] cd-dash-curve (further): [0,-222,0,1369,0] I = 45177, J = 19146834 Minimal model for Jacobian: [0,0,0,-15059,-709142] Checking local solublity at primes [ 2 3 37 ]: Everywhere locally soluble. ------------------------------------------ RESULTS Quartic has rational point (x:y:z) = (883:37002:145) Point on (c,d) curve = [-113054905:-32672766:3048625] height = 13.5654 Point on (c',d') curve = [175298864692140:22290732796922058:2098872790442875] height = 27.1308 Enter quartic coefficients (a,0,c,0,e) or just a c e eclib-20250122/tests/out_no_ntl/hecketest.out000066400000000000000000000237751474421343600211070ustar00rootroot00000000000000Program hecketest. Using METHOD = 2 to find newforms MODULUS for linear algebra = 1073741789 See the hecke matrices (0/1)? Plus space (0/1)? Enter level: >>>Level 90 Dimension = 22 denominator = 1 Computing conjmat... done. Computing +1 eigenspace... done, dimension = 22 Computing -1 eigenspace... done, dimension = 0 Compute W-eigenspaces? Computing W(2)... done, sparsity = 0.0785124. Computed matrix = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0], [0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,1,0,-1,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,-1,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0], [0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0], [0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,-1,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0], [0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1], [0,0,0,0,0,0,1,-1,0,-1,1,0,0,0,0,0,0,0,0,1,0,-1], [0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,-1,1,0,0,0,0,0], [-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,0,0,0,0]] Using sparse matrix code... Dimension of 1-eigenspace=11 Using sparse matrix code... Dimension of -1-eigenspace=11 Computing W(3)... done, sparsity = 0.179752. Computed matrix = [[0,0,-1,1,-1,0,0,0,0,0,0,0,0,0,0,1,-1,1,0,0,0,0], [0,0,-1,1,-1,0,0,0,0,0,0,0,1,0,0,0,-1,1,0,0,0,0], [0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,0,1,0,0,0,0], [0,0,0,0,0,0,1,-1,0,0,0,-1,1,0,0,0,0,1,0,1,0,-1], [0,0,0,0,0,0,1,-1,0,0,0,0,0,0,0,0,0,1,0,0,0,0], [0,0,0,0,1,0,0,-1,0,0,0,0,1,-1,0,0,0,1,0,0,0,0], [0,0,0,0,0,0,0,-1,1,0,0,0,0,0,0,0,0,1,0,0,0,0], [0,0,0,0,0,0,0,-1,0,0,0,0,1,0,0,0,0,1,0,0,0,0], [0,0,0,0,0,0,0,-1,0,0,1,0,0,0,0,0,0,1,0,0,0,0], [0,0,0,0,0,0,0,-1,0,1,0,-1,1,0,0,0,0,1,0,0,0,0], [0,0,0,0,0,0,0,-1,0,1,0,0,0,0,0,0,0,1,0,0,0,0], [0,0,0,0,0,0,0,-1,0,1,0,0,1,-1,0,0,0,1,0,0,0,0], [0,0,0,0,0,0,0,-1,0,1,0,0,0,-1,1,0,0,1,0,0,0,0], [1,-1,0,0,0,0,0,-1,0,1,0,0,0,0,0,0,0,1,0,0,0,0], [0,-1,1,1,0,0,0,-1,0,1,0,0,0,0,0,0,0,1,0,0,0,0], [0,0,0,0,1,0,0,0,0,0,0,0,1,-1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,0,0,1,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,-1,1,0,0,0,0,0,0,0,1,0], [0,0,0,0,0,0,0,0,0,0,0,-1,1,0,0,0,0,0,0,1,0,0], [0,0,0,0,0,-1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0]] Using sparse matrix code... Dimension of 1-eigenspace=12 Using sparse matrix code... Dimension of -1-eigenspace=10 Computing W(5)... done, sparsity = 0.181818. Computed matrix = [[0,0,0,0,0,0,0,0,0,0,0,-1,1,0,0,0,0,0,0,1,0,0], [0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,1,0,0,0,1,0,0], [0,0,0,0,0,0,0,0,0,1,0,-1,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,-1,0,0,0,0,0,0,0,0,0,1,0,0], [0,0,0,0,0,0,0,0,0,-1,1,0,0,0,-1,1,0,0,0,1,0,0], [0,0,-1,1,-1,0,-1,1,0,0,0,0,0,0,0,1,-1,0,0,0,0,1], [0,0,0,0,0,0,-1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1], [0,0,0,0,0,1,-1,0,0,0,1,-1,0,0,-1,1,0,0,0,0,0,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,0,0,1], [0,0,0,-1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,1], [0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,0,0,1], [1,0,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [0,1,-1,-1,0,0,0,0,0,0,0,0,0,-1,0,1,0,0,0,0,0,1], [0,1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,1], [0,1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [0,1,-1,-1,0,0,0,0,1,-1,0,0,0,0,0,0,0,0,0,0,0,1], [0,0,0,0,0,0,0,0,0,0,1,-1,0,0,-1,1,0,0,0,0,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1,0,0,0,0,0,0], [0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,0,0,0], [0,0,-1,1,-1,0,0,0,0,0,0,0,0,0,0,1,-1,1,0,0,0,0], [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0]] Using sparse matrix code... Dimension of 1-eigenspace=10 Using sparse matrix code... Dimension of -1-eigenspace=12 How many T_p? Computing T_p for p = 7...Computed matrix = [[8,-4,-2,0,0,0,2,0,0,-2,2,0,0,4,-2,0,0,0,0,2,0,-2], [0,1,0,1,1,1,-1,2,0,2,-1,0,0,1,1,0,0,0,0,0,0,0], [0,0,-2,0,0,-1,1,0,0,-2,0,1,0,1,0,0,0,0,0,1,0,-1], [0,0,2,4,-1,0,2,0,0,2,-1,0,0,0,1,0,1,0,0,-1,0,1], [0,2,1,-1,2,1,-1,1,0,4,-2,1,0,-1,2,0,0,0,0,-2,0,2], [0,1,0,1,1,1,-1,2,0,2,-1,0,0,1,1,0,0,0,0,0,0,0], [0,0,2,3,1,0,2,0,0,0,0,1,0,-1,0,0,2,0,0,-1,0,1], [0,3,0,-2,3,1,-1,0,0,2,-2,3,0,-2,2,0,1,0,0,-2,0,2], [0,1,1,0,2,1,-1,-1,8,-2,0,0,0,-1,0,0,1,0,0,0,0,0], [0,1,1,0,3,2,-2,1,0,0,1,1,0,0,-1,0,2,0,0,0,0,0], [0,1,1,0,2,2,0,-1,0,-2,6,-1,0,-2,2,0,1,0,0,1,0,-1], [0,0,2,1,2,2,-2,2,0,2,1,-1,0,1,-1,0,1,0,0,0,0,0], [0,0,2,1,4,1,-1,0,0,0,1,-2,8,-4,-1,0,1,0,0,1,0,-1], [0,1,3,0,3,3,-3,1,0,2,1,0,0,-1,-1,0,2,0,0,-1,0,1], [0,1,2,1,2,3,-1,0,0,-2,6,-2,0,-3,2,0,1,0,0,1,0,-1], [0,0,1,3,0,3,-1,1,0,0,4,-3,0,-1,-4,8,-2,0,0,0,0,0], [0,-1,4,4,0,1,1,0,0,2,1,-1,0,0,-1,0,2,0,0,-1,0,1], [0,1,-2,0,-1,0,0,-4,0,4,-2,2,0,-1,2,0,-1,8,0,-1,0,1], [0,1,0,0,-2,1,-1,0,0,2,-1,1,0,-2,1,0,0,0,8,-1,0,1], [0,2,-2,-2,0,1,-3,2,0,0,0,-1,0,1,0,0,0,0,0,3,0,5], [0,0,0,0,0,-4,2,2,0,2,0,-2,0,2,0,0,-2,0,0,0,8,0], [0,0,-1,1,-1,-1,1,1,0,-2,1,-1,0,1,-1,0,1,0,0,3,0,5]] done, sparsity = 0.514463. Computing T_p for p = 11...Computed matrix = [[12,-6,0,-4,4,0,4,-2,0,-2,4,0,0,4,-4,0,2,0,0,2,0,-2], [0,1,4,-3,7,1,-1,0,0,4,-1,0,0,-1,1,0,4,0,0,0,0,0], [0,1,-1,-1,1,0,0,-1,0,2,0,-2,0,-1,0,0,1,0,0,0,0,0], [0,-2,5,4,2,-1,5,-1,0,0,1,2,0,0,-1,0,3,0,0,0,0,0], [0,3,1,0,3,0,0,3,0,2,-3,3,0,-2,3,0,0,0,0,0,0,0], [0,1,0,1,3,1,-5,4,0,4,-1,4,0,-1,1,0,0,0,0,-4,0,4], [0,0,2,7,0,-1,1,2,0,2,-3,2,0,-2,3,0,1,0,0,-3,0,3], [0,3,-1,0,3,3,-3,3,0,4,-3,0,0,-1,3,0,0,0,0,-3,0,3], [0,1,1,2,1,2,-2,-1,12,-2,-1,-1,0,0,1,0,0,0,0,0,0,0], [0,0,3,3,2,3,-3,1,0,2,0,1,0,3,0,0,0,0,0,0,0,0], [0,1,1,4,-1,5,-1,-1,0,-2,7,-4,0,-1,5,0,0,0,0,3,0,-3], [0,0,1,3,2,4,-4,1,0,4,0,0,0,2,0,0,0,0,0,-1,0,1], [0,1,0,2,3,2,-2,0,0,2,0,-4,12,-5,0,0,1,0,0,1,0,-1], [0,3,0,0,1,3,-3,2,0,4,0,-1,0,0,0,0,3,0,0,0,0,0], [0,4,-2,0,0,3,1,0,0,-2,8,-3,0,-3,4,0,0,0,0,1,0,-1], [0,3,-3,4,-3,4,0,1,0,0,5,-5,0,0,-5,12,-4,0,0,0,0,0], [0,1,2,6,-3,2,2,0,0,0,2,-2,0,3,-2,0,3,0,0,-1,0,1], [0,2,-4,1,-2,1,-1,-4,0,6,-3,0,0,-2,3,0,-1,12,0,-1,0,1], [0,2,-1,1,-4,1,-1,1,0,2,-2,1,0,-3,2,0,0,0,12,0,0,0], [0,1,-1,-3,3,0,-4,1,0,0,2,0,0,3,-2,0,-1,0,0,4,0,8], [0,0,0,-2,2,-6,2,2,0,2,2,0,0,2,-2,0,-2,0,0,-2,12,2], [0,1,-2,2,-3,-1,1,2,0,-2,0,-1,0,0,0,0,1,0,0,4,0,8]] done, sparsity = 0.528926. Computing T_p for p = 13...Computed matrix = [[14,-8,0,-2,2,2,2,-2,0,-2,6,0,0,6,-6,0,2,0,0,2,0,-2], [0,1,2,-1,5,3,-3,2,0,4,-1,2,0,-1,1,0,2,0,0,-2,0,2], [0,0,0,0,0,1,-1,0,0,2,0,-1,0,-1,0,0,0,0,0,-1,0,1], [0,-1,4,5,1,0,4,0,0,0,1,1,0,0,-1,0,4,0,0,-1,0,1], [0,2,1,1,2,3,-3,3,0,2,0,1,0,1,0,0,2,0,0,0,0,0], [0,3,2,-1,5,1,-3,2,0,4,-1,2,0,-1,1,0,2,0,0,-2,0,2], [0,-1,4,8,-1,0,2,0,0,2,0,0,0,1,0,0,3,0,0,-1,0,1], [0,1,2,2,3,3,-3,2,0,4,0,-1,0,2,0,0,1,0,0,0,0,0], [0,2,1,1,2,1,-1,-1,14,-2,-2,-1,0,-1,2,0,0,0,0,0,0,0], [0,3,1,0,3,2,-2,3,0,4,-3,1,0,0,3,0,0,0,0,-2,0,2], [0,3,0,2,1,3,1,0,0,-2,6,-3,0,-4,8,0,-1,0,0,2,0,-2], [0,4,0,-1,4,2,-2,2,0,4,-3,1,0,-1,3,0,1,0,0,-2,0,2], [0,2,0,1,6,-1,1,0,0,2,-3,-2,14,-8,3,0,-1,0,0,1,0,-1], [0,3,-1,0,3,1,-1,3,0,4,-3,2,0,-1,3,0,0,0,0,-1,0,1], [0,3,-1,1,1,2,2,-1,0,-2,8,-2,0,-3,6,0,-1,0,0,2,0,-2], [0,2,-3,5,-2,3,1,1,0,0,4,-3,0,-1,-4,14,-6,0,0,0,0,0], [0,0,2,7,0,-1,5,0,0,0,-1,2,0,0,1,0,1,0,0,-1,0,1], [0,-1,-2,4,-3,2,-2,-6,0,6,0,0,0,1,0,0,-1,14,0,1,0,-1], [0,1,-1,2,-5,2,-2,1,0,2,-1,1,0,-2,1,0,0,0,14,0,0,0], [0,4,-4,-6,2,1,-5,4,0,0,0,-1,0,1,0,0,0,0,0,3,0,11], [0,2,0,-4,4,-8,4,2,0,2,0,0,0,0,0,0,-2,0,0,-2,14,2], [0,1,-1,2,-3,-1,1,1,0,-2,1,-2,0,1,-1,0,2,0,0,5,0,9]] done, sparsity = 0.566116. Computing T_p for p = 17...Computed matrix = [[18,-10,-2,2,-2,2,2,0,0,-2,6,-2,0,10,-6,0,0,0,0,4,0,-4], [0,3,-1,3,1,3,-3,5,0,4,-2,1,0,2,2,0,-1,0,0,-1,0,1], [0,-2,2,2,-2,0,0,2,0,2,0,-2,0,2,0,0,-2,0,0,0,0,0], [0,0,3,10,-1,1,3,1,0,0,0,0,0,0,0,0,4,0,0,-1,0,1], [0,2,2,0,6,5,-5,2,0,2,2,1,0,1,-2,0,4,0,0,-1,0,1], [0,3,1,1,3,3,-1,3,0,4,-2,-1,0,2,2,0,1,0,0,1,0,-1], [0,-1,6,7,0,1,5,-2,0,2,2,0,0,1,-2,0,5,0,0,-1,0,1], [0,2,6,0,6,5,-5,2,0,4,2,1,0,-1,-2,0,4,0,0,-1,0,1], [0,3,2,-1,4,1,-1,-2,18,-2,-2,0,0,-3,2,0,1,0,0,-1,0,1], [0,5,1,-3,5,2,-2,3,0,8,-4,2,0,-3,4,0,1,0,0,-4,0,4], [0,4,1,-2,5,2,2,-1,0,-2,10,-1,0,-7,8,0,0,0,0,0,0,0], [0,5,-1,-3,5,0,0,3,0,4,-4,4,0,-1,4,0,1,0,0,-2,0,2], [0,3,1,-1,9,-2,2,-1,0,2,-4,0,18,-11,4,0,-1,0,0,0,0,0], [0,5,1,-3,7,2,-2,1,0,4,-4,6,0,-3,4,0,1,0,0,-4,0,4], [0,4,1,0,3,3,1,-3,0,-2,8,0,0,-6,10,0,0,0,0,1,0,-1], [0,2,-2,4,0,3,1,0,0,0,4,-1,0,-3,-4,18,-6,0,0,-1,0,1], [0,0,3,6,3,-2,6,-1,0,0,-2,5,0,-3,2,0,4,0,0,-2,0,2], [0,-2,0,4,-2,3,-3,-8,0,6,2,1,0,1,-2,0,0,18,0,1,0,-1], [0,1,0,1,-4,3,-3,0,0,2,0,2,0,-3,0,0,1,0,18,-1,0,1], [0,6,-6,-6,0,2,-6,6,0,0,-2,-2,0,0,2,0,0,0,0,6,0,12], [0,2,-2,-2,2,-10,6,4,0,2,-2,-2,0,2,2,0,-4,0,0,0,18,0], [0,0,-1,2,-3,-2,2,1,0,-2,2,-3,0,3,-2,0,2,0,0,6,0,12]] done, sparsity = 0.597107. Computing T_p for p = 19...Computed matrix = [[20,-10,-2,-2,2,0,4,-2,0,-4,8,0,0,10,-8,0,2,0,0,4,0,-4], [0,5,1,-1,5,1,-1,3,0,4,0,1,0,2,0,0,1,0,0,-1,0,1], [0,0,0,0,0,-2,2,0,0,-4,0,2,0,2,0,0,0,0,0,2,0,-2], [0,-1,5,9,1,-1,5,-1,0,4,0,1,0,0,0,0,3,0,0,-3,0,3], [0,3,3,1,5,4,-4,1,0,8,-2,0,0,1,2,0,1,0,0,-2,0,2], [0,1,1,-1,5,5,-1,3,0,4,0,1,0,2,0,0,1,0,0,-1,0,1], [0,-1,5,9,-1,2,6,-1,0,0,2,0,0,1,-2,0,5,0,0,0,0,0], [0,5,1,-1,3,4,-4,3,0,4,-2,4,0,-1,2,0,3,0,0,-2,0,2], [0,3,1,1,3,2,-2,-1,20,-4,-2,0,0,-3,2,0,1,0,0,0,0,0], [0,4,0,0,6,3,-3,4,0,4,-2,3,0,-3,2,0,2,0,0,-1,0,1], [0,5,-1,3,1,4,0,1,0,-4,10,-2,0,-7,10,0,-1,0,0,2,0,-2], [0,2,2,2,4,3,-3,6,0,4,-2,3,0,-1,2,0,0,0,0,-1,0,1], [0,2,2,2,8,1,-1,2,0,0,-2,-3,20,-11,2,0,0,0,0,1,0,-1], [0,4,4,0,6,5,-5,4,0,4,-2,1,0,-1,2,0,2,0,0,-3,0,3], [0,2,4,2,4,6,-2,0,0,-4,12,-4,0,-6,8,0,2,0,0,2,0,-2], [0,1,1,7,-1,6,-2,3,0,0,6,-6,0,-3,-6,20,-5,0,0,0,0,0], [0,0,6,8,0,1,3,2,0,4,-2,-1,0,-3,2,0,6,0,0,-3,0,3], [0,1,-3,3,-5,2,-2,-9,0,8,-2,2,0,1,2,0,-1,20,0,0,0,0], [0,2,0,2,-6,3,-3,0,0,4,-2,1,0,-3,2,0,0,0,20,-1,0,1], [0,4,-4,-8,4,0,-4,4,0,0,0,0,0,0,0,0,0,0,0,8,0,12], [0,0,0,-4,4,-10,6,4,0,4,0,-2,0,2,0,0,-4,0,0,-2,20,2], [0,0,-2,4,-4,-1,1,2,0,-4,2,-3,0,3,-2,0,2,0,0,7,0,13]] done, sparsity = 0.582645. Enter level: eclib-20250122/tests/out_no_ntl/homtest.out000066400000000000000000000035761474421343600206100ustar00rootroot00000000000000Enter first and last levels: >>>Level 900 Sign = 1: Dimension = 186 Cuspidal dimension = 145 Sign = -1: Dimension = 175 Cuspidal dimension = 145 Sign = 0: Dimension = 361 Cuspidal dimension = 290 >>>Level 901 Sign = 1: Dimension = 82 Cuspidal dimension = 79 Sign = -1: Dimension = 79 Cuspidal dimension = 79 Sign = 0: Dimension = 161 Cuspidal dimension = 158 >>>Level 902 Sign = 1: Dimension = 130 Cuspidal dimension = 123 Sign = -1: Dimension = 123 Cuspidal dimension = 123 Sign = 0: Dimension = 253 Cuspidal dimension = 246 >>>Level 903 Sign = 1: Dimension = 120 Cuspidal dimension = 113 Sign = -1: Dimension = 113 Cuspidal dimension = 113 Sign = 0: Dimension = 233 Cuspidal dimension = 226 >>>Level 904 Sign = 1: Dimension = 118 Cuspidal dimension = 111 Sign = -1: Dimension = 111 Cuspidal dimension = 111 Sign = 0: Dimension = 229 Cuspidal dimension = 222 >>>Level 905 Sign = 1: Dimension = 92 Cuspidal dimension = 89 Sign = -1: Dimension = 89 Cuspidal dimension = 89 Sign = 0: Dimension = 181 Cuspidal dimension = 178 >>>Level 906 Sign = 1: Dimension = 156 Cuspidal dimension = 149 Sign = -1: Dimension = 149 Cuspidal dimension = 149 Sign = 0: Dimension = 305 Cuspidal dimension = 298 >>>Level 907 Sign = 1: Dimension = 76 Cuspidal dimension = 75 Sign = -1: Dimension = 75 Cuspidal dimension = 75 Sign = 0: Dimension = 151 Cuspidal dimension = 150 >>>Level 908 Sign = 1: Dimension = 117 Cuspidal dimension = 112 Sign = -1: Dimension = 112 Cuspidal dimension = 112 Sign = 0: Dimension = 229 Cuspidal dimension = 224 >>>Level 909 Sign = 1: Dimension = 104 Cuspidal dimension = 99 Sign = -1: Dimension = 101 Cuspidal dimension = 99 Sign = 0: Dimension = 205 Cuspidal dimension = 198 >>>Level 910 Sign = 1: Dimension = 176 Cuspidal dimension = 161 Sign = -1: Dimension = 161 Cuspidal dimension = 161 Sign = 0: Dimension = 337 Cuspidal dimension = 322 eclib-20250122/tests/out_no_ntl/mattest1.out000066400000000000000000000032671474421343600206640ustar00rootroot00000000000000 Matrix package test program. Enter size of a square matrix A: Enter entries of A: A = [[1,2], [3,4]] Using A.output(cout): [[1,2], [3,4]] Using A.output_pari(cout): [1,2;3,4] Using A.output_pretty(cout): [1 2] [3 4] Enter a filename for matrix binary output: Matrix dumped to file 1 Matrix reread from file 1 B = [[1,2], [3,4]] agree Enter any number Creating an array of 3 matrices A= [[1,2], [3,4]] 2A= [[2,4], [6,8]] 3A= [[3,6], [9,12]] row(A,1) = [1,2] row(A,2) = [3,4] A = [[1,2], [3,4]] col(A,1) = [1,3] col(A,2) = [2,4] A = [[1,2], [3,4]] directsum(A,A) = [[1,2,0,0], [3,4,0,0], [0,0,1,2], [0,0,3,4]] Enter any number B = A = [[1,2], [3,4]] Enter any number B==A?1 B!=A?0 after B+:=A, A = [[1,2], [3,4]] and B = [[2,4], [6,8]] Enter any number after B-:=A, A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number after B*:=2, A = [[1,2], [3,4]] and B = [[2,4], [6,8]] Enter any number after B/:=2, A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number A+B= [[2,4], [6,8]] Now A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number A-B= [[0,0], [0,0]] Now A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number A*B= [[7,10], [15,22]] Now A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number -A= [[-1,-2], [-3,-4]] Now A = [[1,2], [3,4]] -A= [[-1,-2], [-3,-4]] Now A = [[1,2], [3,4]] Enter any number char. poly. of A has coefficients [ -2 -5 1 ] det(A) = -2 Augmented matrix = [[1,2,1,0], [3,4,0,1]] Which echelon method? (0=standard,1=longlong,2=modular) Using method 0 Echelon matrix = [[2,0,-4,2], [0,2,3,-1]] pivotal columns: [1,2] nonpivotal columns: [3,4] Denom = 2 Rank = 2 Nullity = 0 A has inverse (1/2)* [[-4,2], [3,-1]] Check: A.A^(-1) = I ? True! eclib-20250122/tests/out_no_ntl/mattest2.out000066400000000000000000000032671474421343600206650ustar00rootroot00000000000000 Matrix package test program. Enter size of a square matrix A: Enter entries of A: A = [[1,2], [3,4]] Using A.output(cout): [[1,2], [3,4]] Using A.output_pari(cout): [1,2;3,4] Using A.output_pretty(cout): [1 2] [3 4] Enter a filename for matrix binary output: Matrix dumped to file 1 Matrix reread from file 1 B = [[1,2], [3,4]] agree Enter any number Creating an array of 3 matrices A= [[1,2], [3,4]] 2A= [[2,4], [6,8]] 3A= [[3,6], [9,12]] row(A,1) = [1,2] row(A,2) = [3,4] A = [[1,2], [3,4]] col(A,1) = [1,3] col(A,2) = [2,4] A = [[1,2], [3,4]] directsum(A,A) = [[1,2,0,0], [3,4,0,0], [0,0,1,2], [0,0,3,4]] Enter any number B = A = [[1,2], [3,4]] Enter any number B==A?1 B!=A?0 after B+:=A, A = [[1,2], [3,4]] and B = [[2,4], [6,8]] Enter any number after B-:=A, A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number after B*:=2, A = [[1,2], [3,4]] and B = [[2,4], [6,8]] Enter any number after B/:=2, A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number A+B= [[2,4], [6,8]] Now A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number A-B= [[0,0], [0,0]] Now A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number A*B= [[7,10], [15,22]] Now A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number -A= [[-1,-2], [-3,-4]] Now A = [[1,2], [3,4]] -A= [[-1,-2], [-3,-4]] Now A = [[1,2], [3,4]] Enter any number char. poly. of A has coefficients [ -2 -5 1 ] det(A) = -2 Augmented matrix = [[1,2,1,0], [3,4,0,1]] Which echelon method? (0=standard,1=longlong,2=modular) Using method 0 Echelon matrix = [[2,0,-4,2], [0,2,3,-1]] pivotal columns: [1,2] nonpivotal columns: [3,4] Denom = 2 Rank = 2 Nullity = 0 A has inverse (1/2)* [[-4,2], [3,-1]] Check: A.A^(-1) = I ? True! eclib-20250122/tests/out_no_ntl/mattest3.out000066400000000000000000000032671474421343600206660ustar00rootroot00000000000000 Matrix package test program. Enter size of a square matrix A: Enter entries of A: A = [[1,2], [3,4]] Using A.output(cout): [[1,2], [3,4]] Using A.output_pari(cout): [1,2;3,4] Using A.output_pretty(cout): [1 2] [3 4] Enter a filename for matrix binary output: Matrix dumped to file 1 Matrix reread from file 1 B = [[1,2], [3,4]] agree Enter any number Creating an array of 3 matrices A= [[1,2], [3,4]] 2A= [[2,4], [6,8]] 3A= [[3,6], [9,12]] row(A,1) = [1,2] row(A,2) = [3,4] A = [[1,2], [3,4]] col(A,1) = [1,3] col(A,2) = [2,4] A = [[1,2], [3,4]] directsum(A,A) = [[1,2,0,0], [3,4,0,0], [0,0,1,2], [0,0,3,4]] Enter any number B = A = [[1,2], [3,4]] Enter any number B==A?1 B!=A?0 after B+:=A, A = [[1,2], [3,4]] and B = [[2,4], [6,8]] Enter any number after B-:=A, A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number after B*:=2, A = [[1,2], [3,4]] and B = [[2,4], [6,8]] Enter any number after B/:=2, A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number A+B= [[2,4], [6,8]] Now A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number A-B= [[0,0], [0,0]] Now A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number A*B= [[7,10], [15,22]] Now A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number -A= [[-1,-2], [-3,-4]] Now A = [[1,2], [3,4]] -A= [[-1,-2], [-3,-4]] Now A = [[1,2], [3,4]] Enter any number char. poly. of A has coefficients [ -2 -5 1 ] det(A) = -2 Augmented matrix = [[1,2,1,0], [3,4,0,1]] Which echelon method? (0=standard,1=longlong,2=modular) Using method 0 Echelon matrix = [[2,0,-4,2], [0,2,3,-1]] pivotal columns: [1,2] nonpivotal columns: [3,4] Denom = 2 Rank = 2 Nullity = 0 A has inverse (1/2)* [[-4,2], [3,-1]] Check: A.A^(-1) = I ? True! eclib-20250122/tests/out_no_ntl/mhcount.out000066400000000000000000000010161474421343600205650ustar00rootroot00000000000000See the matrices? How many primes? p = 3; nmats = 6; p = 5; nmats = 12; p = 7; nmats = 18; p = 11; nmats = 30; p = 13; nmats = 38; p = 17; nmats = 52; p = 19; nmats = 58; p = 23; nmats = 74; p = 29; nmats = 96; p = 31; nmats = 106; p = 37; nmats = 128; p = 41; nmats = 146; p = 43; nmats = 154; p = 47; nmats = 170; p = 53; nmats = 196; p = 59; nmats = 222; p = 61; nmats = 230; p = 67; nmats = 258; p = 71; nmats = 274; p = 73; nmats = 284; p = 79; nmats = 310; p = 83; nmats = 330; p = 89; nmats = 358; p = 97; nmats = 392; eclib-20250122/tests/out_no_ntl/mmattest.out000066400000000000000000000040041474421343600207460ustar00rootroot00000000000000 Multiprecision matrix package test program. Enter size of a square matrix A: Enter entries of A: A = [[1,2,3], [4,5,6], [7,8,9]] Creating an array of 3 matrices A= [[1,2,3], [4,5,6], [7,8,9]] 2A= [[2,4,6], [8,10,12], [14,16,18]] 3A= [[3,6,9], [12,15,18], [21,24,27]] row(A,1) = [1,2,3] row(A,2) = [4,5,6] row(A,3) = [7,8,9] A = [[1,2,3], [4,5,6], [7,8,9]] col(A,1) = [1,4,7] col(A,2) = [2,5,8] col(A,3) = [3,6,9] A = [[1,2,3], [4,5,6], [7,8,9]] directsum(A,A) = [[1,2,3,0,0,0], [4,5,6,0,0,0], [7,8,9,0,0,0], [0,0,0,1,2,3], [0,0,0,4,5,6], [0,0,0,7,8,9]] Enter any number After shortening to a matrix of ints, A = [[1,2,3], [4,5,6], [7,8,9]] B = A = [[1,2,3], [4,5,6], [7,8,9]] Enter any number B==A?1 B!=A?0 after B+:=A, A = [[1,2,3], [4,5,6], [7,8,9]] and B = [[2,4,6], [8,10,12], [14,16,18]] Enter any number after B-:=A, A = [[1,2,3], [4,5,6], [7,8,9]] and B = [[1,2,3], [4,5,6], [7,8,9]] Enter any number after B*:=2, A = [[1,2,3], [4,5,6], [7,8,9]] and B = [[2,4,6], [8,10,12], [14,16,18]] Enter any number after B/:=2, A = [[1,2,3], [4,5,6], [7,8,9]] and B = [[1,2,3], [4,5,6], [7,8,9]] Enter any number A+B= [[2,4,6], [8,10,12], [14,16,18]] Now A = [[1,2,3], [4,5,6], [7,8,9]] and B = [[1,2,3], [4,5,6], [7,8,9]] Enter any number A-B= [[0,0,0], [0,0,0], [0,0,0]] Now A = [[1,2,3], [4,5,6], [7,8,9]] and B = [[1,2,3], [4,5,6], [7,8,9]] Enter any number A*B= [[30,36,42], [66,81,96], [102,126,150]] Now A = [[1,2,3], [4,5,6], [7,8,9]] and B = [[1,2,3], [4,5,6], [7,8,9]] Enter any number -A= [[-1,-2,-3], [-4,-5,-6], [-7,-8,-9]] Now A = [[1,2,3], [4,5,6], [7,8,9]] -A= [[-1,-2,-3], [-4,-5,-6], [-7,-8,-9]] Now A = [[1,2,3], [4,5,6], [7,8,9]] Enter any number char. poly. of A has coefficients [ 0 -18 -15 1 ] det(A) = 0 Augmented matrix = [[1,2,3,1,0,0], [4,5,6,0,1,0], [7,8,9,0,0,1]] Which echelon method? (0=standard,1=longlong,2=modular) Echelon matrix = [[3,0,-3,0,-8,5], [0,3,6,0,7,-4], [0,0,0,3,-6,3]] pivotal columns: [1,2,4] nonpivotal columns: [3,5,6] Denom = 3 Rank = 2 Nullity = 1 A is not invertible; rk = 2 eclib-20250122/tests/out_no_ntl/modtest.out000066400000000000000000000010631474421343600205710ustar00rootroot00000000000000Display symbol details (0/1)? Enter first and last levels: >>>Level 900 (2160 symbols) symbols check OK! >>>Level 901 (972 symbols) symbols check OK! >>>Level 902 (1512 symbols) symbols check OK! >>>Level 903 (1408 symbols) symbols check OK! >>>Level 904 (1368 symbols) symbols check OK! >>>Level 905 (1092 symbols) symbols check OK! >>>Level 906 (1824 symbols) symbols check OK! >>>Level 907 (908 symbols) symbols check OK! >>>Level 908 (1368 symbols) symbols check OK! >>>Level 909 (1224 symbols) symbols check OK! >>>Level 910 (2016 symbols) symbols check OK! eclib-20250122/tests/out_no_ntl/mptest.out000066400000000000000000000124221474421343600204270ustar00rootroot00000000000000Computed 78519 primes, largest is 1000253 Extra primes in list: long prime factors of 420: [ 2 3 5 7 ] with posdivs (long version) [ 1 2 4 3 6 12 5 10 20 15 30 60 7 14 28 21 42 84 35 70 140 105 210 420 ] Elements of a are: 10 20 30 Elements of b are: 10 20 30 a = [ 10 20 30 ] end of output of a b = [ 10 20 30 ] end of output of b After b=a, b = [ 10 20 30 ] bigint versions of divisor functions: bigint prime factors of 420: [ 2 3 5 7 ] with posdivs (bigint version) [ 1 2 4 3 6 12 5 10 20 15 30 60 7 14 28 21 42 84 35 70 140 105 210 420 ] and alldivs (bigint version) [ 1 -1 2 -2 4 -4 3 -3 6 -6 12 -12 5 -5 10 -10 20 -20 15 -15 30 -30 60 -60 7 -7 14 -14 28 -28 21 -21 42 -42 84 -84 35 -35 70 -70 140 -140 105 -105 210 -210 420 -420 ] making a copy of iqlist reuse iqlist for sqdivs iqlist (should be sqdivs) [ 1 2 ] iplist (should be alldivs) [ 1 -1 2 -2 4 -4 3 -3 6 -6 12 -12 5 -5 10 -10 20 -20 15 -15 30 -30 60 -60 7 -7 14 -14 28 -28 21 -21 42 -42 84 -84 35 -35 70 -70 140 -140 105 -105 210 -210 420 -420 ] making an vector of iplist (alldivs) stream output: [ 1 -1 2 -2 4 -4 3 -3 6 -6 12 -12 5 -5 10 -10 20 -20 15 -15 30 -30 60 -60 7 -7 14 -14 28 -28 21 -21 42 -42 84 -84 35 -35 70 -70 140 -140 105 -105 210 -210 420 -420 ] irary(7) is -3 irary[3] is -2 testing find function 35 is there: 35 is item number 36 13 is not there Test of sqrt and isqrt Enter a positive bigint a (999 to stop): a = 123, sign(a) = 1 a = 123, sqrt(a) = 11 (rounded down) a is not a square Enter a positive bigint a (999 to stop): a = 121, sign(a) = 1 a = 121, sqrt(a) = 11 (rounded down) a is a square with exact square root 11 Enter a positive bigint a (999 to stop): Test of sqrt mod p Enter a prime p: 23 sqrt(1 mod p) = 1 ---OK sqrt(2 mod p) = 5 ---OK sqrt(3 mod p) = 7 ---OK sqrt(4 mod p) = 2 ---OK 5 is not a quadratic residue mod p! sqrt(6 mod p) = 11 ---OK 7 is not a quadratic residue mod p! sqrt(8 mod p) = 10 ---OK sqrt(9 mod p) = 3 ---OK 10 is not a quadratic residue mod p! 11 is not a quadratic residue mod p! sqrt(12 mod p) = 9 ---OK sqrt(13 mod p) = 6 ---OK 14 is not a quadratic residue mod p! 15 is not a quadratic residue mod p! sqrt(16 mod p) = 4 ---OK 17 is not a quadratic residue mod p! sqrt(18 mod p) = 8 ---OK 19 is not a quadratic residue mod p! 20 is not a quadratic residue mod p! 21 is not a quadratic residue mod p! 22 is not a quadratic residue mod p! 23 is not a quadratic residue mod p! sqrt(24 mod p) = 1 ---OK sqrt(25 mod p) = 5 ---OK sqrt(26 mod p) = 7 ---OK sqrt(27 mod p) = 2 ---OK 28 is not a quadratic residue mod p! sqrt(29 mod p) = 11 ---OK 30 is not a quadratic residue mod p! sqrt(31 mod p) = 10 ---OK sqrt(32 mod p) = 3 ---OK 33 is not a quadratic residue mod p! 34 is not a quadratic residue mod p! sqrt(35 mod p) = 9 ---OK sqrt(36 mod p) = 6 ---OK 37 is not a quadratic residue mod p! 38 is not a quadratic residue mod p! sqrt(39 mod p) = 4 ---OK 40 is not a quadratic residue mod p! sqrt(41 mod p) = 8 ---OK 42 is not a quadratic residue mod p! 43 is not a quadratic residue mod p! 44 is not a quadratic residue mod p! 45 is not a quadratic residue mod p! 46 is not a quadratic residue mod p! sqrt(47 mod p) = 1 ---OK sqrt(48 mod p) = 5 ---OK sqrt(49 mod p) = 7 ---OK sqrt(50 mod p) = 2 ---OK 51 is not a quadratic residue mod p! sqrt(52 mod p) = 11 ---OK 53 is not a quadratic residue mod p! sqrt(54 mod p) = 10 ---OK sqrt(55 mod p) = 3 ---OK 56 is not a quadratic residue mod p! 57 is not a quadratic residue mod p! sqrt(58 mod p) = 9 ---OK sqrt(59 mod p) = 6 ---OK 60 is not a quadratic residue mod p! 61 is not a quadratic residue mod p! sqrt(62 mod p) = 4 ---OK 63 is not a quadratic residue mod p! sqrt(64 mod p) = 8 ---OK 65 is not a quadratic residue mod p! 66 is not a quadratic residue mod p! 67 is not a quadratic residue mod p! 68 is not a quadratic residue mod p! 69 is not a quadratic residue mod p! sqrt(70 mod p) = 1 ---OK sqrt(71 mod p) = 5 ---OK sqrt(72 mod p) = 7 ---OK sqrt(73 mod p) = 2 ---OK 74 is not a quadratic residue mod p! sqrt(75 mod p) = 11 ---OK 76 is not a quadratic residue mod p! sqrt(77 mod p) = 10 ---OK sqrt(78 mod p) = 3 ---OK 79 is not a quadratic residue mod p! 80 is not a quadratic residue mod p! sqrt(81 mod p) = 9 ---OK sqrt(82 mod p) = 6 ---OK 83 is not a quadratic residue mod p! 84 is not a quadratic residue mod p! sqrt(85 mod p) = 4 ---OK 86 is not a quadratic residue mod p! sqrt(87 mod p) = 8 ---OK 88 is not a quadratic residue mod p! 89 is not a quadratic residue mod p! 90 is not a quadratic residue mod p! 91 is not a quadratic residue mod p! 92 is not a quadratic residue mod p! sqrt(93 mod p) = 1 ---OK sqrt(94 mod p) = 5 ---OK sqrt(95 mod p) = 7 ---OK sqrt(96 mod p) = 2 ---OK 97 is not a quadratic residue mod p! sqrt(98 mod p) = 11 ---OK 99 is not a quadratic residue mod p! First 100 OK Enter a prime p: 0 Enter a bigint m (0 to stop): m = 420 m has 4 prime divisors: [ 2 3 5 7 ] with exponents: 2:2 3:1 5:1 7:1 m has 48 divisors: [ 1 -1 2 -2 4 -4 3 -3 6 -6 12 -12 5 -5 10 -10 20 -20 15 -15 30 -30 60 -60 7 -7 14 -14 28 -28 21 -21 42 -42 84 -84 35 -35 70 -70 140 -140 105 -105 210 -210 420 -420 ] m has 24 positive divisors: [ 1 2 4 3 6 12 5 10 20 15 30 60 7 14 28 21 42 84 35 70 140 105 210 420 ] m has 2 positive divisors whose square divides m: [ 1 2 ] m has 16 positive square-free divisors: [ 1 2 3 6 5 10 15 30 7 14 21 42 35 70 105 210 ] Enter a bigint m (0 to stop): eclib-20250122/tests/out_no_ntl/mspace.out000066400000000000000000000025501474421343600203640ustar00rootroot00000000000000 M-Subspace package test program Enter size of square matrix M: Enter entries of M: M = [[1,2,3], [4,5,6], [7,8,9]] Trace(M) = 15 m^2 = [[30,36,42], [66,81,96], [102,126,150]] Trace(m^2) = 261 m^3 = [[468,576,684], [1062,1305,1548], [1656,2034,2412]] Trace(m^3) = 4185 char. poly. of m has coefficients [ 0 -18 -15 1 ] det(M) = 0 rank(M) = 2 nullity(M) = 1 kernel(m) has basis [[1], [-2], [1]] pivots: [3] denom: 1 image(m) has basis [[1,0], [0,1], [-1,2]] pivots: [1,2] denom: 1 Enter lambda: eigenspace for lambda = 1 has basis [[], [], []] with dimension 0 Now repeating eigenspace calculation modulo 6074000003 eigenspace for lambda has basis [[], [], []] with dimension 0 Enter size of square matrix M: Enter entries of M: M = [[1,2,3], [4,5,6], [7,8,9]] Trace(M) = 15 m^2 = [[30,36,42], [66,81,96], [102,126,150]] Trace(m^2) = 261 m^3 = [[468,576,684], [1062,1305,1548], [1656,2034,2412]] Trace(m^3) = 4185 char. poly. of m has coefficients [ 0 -18 -15 1 ] det(M) = 0 rank(M) = 2 nullity(M) = 1 kernel(m) has basis [[1], [-2], [1]] pivots: [3] denom: 1 image(m) has basis [[1,0], [0,1], [-1,2]] pivots: [1,2] denom: 1 Enter lambda: eigenspace for lambda = 0 has basis [[1], [-2], [1]] with dimension 1 Now repeating eigenspace calculation modulo 6074000003 eigenspace for lambda has basis [[1], [-2], [1]] with dimension 1 Enter size of square matrix M: eclib-20250122/tests/out_no_ntl/mvectest.out000066400000000000000000000030341474421343600207440ustar00rootroot00000000000000Test run of vector package. Enter n : Uninitialized new vector v = [] Copy of v = [] Initialized new vector v = [0,0,0,0,0,0,0,0,0,0] Copy of v = [0,0,0,0,0,0,0,0,0,0] Enter new entries of v: Now v = [1,2,3,4,5,4,3,2,1,0] w = [0,0,0] After w=v, Now v = [1,2,3,4,5,4,3,2,1,0] Now w = [1,2,3,4,5,4,3,2,1,0] w==v: 1 w!=v: 0 Enter i : After w*=2, w = [2,4,6,8,10,8,6,4,2,0] 3*v = [3,6,9,12,15,12,9,6,3,0] Now v = [1,2,3,4,5,4,3,2,1,0] v+w = [3,6,9,12,15,12,9,6,3,0] Now v = [1,2,3,4,5,4,3,2,1,0] v-w = [-1,-2,-3,-4,-5,-4,-3,-2,-1,0] Now v = [1,2,3,4,5,4,3,2,1,0] v*w = 170 Now v = [1,2,3,4,5,4,3,2,1,0] w/2 = [1,2,3,4,5,4,3,2,1,0] Now w = [2,4,6,8,10,8,6,4,2,0] -v = [-1,-2,-3,-4,-5,-4,-3,-2,-1,0] +v = [1,2,3,4,5,4,3,2,1,0] +w = [2,4,6,8,10,8,6,4,2,0] v = [1,2,3,4,5,4,3,2,1,0]; w = [2,4,6,8,10,8,6,4,2,0] Elements of v: v[1] = 1 v[2] = 2 v[3] = 3 v[4] = 4 v[5] = 5 v[6] = 4 v[7] = 3 v[8] = 2 v[9] = 1 v[10] = 0 Member test: Enter a test number: 4 IS a member of v. Subscript test Enter length of subscript vector:Enter subscript vector:The sub-vector is [4,3,2] Change one entry of v. Index?New entry?New entry: v[10] = 10 Now v = [1,2,3,4,5,4,3,2,1,10] Initial slice; length? Slice = [1,2,3,4,5] Now v = [1,2,3,4,5,4,3,2,1,10] General slice; beginning, end? Slice = [4,3,2,1,10] Now v = [1,2,3,4,5,4,3,2,1,10] w = [2,4,6,8,10,8,6,4,2,0]; content(w) = 2 After makeprimitive(w), w = [1,2,3,4,5,4,3,2,1,0] v shortened to a vector of ints: [1,2,3,4,5,4,3,2,1,10] u = [0,0,0,0,0,0,0,0,0,0] After swapvec(u,v): u = [1,2,3,4,5,4,3,2,1,10] v = [0,0,0,0,0,0,0,0,0,0] eclib-20250122/tests/out_no_ntl/nftest.out000066400000000000000000000013261474421343600204170ustar00rootroot00000000000000>>> Level 90 <<< After constructor, about to createfromdata() Retrieving newform data for N = 90 Finished reading newform data for N = 90 3 newform(s), 25 eigs on file. 3 newform(s) at level 90: p0=7 #ap= 25 1: aplist = [ -1 0 1 2 6 -4 -6 -4 0 -6 -4 8 0 8 0 -6 6 2 -4 -12 ...] aq = [ 1 1 -1 ] ap0 = 2, dp0 = 4, np0 = 6 SFE = 1, L/P = 2/3 lplus = 1, mplus = 1 [(-77,2;-3,7),-1,0;?] 2: aplist = [ 1 0 -1 2 -6 -4 6 -4 0 6 -4 8 0 8 0 6 -6 2 -4 12 ...] aq = [ -1 1 1 ] ap0 = 2, dp0 = 4, np0 = 6 SFE = 1, L/P = 2/3 lplus = 1, mplus = 1 [(-77,2;-3,7),-1,0;?] 3: aplist = [ 1 0 1 -4 0 2 -6 -4 0 6 8 2 6 -4 0 6 0 -10 -4 0 ...] aq = [ -1 -1 -1 ] ap0 = -4, dp0 = 24, np0 = 12 SFE = 1, L/P = 2 lplus = 1, mplus = 1 [(13,1;1,7),-2,0;?] eclib-20250122/tests/out_no_ntl/oftest.out000066400000000000000000000011001474421343600204060ustar00rootroot00000000000000Verbose details of oldform constructor? Enter first and last N: >>>Level 90 Old classes ~~~~~~~~~~~ Level Dimension [ 2 3 5 7 11 13 17 19 23 29 ] 15 1 [ -1 -1 -1 0 -4 -2 2 4 0 -2 ] 15 1 [ 1 -1 -1 0 -4 -2 2 4 0 -2 ] 15 1 [ -1 1 -1 0 -4 -2 2 4 0 -2 ] 15 1 [ 1 1 -1 0 -4 -2 2 4 0 -2 ] 30 1 [ 1 -1 1 -4 0 2 6 -4 0 -6 ] 30 1 [ 1 1 1 -4 0 2 6 -4 0 -6 ] 45 1 [ -1 -1 1 0 4 -2 -2 4 0 2 ] 45 1 [ 1 -1 1 0 4 -2 -2 4 0 2 ] Total number of oldclasses = 8 Total dimension of oldclasses = 8 eclib-20250122/tests/out_no_ntl/ptest.out000066400000000000000000000024611474421343600202540ustar00rootroot00000000000000Initialized table of 78519 primes, up to 1000253 Enter an index: prime_number(1000) = 7919 How many primes do you want to see (as a vector)? [ 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 ] Enter a number to see if it is that list: NOT in the list iota(10): [ 1 2 3 4 5 6 7 8 9 10 ] n = 527788800 exps = [ 8 2 2 2 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] Comparing previous prime list with [ 2 3 5 7 11 13 17 19 23 29 ] First starts with second, 10 items from 0: 1 First starts with second, 5 items from 5: 1 Second starts with first, 10 items from 0: 1 Second starts with first, 5 items from 5: 1 How many primes do you want to see (one by one)? Prime number 1 = 2 Prime number 2 = 3 Prime number 3 = 5 Prime number 4 = 7 Prime number 5 = 11 Prime number 6 = 13 Prime number 7 = 17 Prime number 8 = 19 Prime number 9 = 23 Prime number 10 = 29 Enter an integer m (0 to stop): Smallest prime factor of 123 is 3 m has 2 prime divisors: [ 3 41 ] with exponents: 3:1 41:1 m has 8 divisors: [ 1 -1 3 -3 41 -41 123 -123 ] m has 4 positive divisors: [ 1 3 41 123 ] m has 1 positive divisors whose square divides m: [ 1 ] m has 4 positive square-free divisors: [ 1 3 41 123 ] Enter an integer m (0 to stop): Enter integers a b (0 0 to stop): gcd = 3 lcm = 18696 Enter integers a b (0 0 to stop): eclib-20250122/tests/out_no_ntl/rattest.out000066400000000000000000000005351474421343600206030ustar00rootroot00000000000000Test run of rational number procs. gcd(4,6) = 2 q = 2/3 has denominator 3 and numerator 2 Enter a rational (either n or n/d): q = 41/152 has denominator 152 and numerator 41 floor(q) = 0 ceil(q) = 1 Enter three rationals separated by whitespace: q1 = 1/3 q2 = 1/2 q3 = 2/3 Enter three rationals in the format [q1:q2:q3]: [q1:q2:q3] = [1/6:1/3:1/2] eclib-20250122/tests/out_no_ntl/smattest1.out000066400000000000000000004350631474421343600210520ustar00rootroot00000000000000enter 0 to exit enter 1 to do all tests enter 2 to operations enter 3 to special speed test enter> enter 4 to elimination test enter> enter 5 to kernel test enter> enter 6 to multiply smat by smat enter> enter 7 to find eigenspaces enter> Test run of sparse matrix package. enter # of rows: enter # of colums: Unitialized new smat sm = row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } row[6] ={ values [] positions: [] } row[7] ={ values [] positions: [] } row[8] ={ values [] positions: [] } row[9] ={ values [] positions: [] } row[10] ={ values [] positions: [] } row[11] ={ values [] positions: [] } row[12] ={ values [] positions: [] } row[13] ={ values [] positions: [] } row[14] ={ values [] positions: [] } row[15] ={ values [] positions: [] } row[16] ={ values [] positions: [] } row[17] ={ values [] positions: [] } row[18] ={ values [] positions: [] } row[19] ={ values [] positions: [] } row[20] ={ values [] positions: [] } row[21] ={ values [] positions: [] } row[22] ={ values [] positions: [] } row[23] ={ values [] positions: [] } row[24] ={ values [] positions: [] } row[25] ={ values [] positions: [] } row[26] ={ values [] positions: [] } row[27] ={ values [] positions: [] } row[28] ={ values [] positions: [] } row[29] ={ values [] positions: [] } row[30] ={ values [] positions: [] } row[31] ={ values [] positions: [] } row[32] ={ values [] positions: [] } row[33] ={ values [] positions: [] } row[34] ={ values [] positions: [] } row[35] ={ values [] positions: [] } row[36] ={ values [] positions: [] } row[37] ={ values [] positions: [] } row[38] ={ values [] positions: [] } row[39] ={ values [] positions: [] } row[40] ={ values [] positions: [] } row[41] ={ values [] positions: [] } row[42] ={ values [] positions: [] } row[43] ={ values [] positions: [] } row[44] ={ values [] positions: [] } row[45] ={ values [] positions: [] } row[46] ={ values [] positions: [] } row[47] ={ values [] positions: [] } row[48] ={ values [] positions: [] } row[49] ={ values [] positions: [] } row[50] ={ values [] positions: [] } row[51] ={ values [] positions: [] } row[52] ={ values [] positions: [] } row[53] ={ values [] positions: [] } row[54] ={ values [] positions: [] } row[55] ={ values [] positions: [] } row[56] ={ values [] positions: [] } row[57] ={ values [] positions: [] } row[58] ={ values [] positions: [] } row[59] ={ values [] positions: [] } row[60] ={ values [] positions: [] } row[61] ={ values [] positions: [] } row[62] ={ values [] positions: [] } row[63] ={ values [] positions: [] } row[64] ={ values [] positions: [] } row[65] ={ values [] positions: [] } row[66] ={ values [] positions: [] } row[67] ={ values [] positions: [] } row[68] ={ values [] positions: [] } row[69] ={ values [] positions: [] } row[70] ={ values [] positions: [] } row[71] ={ values [] positions: [] } row[72] ={ values [] positions: [] } row[73] ={ values [] positions: [] } row[74] ={ values [] positions: [] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [] positions: [] } row[78] ={ values [] positions: [] } row[79] ={ values [] positions: [] } row[80] ={ values [] positions: [] } row[81] ={ values [] positions: [] } row[82] ={ values [] positions: [] } row[83] ={ values [] positions: [] } row[84] ={ values [] positions: [] } row[85] ={ values [] positions: [] } row[86] ={ values [] positions: [] } row[87] ={ values [] positions: [] } row[88] ={ values [] positions: [] } row[89] ={ values [] positions: [] } row[90] ={ values [] positions: [] } row[91] ={ values [] positions: [] } row[92] ={ values [] positions: [] } row[93] ={ values [] positions: [] } row[94] ={ values [] positions: [] } row[95] ={ values [] positions: [] } row[96] ={ values [] positions: [] } row[97] ={ values [] positions: [] } row[98] ={ values [] positions: [] } row[99] ={ values [] positions: [] } row[100] ={ values [] positions: [] } Enter any number Enter size of a square matrix A: Enter entries of A: A = [[1,2], [3,4]] smat from matrix A = row[1] ={ values [1,2] positions: [1,2] } row[2] ={ values [3,4] positions: [1,2] } Enter any number Copy of smat = row[1] ={ values [1,2] positions: [1,2] } row[2] ={ values [3,4] positions: [1,2] } Enter any number Copy using assignment= row[1] ={ values [1,2] positions: [1,2] } row[2] ={ values [3,4] positions: [1,2] } Enter any number enter number of rows of smat for conversion Now enter number of columns smat = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } smat as a matrix = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,1,0,0,0,0,0,0,-9,0,6,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,9,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,9,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,6,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-3,0,0,0,0,0,1,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2], [0,5,0,-10,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,-8,0,0,0,0,0,0,0,0,0,-5,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,1,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0], [0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0], [0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,6,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-3,0], [0,0,0,0,0,0,9,0,7,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,4,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,8,-7,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0], [0,0,0,0,0,0,0,0,0,0,9,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,-10,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,-1,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,8,0,-4,0,0,0,0,0,0,0,0,0,-9,0,-6,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,-8,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,4,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,-6,0,0,0,0,0,0,0,1,0,0,0,0,0,0,-5,0,0,5,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,-2,0,-4,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,-9,0,-7,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,9,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,-7,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,5,0,9,0,0,0,3,0,9,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,4,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0], [0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,6,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0], [0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,-7,0,0,0,0,0,0,-8,0,0,0,3,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,5,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,6,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,5,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,6,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,9,0,0,0,0,0,0,0,0,0,0,3,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,-10,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,9,0,0,0,0,0,9,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,7,0,0,0,-5,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,2,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,-5,0,-6,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,9,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,-9,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,-8,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0], [0,0,0,0,0,0,0,0,-2,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,-2,8,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,-3,0,-7,0], [0,0,0,0,0,0,0,0,9,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,9,0,0,-5,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0], [0,0,-1,0,0,0,0,0,0,-9,1,0,0,0,0,0,0,0,0,-2,0,-2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,9,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,0,0,0,0,-6,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,-5,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,-5,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,7,-9,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,-7,0,0,0,0,4,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] Enter any number Enter position: (row,col)T(50 , 50) = 0 testing set_row enter new row : which row ? (starting from zero) number of non-zero elements ? values ? positions ? new matrix : row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [1,2,3] positions: [10,20,30] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } testing operations Enter size of smat A row,col: Enter size of smat B: row,col: matrix A row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } matrix B row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number C = A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number B==A?1 B!=A?0 C==A?1 C!=A?0 Enter any number after B+=A, A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-20,-8] positions: [40,94] } row[2] ={ values [12,18] positions: [38,56] } row[3] ={ values [10,12,-2,-14,-20,2,-18,12] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [18,2,-2,6,-14] positions: [9,14,37,46,86] } row[5] ={ values [-10,14,-4,4,-8,18] positions: [24,25,40,66,70,83] } row[6] ={ values [-14,12,18,-18] positions: [39,58,65,98] } row[7] ={ values [6,14,12,-12,-4] positions: [22,26,48,84,85] } row[8] ={ values [18,18,4,-20,12] positions: [54,60,61,91,92] } row[9] ={ values [12,-16,10,4,18] positions: [21,35,52,73,96] } row[10] ={ values [2,16,-2,-6,2,12,2,4] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [10,-20,-6,2,6,-8,-16,-10] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [10,16] positions: [56,91] } row[13] ={ values [16,2,18,8,-6,10] positions: [7,17,19,41,82,88] } row[14] ={ values [-8,6] positions: [69,97] } row[15] ={ values [-18,-14] positions: [2,66] } row[16] ={ values [18,14,12,-16] positions: [44,60,75,94] } row[17] ={ values [-6,18,12,-8,-8,-10,-12] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-2,-6] positions: [48,67] } row[19] ={ values [10,-2,-6] positions: [30,97,99] } row[20] ={ values [18,14,-10,10,18,8,-12,4] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [18] positions: [73] } row[22] ={ values [16,-6] positions: [12,72] } row[23] ={ values [2,-12,8] positions: [33,61,97] } row[24] ={ values [-2,16,-14,-12,-4,-20,6] positions: [37,42,43,54,82,84,97] } row[25] ={ values [18,-6,16,-16,-10,18,-12,-20,14] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-2,-18,-8,-6,-10,2] positions: [9,11,25,28,79,94] } row[27] ={ values [-18,6,-2,16,-16] positions: [10,39,47,75,95] } row[28] ={ values [-10] positions: [74] } row[29] ={ values [-16,-2,10,-4] positions: [7,20,74,77] } row[30] ={ values [4,10] positions: [40,61] } row[31] ={ values [8] positions: [65] } row[32] ={ values [12] positions: [32] } row[33] ={ values [-12,16] positions: [11,92] } row[34] ={ values [10,2,2,18,16,-8,-18,-12] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [18,-18,14,6,16] positions: [23,51,64,80,84] } row[36] ={ values [-4,6,4] positions: [14,25,70] } row[37] ={ values [-12,6,-2,-20,-8] positions: [21,29,76,83,97] } row[38] ={ values [-16,-6,-12] positions: [25,42,69] } row[39] ={ values [10,16,-14,-20] positions: [48,74,83,91] } row[40] ={ values [-16,-8,-6,18,-18] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-8,-6] positions: [1,37] } row[43] ={ values [-14,-14,2,18,8] positions: [20,51,78,91,94] } row[44] ={ values [12] positions: [69] } row[45] ={ values [-8,-4,-12,2,-10,10,-12,2] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-16,16] positions: [25,44] } row[47] ={ values [-4,-8,-10,12,6,4,-18,-14,8] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-4,18,18,8] positions: [33,38,40,71] } row[49] ={ values [18] positions: [35] } row[50] ={ values [-14,-12,-16,10,18,6,18,-4,-4] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [8,14,-12,-18,8,-4,8] positions: [15,17,45,61,72,75,96] } row[53] ={ values [4,10] positions: [38,58] } row[54] ={ values [14,-4] positions: [26,94] } row[55] ={ values [-16,18,4,-4] positions: [2,36,60,98] } row[56] ={ values [-8] positions: [19] } row[57] ={ values [14,14,8,-16,18,-2,12,18] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-6,18,12,-14,-16,6,4,10,-12] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-16] positions: [95] } row[60] ={ values [2,-20,12,16,10,12,-20,-10] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [6,10] positions: [10,17] } row[62] ={ values [10,-8,-16,12,-18,-16,6,-16] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [18,6,-16,-8,-20,-20,-20] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-6,-2,18,18] positions: [51,86,88,94] } row[65] ={ values [4,8] positions: [79,92] } row[66] ={ values [14,-10,-8,16] positions: [9,13,19,37] } row[67] ={ values [-6,8,-2,-20,-2] positions: [27,55,66,80,97] } row[68] ={ values [-4,-12] positions: [33,70] } row[69] ={ values [-20] positions: [81] } row[70] ={ values [-2,-10,-4,2] positions: [34,45,53,89] } row[71] ={ values [12,4,-2,12] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-14,-14] positions: [42,72] } row[74] ={ values [-14,-2,-4,14,-20,-10,-12,-6] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [2] positions: [18] } row[78] ={ values [-14,-20,-8,4,18,18] positions: [22,43,51,72,75,83] } row[79] ={ values [-10] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-4,10,4,-18] positions: [51,70,86,87] } row[82] ={ values [4,-16,2] positions: [32,36,41] } row[83] ={ values [16,-16,18,-14,-2,-14,-12] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-4,-18,16,14,-10,14,-4,16] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [4,-14,-8,2,-12,16,-6,-14] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [18,-2,-10,-6] positions: [9,13,54,80] } row[87] ={ values [2,-14,-14] positions: [14,48,83] } row[88] ={ values [-12,2,18,18,-10,-10,-2,18] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-2,-18,2,-4,-4,4,8] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-14,4,12,4] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [8,18,-4] positions: [80,85,87] } row[94] ={ values [-12] positions: [94] } row[95] ={ values [10,-14,-12,-4,10,-16] positions: [20,22,41,51,72,84] } row[96] ={ values [2,-12,-14,-20,-10,10,6,-10,-16] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-20,-20,14,-18,-6,-20,6] positions: [17,20,34,35,41,66,85] } row[98] ={ values [18,-4,-4] positions: [36,59,74] } row[99] ={ values [-4] positions: [43] } row[100] ={ values [-4,10,-12,-14,8,-12,18] positions: [13,35,47,53,58,68,82] } Enter any number after B-=A, A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number after B*=2, B = row[1] ={ values [-20,-8] positions: [40,94] } row[2] ={ values [12,18] positions: [38,56] } row[3] ={ values [10,12,-2,-14,-20,2,-18,12] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [18,2,-2,6,-14] positions: [9,14,37,46,86] } row[5] ={ values [-10,14,-4,4,-8,18] positions: [24,25,40,66,70,83] } row[6] ={ values [-14,12,18,-18] positions: [39,58,65,98] } row[7] ={ values [6,14,12,-12,-4] positions: [22,26,48,84,85] } row[8] ={ values [18,18,4,-20,12] positions: [54,60,61,91,92] } row[9] ={ values [12,-16,10,4,18] positions: [21,35,52,73,96] } row[10] ={ values [2,16,-2,-6,2,12,2,4] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [10,-20,-6,2,6,-8,-16,-10] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [10,16] positions: [56,91] } row[13] ={ values [16,2,18,8,-6,10] positions: [7,17,19,41,82,88] } row[14] ={ values [-8,6] positions: [69,97] } row[15] ={ values [-18,-14] positions: [2,66] } row[16] ={ values [18,14,12,-16] positions: [44,60,75,94] } row[17] ={ values [-6,18,12,-8,-8,-10,-12] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-2,-6] positions: [48,67] } row[19] ={ values [10,-2,-6] positions: [30,97,99] } row[20] ={ values [18,14,-10,10,18,8,-12,4] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [18] positions: [73] } row[22] ={ values [16,-6] positions: [12,72] } row[23] ={ values [2,-12,8] positions: [33,61,97] } row[24] ={ values [-2,16,-14,-12,-4,-20,6] positions: [37,42,43,54,82,84,97] } row[25] ={ values [18,-6,16,-16,-10,18,-12,-20,14] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-2,-18,-8,-6,-10,2] positions: [9,11,25,28,79,94] } row[27] ={ values [-18,6,-2,16,-16] positions: [10,39,47,75,95] } row[28] ={ values [-10] positions: [74] } row[29] ={ values [-16,-2,10,-4] positions: [7,20,74,77] } row[30] ={ values [4,10] positions: [40,61] } row[31] ={ values [8] positions: [65] } row[32] ={ values [12] positions: [32] } row[33] ={ values [-12,16] positions: [11,92] } row[34] ={ values [10,2,2,18,16,-8,-18,-12] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [18,-18,14,6,16] positions: [23,51,64,80,84] } row[36] ={ values [-4,6,4] positions: [14,25,70] } row[37] ={ values [-12,6,-2,-20,-8] positions: [21,29,76,83,97] } row[38] ={ values [-16,-6,-12] positions: [25,42,69] } row[39] ={ values [10,16,-14,-20] positions: [48,74,83,91] } row[40] ={ values [-16,-8,-6,18,-18] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-8,-6] positions: [1,37] } row[43] ={ values [-14,-14,2,18,8] positions: [20,51,78,91,94] } row[44] ={ values [12] positions: [69] } row[45] ={ values [-8,-4,-12,2,-10,10,-12,2] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-16,16] positions: [25,44] } row[47] ={ values [-4,-8,-10,12,6,4,-18,-14,8] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-4,18,18,8] positions: [33,38,40,71] } row[49] ={ values [18] positions: [35] } row[50] ={ values [-14,-12,-16,10,18,6,18,-4,-4] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [8,14,-12,-18,8,-4,8] positions: [15,17,45,61,72,75,96] } row[53] ={ values [4,10] positions: [38,58] } row[54] ={ values [14,-4] positions: [26,94] } row[55] ={ values [-16,18,4,-4] positions: [2,36,60,98] } row[56] ={ values [-8] positions: [19] } row[57] ={ values [14,14,8,-16,18,-2,12,18] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-6,18,12,-14,-16,6,4,10,-12] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-16] positions: [95] } row[60] ={ values [2,-20,12,16,10,12,-20,-10] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [6,10] positions: [10,17] } row[62] ={ values [10,-8,-16,12,-18,-16,6,-16] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [18,6,-16,-8,-20,-20,-20] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-6,-2,18,18] positions: [51,86,88,94] } row[65] ={ values [4,8] positions: [79,92] } row[66] ={ values [14,-10,-8,16] positions: [9,13,19,37] } row[67] ={ values [-6,8,-2,-20,-2] positions: [27,55,66,80,97] } row[68] ={ values [-4,-12] positions: [33,70] } row[69] ={ values [-20] positions: [81] } row[70] ={ values [-2,-10,-4,2] positions: [34,45,53,89] } row[71] ={ values [12,4,-2,12] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-14,-14] positions: [42,72] } row[74] ={ values [-14,-2,-4,14,-20,-10,-12,-6] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [2] positions: [18] } row[78] ={ values [-14,-20,-8,4,18,18] positions: [22,43,51,72,75,83] } row[79] ={ values [-10] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-4,10,4,-18] positions: [51,70,86,87] } row[82] ={ values [4,-16,2] positions: [32,36,41] } row[83] ={ values [16,-16,18,-14,-2,-14,-12] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-4,-18,16,14,-10,14,-4,16] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [4,-14,-8,2,-12,16,-6,-14] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [18,-2,-10,-6] positions: [9,13,54,80] } row[87] ={ values [2,-14,-14] positions: [14,48,83] } row[88] ={ values [-12,2,18,18,-10,-10,-2,18] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-2,-18,2,-4,-4,4,8] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-14,4,12,4] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [8,18,-4] positions: [80,85,87] } row[94] ={ values [-12] positions: [94] } row[95] ={ values [10,-14,-12,-4,10,-16] positions: [20,22,41,51,72,84] } row[96] ={ values [2,-12,-14,-20,-10,10,6,-10,-16] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-20,-20,14,-18,-6,-20,6] positions: [17,20,34,35,41,66,85] } row[98] ={ values [18,-4,-4] positions: [36,59,74] } row[99] ={ values [-4] positions: [43] } row[100] ={ values [-4,10,-12,-14,8,-12,18] positions: [13,35,47,53,58,68,82] } Enter any number after B/=2, B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number A+B=row[1] ={ values [-20,-8] positions: [40,94] } row[2] ={ values [12,18] positions: [38,56] } row[3] ={ values [10,12,-2,-14,-20,2,-18,12] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [18,2,-2,6,-14] positions: [9,14,37,46,86] } row[5] ={ values [-10,14,-4,4,-8,18] positions: [24,25,40,66,70,83] } row[6] ={ values [-14,12,18,-18] positions: [39,58,65,98] } row[7] ={ values [6,14,12,-12,-4] positions: [22,26,48,84,85] } row[8] ={ values [18,18,4,-20,12] positions: [54,60,61,91,92] } row[9] ={ values [12,-16,10,4,18] positions: [21,35,52,73,96] } row[10] ={ values [2,16,-2,-6,2,12,2,4] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [10,-20,-6,2,6,-8,-16,-10] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [10,16] positions: [56,91] } row[13] ={ values [16,2,18,8,-6,10] positions: [7,17,19,41,82,88] } row[14] ={ values [-8,6] positions: [69,97] } row[15] ={ values [-18,-14] positions: [2,66] } row[16] ={ values [18,14,12,-16] positions: [44,60,75,94] } row[17] ={ values [-6,18,12,-8,-8,-10,-12] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-2,-6] positions: [48,67] } row[19] ={ values [10,-2,-6] positions: [30,97,99] } row[20] ={ values [18,14,-10,10,18,8,-12,4] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [18] positions: [73] } row[22] ={ values [16,-6] positions: [12,72] } row[23] ={ values [2,-12,8] positions: [33,61,97] } row[24] ={ values [-2,16,-14,-12,-4,-20,6] positions: [37,42,43,54,82,84,97] } row[25] ={ values [18,-6,16,-16,-10,18,-12,-20,14] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-2,-18,-8,-6,-10,2] positions: [9,11,25,28,79,94] } row[27] ={ values [-18,6,-2,16,-16] positions: [10,39,47,75,95] } row[28] ={ values [-10] positions: [74] } row[29] ={ values [-16,-2,10,-4] positions: [7,20,74,77] } row[30] ={ values [4,10] positions: [40,61] } row[31] ={ values [8] positions: [65] } row[32] ={ values [12] positions: [32] } row[33] ={ values [-12,16] positions: [11,92] } row[34] ={ values [10,2,2,18,16,-8,-18,-12] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [18,-18,14,6,16] positions: [23,51,64,80,84] } row[36] ={ values [-4,6,4] positions: [14,25,70] } row[37] ={ values [-12,6,-2,-20,-8] positions: [21,29,76,83,97] } row[38] ={ values [-16,-6,-12] positions: [25,42,69] } row[39] ={ values [10,16,-14,-20] positions: [48,74,83,91] } row[40] ={ values [-16,-8,-6,18,-18] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-8,-6] positions: [1,37] } row[43] ={ values [-14,-14,2,18,8] positions: [20,51,78,91,94] } row[44] ={ values [12] positions: [69] } row[45] ={ values [-8,-4,-12,2,-10,10,-12,2] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-16,16] positions: [25,44] } row[47] ={ values [-4,-8,-10,12,6,4,-18,-14,8] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-4,18,18,8] positions: [33,38,40,71] } row[49] ={ values [18] positions: [35] } row[50] ={ values [-14,-12,-16,10,18,6,18,-4,-4] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [8,14,-12,-18,8,-4,8] positions: [15,17,45,61,72,75,96] } row[53] ={ values [4,10] positions: [38,58] } row[54] ={ values [14,-4] positions: [26,94] } row[55] ={ values [-16,18,4,-4] positions: [2,36,60,98] } row[56] ={ values [-8] positions: [19] } row[57] ={ values [14,14,8,-16,18,-2,12,18] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-6,18,12,-14,-16,6,4,10,-12] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-16] positions: [95] } row[60] ={ values [2,-20,12,16,10,12,-20,-10] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [6,10] positions: [10,17] } row[62] ={ values [10,-8,-16,12,-18,-16,6,-16] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [18,6,-16,-8,-20,-20,-20] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-6,-2,18,18] positions: [51,86,88,94] } row[65] ={ values [4,8] positions: [79,92] } row[66] ={ values [14,-10,-8,16] positions: [9,13,19,37] } row[67] ={ values [-6,8,-2,-20,-2] positions: [27,55,66,80,97] } row[68] ={ values [-4,-12] positions: [33,70] } row[69] ={ values [-20] positions: [81] } row[70] ={ values [-2,-10,-4,2] positions: [34,45,53,89] } row[71] ={ values [12,4,-2,12] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-14,-14] positions: [42,72] } row[74] ={ values [-14,-2,-4,14,-20,-10,-12,-6] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [2] positions: [18] } row[78] ={ values [-14,-20,-8,4,18,18] positions: [22,43,51,72,75,83] } row[79] ={ values [-10] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-4,10,4,-18] positions: [51,70,86,87] } row[82] ={ values [4,-16,2] positions: [32,36,41] } row[83] ={ values [16,-16,18,-14,-2,-14,-12] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-4,-18,16,14,-10,14,-4,16] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [4,-14,-8,2,-12,16,-6,-14] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [18,-2,-10,-6] positions: [9,13,54,80] } row[87] ={ values [2,-14,-14] positions: [14,48,83] } row[88] ={ values [-12,2,18,18,-10,-10,-2,18] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-2,-18,2,-4,-4,4,8] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-14,4,12,4] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [8,18,-4] positions: [80,85,87] } row[94] ={ values [-12] positions: [94] } row[95] ={ values [10,-14,-12,-4,10,-16] positions: [20,22,41,51,72,84] } row[96] ={ values [2,-12,-14,-20,-10,10,6,-10,-16] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-20,-20,14,-18,-6,-20,6] positions: [17,20,34,35,41,66,85] } row[98] ={ values [18,-4,-4] positions: [36,59,74] } row[99] ={ values [-4] positions: [43] } row[100] ={ values [-4,10,-12,-14,8,-12,18] positions: [13,35,47,53,58,68,82] } Now A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number A-B=row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } row[6] ={ values [] positions: [] } row[7] ={ values [] positions: [] } row[8] ={ values [] positions: [] } row[9] ={ values [] positions: [] } row[10] ={ values [] positions: [] } row[11] ={ values [] positions: [] } row[12] ={ values [] positions: [] } row[13] ={ values [] positions: [] } row[14] ={ values [] positions: [] } row[15] ={ values [] positions: [] } row[16] ={ values [] positions: [] } row[17] ={ values [] positions: [] } row[18] ={ values [] positions: [] } row[19] ={ values [] positions: [] } row[20] ={ values [] positions: [] } row[21] ={ values [] positions: [] } row[22] ={ values [] positions: [] } row[23] ={ values [] positions: [] } row[24] ={ values [] positions: [] } row[25] ={ values [] positions: [] } row[26] ={ values [] positions: [] } row[27] ={ values [] positions: [] } row[28] ={ values [] positions: [] } row[29] ={ values [] positions: [] } row[30] ={ values [] positions: [] } row[31] ={ values [] positions: [] } row[32] ={ values [] positions: [] } row[33] ={ values [] positions: [] } row[34] ={ values [] positions: [] } row[35] ={ values [] positions: [] } row[36] ={ values [] positions: [] } row[37] ={ values [] positions: [] } row[38] ={ values [] positions: [] } row[39] ={ values [] positions: [] } row[40] ={ values [] positions: [] } row[41] ={ values [] positions: [] } row[42] ={ values [] positions: [] } row[43] ={ values [] positions: [] } row[44] ={ values [] positions: [] } row[45] ={ values [] positions: [] } row[46] ={ values [] positions: [] } row[47] ={ values [] positions: [] } row[48] ={ values [] positions: [] } row[49] ={ values [] positions: [] } row[50] ={ values [] positions: [] } row[51] ={ values [] positions: [] } row[52] ={ values [] positions: [] } row[53] ={ values [] positions: [] } row[54] ={ values [] positions: [] } row[55] ={ values [] positions: [] } row[56] ={ values [] positions: [] } row[57] ={ values [] positions: [] } row[58] ={ values [] positions: [] } row[59] ={ values [] positions: [] } row[60] ={ values [] positions: [] } row[61] ={ values [] positions: [] } row[62] ={ values [] positions: [] } row[63] ={ values [] positions: [] } row[64] ={ values [] positions: [] } row[65] ={ values [] positions: [] } row[66] ={ values [] positions: [] } row[67] ={ values [] positions: [] } row[68] ={ values [] positions: [] } row[69] ={ values [] positions: [] } row[70] ={ values [] positions: [] } row[71] ={ values [] positions: [] } row[72] ={ values [] positions: [] } row[73] ={ values [] positions: [] } row[74] ={ values [] positions: [] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [] positions: [] } row[78] ={ values [] positions: [] } row[79] ={ values [] positions: [] } row[80] ={ values [] positions: [] } row[81] ={ values [] positions: [] } row[82] ={ values [] positions: [] } row[83] ={ values [] positions: [] } row[84] ={ values [] positions: [] } row[85] ={ values [] positions: [] } row[86] ={ values [] positions: [] } row[87] ={ values [] positions: [] } row[88] ={ values [] positions: [] } row[89] ={ values [] positions: [] } row[90] ={ values [] positions: [] } row[91] ={ values [] positions: [] } row[92] ={ values [] positions: [] } row[93] ={ values [] positions: [] } row[94] ={ values [] positions: [] } row[95] ={ values [] positions: [] } row[96] ={ values [] positions: [] } row[97] ={ values [] positions: [] } row[98] ={ values [] positions: [] } row[99] ={ values [] positions: [] } row[100] ={ values [] positions: [] } Now A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } test addition of scalar to smat After adding 17 to A it is now: row[1] ={ values [17,-10,-4] positions: [1,40,94] } row[2] ={ values [17,6,9] positions: [2,38,56] } row[3] ={ values [17,5,6,-1,-7,-10,1,-9,6] positions: [3,19,37,45,54,82,84,91,93] } row[4] ={ values [17,9,1,-1,3,-7] positions: [4,9,14,37,46,86] } row[5] ={ values [17,-5,7,-2,2,-4,9] positions: [5,24,25,40,66,70,83] } row[6] ={ values [17,-7,6,9,-9] positions: [6,39,58,65,98] } row[7] ={ values [17,3,7,6,-6,-2] positions: [7,22,26,48,84,85] } row[8] ={ values [17,9,9,2,-10,6] positions: [8,54,60,61,91,92] } row[9] ={ values [17,6,-8,5,2,9] positions: [9,21,35,52,73,96] } row[10] ={ values [17,1,8,-1,-3,1,6,1,2] positions: [10,13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,17,1,3,-4,-8,-5] positions: [2,4,6,11,43,61,88,89,99] } row[12] ={ values [17,5,8] positions: [12,56,91] } row[13] ={ values [8,17,1,9,4,-3,5] positions: [7,13,17,19,41,82,88] } row[14] ={ values [17,-4,3] positions: [14,69,97] } row[15] ={ values [-9,17,-7] positions: [2,15,66] } row[16] ={ values [17,9,7,6,-8] positions: [16,44,60,75,94] } row[17] ={ values [-3,17,9,6,-4,-4,-5,-6] positions: [7,17,23,26,34,50,68,94] } row[18] ={ values [17,-1,-3] positions: [18,48,67] } row[19] ={ values [17,5,-1,-3] positions: [19,30,97,99] } row[20] ={ values [9,7,-5,17,5,9,4,-6,2] positions: [7,9,11,20,24,34,43,46,74] } row[21] ={ values [17,9] positions: [21,73] } row[22] ={ values [8,17,-3] positions: [12,22,72] } row[23] ={ values [17,1,-6,4] positions: [23,33,61,97] } row[24] ={ values [17,-1,8,-7,-6,-2,-10,3] positions: [24,37,42,43,54,82,84,97] } row[25] ={ values [9,-3,17,8,-8,-5,9,-6,-10,7] positions: [11,12,25,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,17,-3,-5,1] positions: [9,11,25,26,28,79,94] } row[27] ={ values [-9,17,3,-1,8,-8] positions: [10,27,39,47,75,95] } row[28] ={ values [17,-5] positions: [28,74] } row[29] ={ values [-8,-1,17,5,-2] positions: [7,20,29,74,77] } row[30] ={ values [17,2,5] positions: [30,40,61] } row[31] ={ values [17,4] positions: [31,65] } row[32] ={ values [23] positions: [32] } row[33] ={ values [-6,17,8] positions: [11,33,92] } row[34] ={ values [5,1,1,17,9,8,-4,-9,-6] positions: [12,31,33,34,76,79,81,91,93] } row[35] ={ values [9,17,-9,7,3,8] positions: [23,35,51,64,80,84] } row[36] ={ values [-2,3,17,2] positions: [14,25,36,70] } row[37] ={ values [-6,3,17,-1,-10,-4] positions: [21,29,37,76,83,97] } row[38] ={ values [-8,17,-3,-6] positions: [25,38,42,69] } row[39] ={ values [17,5,8,-7,-10] positions: [39,48,74,83,91] } row[40] ={ values [-8,-4,-3,17,9,-9] positions: [6,11,25,40,54,59] } row[41] ={ values [17] positions: [41] } row[42] ={ values [-4,-3,17] positions: [1,37,42] } row[43] ={ values [-7,17,-7,1,9,4] positions: [20,43,51,78,91,94] } row[44] ={ values [17,6] positions: [44,69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,17,1] positions: [6,20,21,29,36,39,43,45,59] } row[46] ={ values [-8,8,17] positions: [25,44,46] } row[47] ={ values [-2,-4,-5,6,17,3,2,-9,-7,4] positions: [5,7,9,37,47,50,55,61,63,71] } row[48] ={ values [-2,9,9,17,4] positions: [33,38,40,48,71] } row[49] ={ values [9,17] positions: [35,49] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,17,-2] positions: [5,11,28,32,34,38,40,45,50,80] } row[51] ={ values [17] positions: [51] } row[52] ={ values [4,7,-6,17,-9,4,-2,4] positions: [15,17,45,52,61,72,75,96] } row[53] ={ values [2,17,5] positions: [38,53,58] } row[54] ={ values [7,17,-2] positions: [26,54,94] } row[55] ={ values [-8,9,17,2,-2] positions: [2,36,55,60,98] } row[56] ={ values [-4,17] positions: [19,56] } row[57] ={ values [7,7,4,-8,17,9,-1,6,9] positions: [6,18,32,39,57,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,17,5,-6] positions: [2,16,26,32,39,43,54,58,66,67] } row[59] ={ values [17,-8] positions: [59,95] } row[60] ={ values [1,-10,6,8,17,5,6,-10,-5] positions: [8,17,26,37,60,62,72,75,92] } row[61] ={ values [3,5,17] positions: [10,17,61] } row[62] ={ values [5,-4,-8,6,-9,-8,17,3,-8] positions: [6,14,34,35,49,57,62,66,84] } row[63] ={ values [9,3,-8,13,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,17,-1,9,9] positions: [51,64,86,88,94] } row[65] ={ values [17,2,4] positions: [65,79,92] } row[66] ={ values [7,-5,-4,8,17] positions: [9,13,19,37,66] } row[67] ={ values [-3,4,-1,17,-10,-1] positions: [27,55,66,67,80,97] } row[68] ={ values [-2,17,-6] positions: [33,68,70] } row[69] ={ values [17,-10] positions: [69,81] } row[70] ={ values [-1,-5,-2,17,1] positions: [34,45,53,70,89] } row[71] ={ values [6,2,-1,17,6] positions: [61,64,70,71,88] } row[72] ={ values [17] positions: [72] } row[73] ={ values [-7,-7,17] positions: [42,72,73] } row[74] ={ values [-7,-1,-2,7,7,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [17] positions: [75] } row[76] ={ values [17] positions: [76] } row[77] ={ values [1,17] positions: [18,77] } row[78] ={ values [-7,-10,-4,2,9,17,9] positions: [22,43,51,72,75,78,83] } row[79] ={ values [-5,17] positions: [8,79] } row[80] ={ values [17] positions: [80] } row[81] ={ values [-2,5,17,2,-9] positions: [51,70,81,86,87] } row[82] ={ values [2,-8,1,17] positions: [32,36,41,82] } row[83] ={ values [8,-8,9,-7,-1,-7,17,-6] positions: [15,27,32,48,60,65,83,97] } row[84] ={ values [-2,-9,8,7,-5,17,7,-2,8] positions: [9,12,34,35,38,84,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,17,8,-3,-7] positions: [22,31,39,59,74,85,95,97,99] } row[86] ={ values [9,-1,-5,-3,17] positions: [9,13,54,80,86] } row[87] ={ values [1,-7,-7,17] positions: [14,48,83,87] } row[88] ={ values [-6,1,9,9,-5,-5,-1,17,9] positions: [6,40,47,59,62,73,82,88,91] } row[89] ={ values [-1,-9,1,-2,-2,2,21] positions: [3,10,11,20,22,30,89] } row[90] ={ values [17] positions: [90] } row[91] ={ values [-7,2,6,17,2] positions: [30,44,51,91,99] } row[92] ={ values [17] positions: [92] } row[93] ={ values [4,9,-2,17] positions: [80,85,87,93] } row[94] ={ values [11] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8,17] positions: [20,22,41,51,72,84,95] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8,17] positions: [3,8,13,27,34,41,68,69,70,96] } row[97] ={ values [-10,-10,7,-9,-3,-10,3,17] positions: [17,20,34,35,41,66,85,97] } row[98] ={ values [9,-2,-2,17] positions: [36,59,74,98] } row[99] ={ values [-2,17] positions: [43,99] } row[100] ={ values [-2,5,-6,-7,4,-6,9,17] positions: [13,35,47,53,58,68,82,100] } After subtracting 17 again it is now: row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } scalar addition OK A = 5x5 zero smat: row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } After adding 17 to A it is now: row[1] ={ values [17] positions: [1] } row[2] ={ values [17] positions: [2] } row[3] ={ values [17] positions: [3] } row[4] ={ values [17] positions: [4] } row[5] ={ values [17] positions: [5] } After subtracting 17 again it is now: row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } scalar addition OK test multiplication of smat by matrix enter smat: first row, col and then the rows now enter matrix: first row, col and then the entries the smat is (as a matrix) [[0,-10,-4], [0,6,0], [5,-7,6]] the matrix is [[1,2,3,4], [0,5,6,0], [7,8,9,10]] the product matrix is: [[-28,-82,-96,-40], [0,30,36,0], [47,23,27,80]] Correct Testing transpose function A=(A^t)^t ? yes! enter new value of t test of kernel function enter size of matrix for elimination (row,col) Do you want to input the matrix for elimination or do you want a matrix with random entries? (1 for random and zero otherwise want to determine the rank using matrix? (1 = yes; 0 = no )How many maximum number of non-zero entries per row? enter seed for random number generator calculating matrix, done rank using echmodp : 95 number of non-zero entries: 525 rank is:95 number of non-zero entries: 427 kernel correct enter new value of t eclib-20250122/tests/out_no_ntl/smattest2.out000066400000000000000000004350631474421343600210530ustar00rootroot00000000000000enter 0 to exit enter 1 to do all tests enter 2 to operations enter 3 to special speed test enter> enter 4 to elimination test enter> enter 5 to kernel test enter> enter 6 to multiply smat by smat enter> enter 7 to find eigenspaces enter> Test run of sparse matrix package. enter # of rows: enter # of colums: Unitialized new smat sm = row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } row[6] ={ values [] positions: [] } row[7] ={ values [] positions: [] } row[8] ={ values [] positions: [] } row[9] ={ values [] positions: [] } row[10] ={ values [] positions: [] } row[11] ={ values [] positions: [] } row[12] ={ values [] positions: [] } row[13] ={ values [] positions: [] } row[14] ={ values [] positions: [] } row[15] ={ values [] positions: [] } row[16] ={ values [] positions: [] } row[17] ={ values [] positions: [] } row[18] ={ values [] positions: [] } row[19] ={ values [] positions: [] } row[20] ={ values [] positions: [] } row[21] ={ values [] positions: [] } row[22] ={ values [] positions: [] } row[23] ={ values [] positions: [] } row[24] ={ values [] positions: [] } row[25] ={ values [] positions: [] } row[26] ={ values [] positions: [] } row[27] ={ values [] positions: [] } row[28] ={ values [] positions: [] } row[29] ={ values [] positions: [] } row[30] ={ values [] positions: [] } row[31] ={ values [] positions: [] } row[32] ={ values [] positions: [] } row[33] ={ values [] positions: [] } row[34] ={ values [] positions: [] } row[35] ={ values [] positions: [] } row[36] ={ values [] positions: [] } row[37] ={ values [] positions: [] } row[38] ={ values [] positions: [] } row[39] ={ values [] positions: [] } row[40] ={ values [] positions: [] } row[41] ={ values [] positions: [] } row[42] ={ values [] positions: [] } row[43] ={ values [] positions: [] } row[44] ={ values [] positions: [] } row[45] ={ values [] positions: [] } row[46] ={ values [] positions: [] } row[47] ={ values [] positions: [] } row[48] ={ values [] positions: [] } row[49] ={ values [] positions: [] } row[50] ={ values [] positions: [] } row[51] ={ values [] positions: [] } row[52] ={ values [] positions: [] } row[53] ={ values [] positions: [] } row[54] ={ values [] positions: [] } row[55] ={ values [] positions: [] } row[56] ={ values [] positions: [] } row[57] ={ values [] positions: [] } row[58] ={ values [] positions: [] } row[59] ={ values [] positions: [] } row[60] ={ values [] positions: [] } row[61] ={ values [] positions: [] } row[62] ={ values [] positions: [] } row[63] ={ values [] positions: [] } row[64] ={ values [] positions: [] } row[65] ={ values [] positions: [] } row[66] ={ values [] positions: [] } row[67] ={ values [] positions: [] } row[68] ={ values [] positions: [] } row[69] ={ values [] positions: [] } row[70] ={ values [] positions: [] } row[71] ={ values [] positions: [] } row[72] ={ values [] positions: [] } row[73] ={ values [] positions: [] } row[74] ={ values [] positions: [] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [] positions: [] } row[78] ={ values [] positions: [] } row[79] ={ values [] positions: [] } row[80] ={ values [] positions: [] } row[81] ={ values [] positions: [] } row[82] ={ values [] positions: [] } row[83] ={ values [] positions: [] } row[84] ={ values [] positions: [] } row[85] ={ values [] positions: [] } row[86] ={ values [] positions: [] } row[87] ={ values [] positions: [] } row[88] ={ values [] positions: [] } row[89] ={ values [] positions: [] } row[90] ={ values [] positions: [] } row[91] ={ values [] positions: [] } row[92] ={ values [] positions: [] } row[93] ={ values [] positions: [] } row[94] ={ values [] positions: [] } row[95] ={ values [] positions: [] } row[96] ={ values [] positions: [] } row[97] ={ values [] positions: [] } row[98] ={ values [] positions: [] } row[99] ={ values [] positions: [] } row[100] ={ values [] positions: [] } Enter any number Enter size of a square matrix A: Enter entries of A: A = [[1,2], [3,4]] smat from matrix A = row[1] ={ values [1,2] positions: [1,2] } row[2] ={ values [3,4] positions: [1,2] } Enter any number Copy of smat = row[1] ={ values [1,2] positions: [1,2] } row[2] ={ values [3,4] positions: [1,2] } Enter any number Copy using assignment= row[1] ={ values [1,2] positions: [1,2] } row[2] ={ values [3,4] positions: [1,2] } Enter any number enter number of rows of smat for conversion Now enter number of columns smat = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } smat as a matrix = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,1,0,0,0,0,0,0,-9,0,6,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,9,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,9,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,6,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-3,0,0,0,0,0,1,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2], [0,5,0,-10,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,-8,0,0,0,0,0,0,0,0,0,-5,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,1,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0], [0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0], [0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,6,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-3,0], [0,0,0,0,0,0,9,0,7,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,4,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,8,-7,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0], [0,0,0,0,0,0,0,0,0,0,9,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,-10,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,-1,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,8,0,-4,0,0,0,0,0,0,0,0,0,-9,0,-6,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,-8,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,4,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,-6,0,0,0,0,0,0,0,1,0,0,0,0,0,0,-5,0,0,5,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,-2,0,-4,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,-9,0,-7,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,9,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,-7,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,5,0,9,0,0,0,3,0,9,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,4,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0], [0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,6,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0], [0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,-7,0,0,0,0,0,0,-8,0,0,0,3,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,5,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,6,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,5,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,6,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,9,0,0,0,0,0,0,0,0,0,0,3,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,-10,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,9,0,0,0,0,0,9,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,7,0,0,0,-5,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,2,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,-5,0,-6,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,9,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,-9,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,-8,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0], [0,0,0,0,0,0,0,0,-2,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,-2,8,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,-3,0,-7,0], [0,0,0,0,0,0,0,0,9,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,9,0,0,-5,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0], [0,0,-1,0,0,0,0,0,0,-9,1,0,0,0,0,0,0,0,0,-2,0,-2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,9,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,0,0,0,0,-6,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,-5,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,-5,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,7,-9,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,-7,0,0,0,0,4,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] Enter any number Enter position: (row,col)T(50 , 50) = 0 testing set_row enter new row : which row ? (starting from zero) number of non-zero elements ? values ? positions ? new matrix : row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [1,2,3] positions: [10,20,30] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } testing operations Enter size of smat A row,col: Enter size of smat B: row,col: matrix A row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } matrix B row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number C = A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number B==A?1 B!=A?0 C==A?1 C!=A?0 Enter any number after B+=A, A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-20,-8] positions: [40,94] } row[2] ={ values [12,18] positions: [38,56] } row[3] ={ values [10,12,-2,-14,-20,2,-18,12] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [18,2,-2,6,-14] positions: [9,14,37,46,86] } row[5] ={ values [-10,14,-4,4,-8,18] positions: [24,25,40,66,70,83] } row[6] ={ values [-14,12,18,-18] positions: [39,58,65,98] } row[7] ={ values [6,14,12,-12,-4] positions: [22,26,48,84,85] } row[8] ={ values [18,18,4,-20,12] positions: [54,60,61,91,92] } row[9] ={ values [12,-16,10,4,18] positions: [21,35,52,73,96] } row[10] ={ values [2,16,-2,-6,2,12,2,4] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [10,-20,-6,2,6,-8,-16,-10] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [10,16] positions: [56,91] } row[13] ={ values [16,2,18,8,-6,10] positions: [7,17,19,41,82,88] } row[14] ={ values [-8,6] positions: [69,97] } row[15] ={ values [-18,-14] positions: [2,66] } row[16] ={ values [18,14,12,-16] positions: [44,60,75,94] } row[17] ={ values [-6,18,12,-8,-8,-10,-12] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-2,-6] positions: [48,67] } row[19] ={ values [10,-2,-6] positions: [30,97,99] } row[20] ={ values [18,14,-10,10,18,8,-12,4] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [18] positions: [73] } row[22] ={ values [16,-6] positions: [12,72] } row[23] ={ values [2,-12,8] positions: [33,61,97] } row[24] ={ values [-2,16,-14,-12,-4,-20,6] positions: [37,42,43,54,82,84,97] } row[25] ={ values [18,-6,16,-16,-10,18,-12,-20,14] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-2,-18,-8,-6,-10,2] positions: [9,11,25,28,79,94] } row[27] ={ values [-18,6,-2,16,-16] positions: [10,39,47,75,95] } row[28] ={ values [-10] positions: [74] } row[29] ={ values [-16,-2,10,-4] positions: [7,20,74,77] } row[30] ={ values [4,10] positions: [40,61] } row[31] ={ values [8] positions: [65] } row[32] ={ values [12] positions: [32] } row[33] ={ values [-12,16] positions: [11,92] } row[34] ={ values [10,2,2,18,16,-8,-18,-12] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [18,-18,14,6,16] positions: [23,51,64,80,84] } row[36] ={ values [-4,6,4] positions: [14,25,70] } row[37] ={ values [-12,6,-2,-20,-8] positions: [21,29,76,83,97] } row[38] ={ values [-16,-6,-12] positions: [25,42,69] } row[39] ={ values [10,16,-14,-20] positions: [48,74,83,91] } row[40] ={ values [-16,-8,-6,18,-18] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-8,-6] positions: [1,37] } row[43] ={ values [-14,-14,2,18,8] positions: [20,51,78,91,94] } row[44] ={ values [12] positions: [69] } row[45] ={ values [-8,-4,-12,2,-10,10,-12,2] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-16,16] positions: [25,44] } row[47] ={ values [-4,-8,-10,12,6,4,-18,-14,8] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-4,18,18,8] positions: [33,38,40,71] } row[49] ={ values [18] positions: [35] } row[50] ={ values [-14,-12,-16,10,18,6,18,-4,-4] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [8,14,-12,-18,8,-4,8] positions: [15,17,45,61,72,75,96] } row[53] ={ values [4,10] positions: [38,58] } row[54] ={ values [14,-4] positions: [26,94] } row[55] ={ values [-16,18,4,-4] positions: [2,36,60,98] } row[56] ={ values [-8] positions: [19] } row[57] ={ values [14,14,8,-16,18,-2,12,18] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-6,18,12,-14,-16,6,4,10,-12] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-16] positions: [95] } row[60] ={ values [2,-20,12,16,10,12,-20,-10] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [6,10] positions: [10,17] } row[62] ={ values [10,-8,-16,12,-18,-16,6,-16] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [18,6,-16,-8,-20,-20,-20] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-6,-2,18,18] positions: [51,86,88,94] } row[65] ={ values [4,8] positions: [79,92] } row[66] ={ values [14,-10,-8,16] positions: [9,13,19,37] } row[67] ={ values [-6,8,-2,-20,-2] positions: [27,55,66,80,97] } row[68] ={ values [-4,-12] positions: [33,70] } row[69] ={ values [-20] positions: [81] } row[70] ={ values [-2,-10,-4,2] positions: [34,45,53,89] } row[71] ={ values [12,4,-2,12] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-14,-14] positions: [42,72] } row[74] ={ values [-14,-2,-4,14,-20,-10,-12,-6] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [2] positions: [18] } row[78] ={ values [-14,-20,-8,4,18,18] positions: [22,43,51,72,75,83] } row[79] ={ values [-10] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-4,10,4,-18] positions: [51,70,86,87] } row[82] ={ values [4,-16,2] positions: [32,36,41] } row[83] ={ values [16,-16,18,-14,-2,-14,-12] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-4,-18,16,14,-10,14,-4,16] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [4,-14,-8,2,-12,16,-6,-14] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [18,-2,-10,-6] positions: [9,13,54,80] } row[87] ={ values [2,-14,-14] positions: [14,48,83] } row[88] ={ values [-12,2,18,18,-10,-10,-2,18] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-2,-18,2,-4,-4,4,8] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-14,4,12,4] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [8,18,-4] positions: [80,85,87] } row[94] ={ values [-12] positions: [94] } row[95] ={ values [10,-14,-12,-4,10,-16] positions: [20,22,41,51,72,84] } row[96] ={ values [2,-12,-14,-20,-10,10,6,-10,-16] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-20,-20,14,-18,-6,-20,6] positions: [17,20,34,35,41,66,85] } row[98] ={ values [18,-4,-4] positions: [36,59,74] } row[99] ={ values [-4] positions: [43] } row[100] ={ values [-4,10,-12,-14,8,-12,18] positions: [13,35,47,53,58,68,82] } Enter any number after B-=A, A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number after B*=2, B = row[1] ={ values [-20,-8] positions: [40,94] } row[2] ={ values [12,18] positions: [38,56] } row[3] ={ values [10,12,-2,-14,-20,2,-18,12] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [18,2,-2,6,-14] positions: [9,14,37,46,86] } row[5] ={ values [-10,14,-4,4,-8,18] positions: [24,25,40,66,70,83] } row[6] ={ values [-14,12,18,-18] positions: [39,58,65,98] } row[7] ={ values [6,14,12,-12,-4] positions: [22,26,48,84,85] } row[8] ={ values [18,18,4,-20,12] positions: [54,60,61,91,92] } row[9] ={ values [12,-16,10,4,18] positions: [21,35,52,73,96] } row[10] ={ values [2,16,-2,-6,2,12,2,4] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [10,-20,-6,2,6,-8,-16,-10] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [10,16] positions: [56,91] } row[13] ={ values [16,2,18,8,-6,10] positions: [7,17,19,41,82,88] } row[14] ={ values [-8,6] positions: [69,97] } row[15] ={ values [-18,-14] positions: [2,66] } row[16] ={ values [18,14,12,-16] positions: [44,60,75,94] } row[17] ={ values [-6,18,12,-8,-8,-10,-12] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-2,-6] positions: [48,67] } row[19] ={ values [10,-2,-6] positions: [30,97,99] } row[20] ={ values [18,14,-10,10,18,8,-12,4] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [18] positions: [73] } row[22] ={ values [16,-6] positions: [12,72] } row[23] ={ values [2,-12,8] positions: [33,61,97] } row[24] ={ values [-2,16,-14,-12,-4,-20,6] positions: [37,42,43,54,82,84,97] } row[25] ={ values [18,-6,16,-16,-10,18,-12,-20,14] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-2,-18,-8,-6,-10,2] positions: [9,11,25,28,79,94] } row[27] ={ values [-18,6,-2,16,-16] positions: [10,39,47,75,95] } row[28] ={ values [-10] positions: [74] } row[29] ={ values [-16,-2,10,-4] positions: [7,20,74,77] } row[30] ={ values [4,10] positions: [40,61] } row[31] ={ values [8] positions: [65] } row[32] ={ values [12] positions: [32] } row[33] ={ values [-12,16] positions: [11,92] } row[34] ={ values [10,2,2,18,16,-8,-18,-12] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [18,-18,14,6,16] positions: [23,51,64,80,84] } row[36] ={ values [-4,6,4] positions: [14,25,70] } row[37] ={ values [-12,6,-2,-20,-8] positions: [21,29,76,83,97] } row[38] ={ values [-16,-6,-12] positions: [25,42,69] } row[39] ={ values [10,16,-14,-20] positions: [48,74,83,91] } row[40] ={ values [-16,-8,-6,18,-18] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-8,-6] positions: [1,37] } row[43] ={ values [-14,-14,2,18,8] positions: [20,51,78,91,94] } row[44] ={ values [12] positions: [69] } row[45] ={ values [-8,-4,-12,2,-10,10,-12,2] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-16,16] positions: [25,44] } row[47] ={ values [-4,-8,-10,12,6,4,-18,-14,8] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-4,18,18,8] positions: [33,38,40,71] } row[49] ={ values [18] positions: [35] } row[50] ={ values [-14,-12,-16,10,18,6,18,-4,-4] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [8,14,-12,-18,8,-4,8] positions: [15,17,45,61,72,75,96] } row[53] ={ values [4,10] positions: [38,58] } row[54] ={ values [14,-4] positions: [26,94] } row[55] ={ values [-16,18,4,-4] positions: [2,36,60,98] } row[56] ={ values [-8] positions: [19] } row[57] ={ values [14,14,8,-16,18,-2,12,18] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-6,18,12,-14,-16,6,4,10,-12] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-16] positions: [95] } row[60] ={ values [2,-20,12,16,10,12,-20,-10] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [6,10] positions: [10,17] } row[62] ={ values [10,-8,-16,12,-18,-16,6,-16] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [18,6,-16,-8,-20,-20,-20] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-6,-2,18,18] positions: [51,86,88,94] } row[65] ={ values [4,8] positions: [79,92] } row[66] ={ values [14,-10,-8,16] positions: [9,13,19,37] } row[67] ={ values [-6,8,-2,-20,-2] positions: [27,55,66,80,97] } row[68] ={ values [-4,-12] positions: [33,70] } row[69] ={ values [-20] positions: [81] } row[70] ={ values [-2,-10,-4,2] positions: [34,45,53,89] } row[71] ={ values [12,4,-2,12] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-14,-14] positions: [42,72] } row[74] ={ values [-14,-2,-4,14,-20,-10,-12,-6] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [2] positions: [18] } row[78] ={ values [-14,-20,-8,4,18,18] positions: [22,43,51,72,75,83] } row[79] ={ values [-10] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-4,10,4,-18] positions: [51,70,86,87] } row[82] ={ values [4,-16,2] positions: [32,36,41] } row[83] ={ values [16,-16,18,-14,-2,-14,-12] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-4,-18,16,14,-10,14,-4,16] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [4,-14,-8,2,-12,16,-6,-14] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [18,-2,-10,-6] positions: [9,13,54,80] } row[87] ={ values [2,-14,-14] positions: [14,48,83] } row[88] ={ values [-12,2,18,18,-10,-10,-2,18] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-2,-18,2,-4,-4,4,8] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-14,4,12,4] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [8,18,-4] positions: [80,85,87] } row[94] ={ values [-12] positions: [94] } row[95] ={ values [10,-14,-12,-4,10,-16] positions: [20,22,41,51,72,84] } row[96] ={ values [2,-12,-14,-20,-10,10,6,-10,-16] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-20,-20,14,-18,-6,-20,6] positions: [17,20,34,35,41,66,85] } row[98] ={ values [18,-4,-4] positions: [36,59,74] } row[99] ={ values [-4] positions: [43] } row[100] ={ values [-4,10,-12,-14,8,-12,18] positions: [13,35,47,53,58,68,82] } Enter any number after B/=2, B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number A+B=row[1] ={ values [-20,-8] positions: [40,94] } row[2] ={ values [12,18] positions: [38,56] } row[3] ={ values [10,12,-2,-14,-20,2,-18,12] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [18,2,-2,6,-14] positions: [9,14,37,46,86] } row[5] ={ values [-10,14,-4,4,-8,18] positions: [24,25,40,66,70,83] } row[6] ={ values [-14,12,18,-18] positions: [39,58,65,98] } row[7] ={ values [6,14,12,-12,-4] positions: [22,26,48,84,85] } row[8] ={ values [18,18,4,-20,12] positions: [54,60,61,91,92] } row[9] ={ values [12,-16,10,4,18] positions: [21,35,52,73,96] } row[10] ={ values [2,16,-2,-6,2,12,2,4] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [10,-20,-6,2,6,-8,-16,-10] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [10,16] positions: [56,91] } row[13] ={ values [16,2,18,8,-6,10] positions: [7,17,19,41,82,88] } row[14] ={ values [-8,6] positions: [69,97] } row[15] ={ values [-18,-14] positions: [2,66] } row[16] ={ values [18,14,12,-16] positions: [44,60,75,94] } row[17] ={ values [-6,18,12,-8,-8,-10,-12] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-2,-6] positions: [48,67] } row[19] ={ values [10,-2,-6] positions: [30,97,99] } row[20] ={ values [18,14,-10,10,18,8,-12,4] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [18] positions: [73] } row[22] ={ values [16,-6] positions: [12,72] } row[23] ={ values [2,-12,8] positions: [33,61,97] } row[24] ={ values [-2,16,-14,-12,-4,-20,6] positions: [37,42,43,54,82,84,97] } row[25] ={ values [18,-6,16,-16,-10,18,-12,-20,14] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-2,-18,-8,-6,-10,2] positions: [9,11,25,28,79,94] } row[27] ={ values [-18,6,-2,16,-16] positions: [10,39,47,75,95] } row[28] ={ values [-10] positions: [74] } row[29] ={ values [-16,-2,10,-4] positions: [7,20,74,77] } row[30] ={ values [4,10] positions: [40,61] } row[31] ={ values [8] positions: [65] } row[32] ={ values [12] positions: [32] } row[33] ={ values [-12,16] positions: [11,92] } row[34] ={ values [10,2,2,18,16,-8,-18,-12] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [18,-18,14,6,16] positions: [23,51,64,80,84] } row[36] ={ values [-4,6,4] positions: [14,25,70] } row[37] ={ values [-12,6,-2,-20,-8] positions: [21,29,76,83,97] } row[38] ={ values [-16,-6,-12] positions: [25,42,69] } row[39] ={ values [10,16,-14,-20] positions: [48,74,83,91] } row[40] ={ values [-16,-8,-6,18,-18] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-8,-6] positions: [1,37] } row[43] ={ values [-14,-14,2,18,8] positions: [20,51,78,91,94] } row[44] ={ values [12] positions: [69] } row[45] ={ values [-8,-4,-12,2,-10,10,-12,2] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-16,16] positions: [25,44] } row[47] ={ values [-4,-8,-10,12,6,4,-18,-14,8] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-4,18,18,8] positions: [33,38,40,71] } row[49] ={ values [18] positions: [35] } row[50] ={ values [-14,-12,-16,10,18,6,18,-4,-4] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [8,14,-12,-18,8,-4,8] positions: [15,17,45,61,72,75,96] } row[53] ={ values [4,10] positions: [38,58] } row[54] ={ values [14,-4] positions: [26,94] } row[55] ={ values [-16,18,4,-4] positions: [2,36,60,98] } row[56] ={ values [-8] positions: [19] } row[57] ={ values [14,14,8,-16,18,-2,12,18] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-6,18,12,-14,-16,6,4,10,-12] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-16] positions: [95] } row[60] ={ values [2,-20,12,16,10,12,-20,-10] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [6,10] positions: [10,17] } row[62] ={ values [10,-8,-16,12,-18,-16,6,-16] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [18,6,-16,-8,-20,-20,-20] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-6,-2,18,18] positions: [51,86,88,94] } row[65] ={ values [4,8] positions: [79,92] } row[66] ={ values [14,-10,-8,16] positions: [9,13,19,37] } row[67] ={ values [-6,8,-2,-20,-2] positions: [27,55,66,80,97] } row[68] ={ values [-4,-12] positions: [33,70] } row[69] ={ values [-20] positions: [81] } row[70] ={ values [-2,-10,-4,2] positions: [34,45,53,89] } row[71] ={ values [12,4,-2,12] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-14,-14] positions: [42,72] } row[74] ={ values [-14,-2,-4,14,-20,-10,-12,-6] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [2] positions: [18] } row[78] ={ values [-14,-20,-8,4,18,18] positions: [22,43,51,72,75,83] } row[79] ={ values [-10] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-4,10,4,-18] positions: [51,70,86,87] } row[82] ={ values [4,-16,2] positions: [32,36,41] } row[83] ={ values [16,-16,18,-14,-2,-14,-12] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-4,-18,16,14,-10,14,-4,16] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [4,-14,-8,2,-12,16,-6,-14] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [18,-2,-10,-6] positions: [9,13,54,80] } row[87] ={ values [2,-14,-14] positions: [14,48,83] } row[88] ={ values [-12,2,18,18,-10,-10,-2,18] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-2,-18,2,-4,-4,4,8] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-14,4,12,4] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [8,18,-4] positions: [80,85,87] } row[94] ={ values [-12] positions: [94] } row[95] ={ values [10,-14,-12,-4,10,-16] positions: [20,22,41,51,72,84] } row[96] ={ values [2,-12,-14,-20,-10,10,6,-10,-16] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-20,-20,14,-18,-6,-20,6] positions: [17,20,34,35,41,66,85] } row[98] ={ values [18,-4,-4] positions: [36,59,74] } row[99] ={ values [-4] positions: [43] } row[100] ={ values [-4,10,-12,-14,8,-12,18] positions: [13,35,47,53,58,68,82] } Now A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number A-B=row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } row[6] ={ values [] positions: [] } row[7] ={ values [] positions: [] } row[8] ={ values [] positions: [] } row[9] ={ values [] positions: [] } row[10] ={ values [] positions: [] } row[11] ={ values [] positions: [] } row[12] ={ values [] positions: [] } row[13] ={ values [] positions: [] } row[14] ={ values [] positions: [] } row[15] ={ values [] positions: [] } row[16] ={ values [] positions: [] } row[17] ={ values [] positions: [] } row[18] ={ values [] positions: [] } row[19] ={ values [] positions: [] } row[20] ={ values [] positions: [] } row[21] ={ values [] positions: [] } row[22] ={ values [] positions: [] } row[23] ={ values [] positions: [] } row[24] ={ values [] positions: [] } row[25] ={ values [] positions: [] } row[26] ={ values [] positions: [] } row[27] ={ values [] positions: [] } row[28] ={ values [] positions: [] } row[29] ={ values [] positions: [] } row[30] ={ values [] positions: [] } row[31] ={ values [] positions: [] } row[32] ={ values [] positions: [] } row[33] ={ values [] positions: [] } row[34] ={ values [] positions: [] } row[35] ={ values [] positions: [] } row[36] ={ values [] positions: [] } row[37] ={ values [] positions: [] } row[38] ={ values [] positions: [] } row[39] ={ values [] positions: [] } row[40] ={ values [] positions: [] } row[41] ={ values [] positions: [] } row[42] ={ values [] positions: [] } row[43] ={ values [] positions: [] } row[44] ={ values [] positions: [] } row[45] ={ values [] positions: [] } row[46] ={ values [] positions: [] } row[47] ={ values [] positions: [] } row[48] ={ values [] positions: [] } row[49] ={ values [] positions: [] } row[50] ={ values [] positions: [] } row[51] ={ values [] positions: [] } row[52] ={ values [] positions: [] } row[53] ={ values [] positions: [] } row[54] ={ values [] positions: [] } row[55] ={ values [] positions: [] } row[56] ={ values [] positions: [] } row[57] ={ values [] positions: [] } row[58] ={ values [] positions: [] } row[59] ={ values [] positions: [] } row[60] ={ values [] positions: [] } row[61] ={ values [] positions: [] } row[62] ={ values [] positions: [] } row[63] ={ values [] positions: [] } row[64] ={ values [] positions: [] } row[65] ={ values [] positions: [] } row[66] ={ values [] positions: [] } row[67] ={ values [] positions: [] } row[68] ={ values [] positions: [] } row[69] ={ values [] positions: [] } row[70] ={ values [] positions: [] } row[71] ={ values [] positions: [] } row[72] ={ values [] positions: [] } row[73] ={ values [] positions: [] } row[74] ={ values [] positions: [] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [] positions: [] } row[78] ={ values [] positions: [] } row[79] ={ values [] positions: [] } row[80] ={ values [] positions: [] } row[81] ={ values [] positions: [] } row[82] ={ values [] positions: [] } row[83] ={ values [] positions: [] } row[84] ={ values [] positions: [] } row[85] ={ values [] positions: [] } row[86] ={ values [] positions: [] } row[87] ={ values [] positions: [] } row[88] ={ values [] positions: [] } row[89] ={ values [] positions: [] } row[90] ={ values [] positions: [] } row[91] ={ values [] positions: [] } row[92] ={ values [] positions: [] } row[93] ={ values [] positions: [] } row[94] ={ values [] positions: [] } row[95] ={ values [] positions: [] } row[96] ={ values [] positions: [] } row[97] ={ values [] positions: [] } row[98] ={ values [] positions: [] } row[99] ={ values [] positions: [] } row[100] ={ values [] positions: [] } Now A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } test addition of scalar to smat After adding 17 to A it is now: row[1] ={ values [17,-10,-4] positions: [1,40,94] } row[2] ={ values [17,6,9] positions: [2,38,56] } row[3] ={ values [17,5,6,-1,-7,-10,1,-9,6] positions: [3,19,37,45,54,82,84,91,93] } row[4] ={ values [17,9,1,-1,3,-7] positions: [4,9,14,37,46,86] } row[5] ={ values [17,-5,7,-2,2,-4,9] positions: [5,24,25,40,66,70,83] } row[6] ={ values [17,-7,6,9,-9] positions: [6,39,58,65,98] } row[7] ={ values [17,3,7,6,-6,-2] positions: [7,22,26,48,84,85] } row[8] ={ values [17,9,9,2,-10,6] positions: [8,54,60,61,91,92] } row[9] ={ values [17,6,-8,5,2,9] positions: [9,21,35,52,73,96] } row[10] ={ values [17,1,8,-1,-3,1,6,1,2] positions: [10,13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,17,1,3,-4,-8,-5] positions: [2,4,6,11,43,61,88,89,99] } row[12] ={ values [17,5,8] positions: [12,56,91] } row[13] ={ values [8,17,1,9,4,-3,5] positions: [7,13,17,19,41,82,88] } row[14] ={ values [17,-4,3] positions: [14,69,97] } row[15] ={ values [-9,17,-7] positions: [2,15,66] } row[16] ={ values [17,9,7,6,-8] positions: [16,44,60,75,94] } row[17] ={ values [-3,17,9,6,-4,-4,-5,-6] positions: [7,17,23,26,34,50,68,94] } row[18] ={ values [17,-1,-3] positions: [18,48,67] } row[19] ={ values [17,5,-1,-3] positions: [19,30,97,99] } row[20] ={ values [9,7,-5,17,5,9,4,-6,2] positions: [7,9,11,20,24,34,43,46,74] } row[21] ={ values [17,9] positions: [21,73] } row[22] ={ values [8,17,-3] positions: [12,22,72] } row[23] ={ values [17,1,-6,4] positions: [23,33,61,97] } row[24] ={ values [17,-1,8,-7,-6,-2,-10,3] positions: [24,37,42,43,54,82,84,97] } row[25] ={ values [9,-3,17,8,-8,-5,9,-6,-10,7] positions: [11,12,25,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,17,-3,-5,1] positions: [9,11,25,26,28,79,94] } row[27] ={ values [-9,17,3,-1,8,-8] positions: [10,27,39,47,75,95] } row[28] ={ values [17,-5] positions: [28,74] } row[29] ={ values [-8,-1,17,5,-2] positions: [7,20,29,74,77] } row[30] ={ values [17,2,5] positions: [30,40,61] } row[31] ={ values [17,4] positions: [31,65] } row[32] ={ values [23] positions: [32] } row[33] ={ values [-6,17,8] positions: [11,33,92] } row[34] ={ values [5,1,1,17,9,8,-4,-9,-6] positions: [12,31,33,34,76,79,81,91,93] } row[35] ={ values [9,17,-9,7,3,8] positions: [23,35,51,64,80,84] } row[36] ={ values [-2,3,17,2] positions: [14,25,36,70] } row[37] ={ values [-6,3,17,-1,-10,-4] positions: [21,29,37,76,83,97] } row[38] ={ values [-8,17,-3,-6] positions: [25,38,42,69] } row[39] ={ values [17,5,8,-7,-10] positions: [39,48,74,83,91] } row[40] ={ values [-8,-4,-3,17,9,-9] positions: [6,11,25,40,54,59] } row[41] ={ values [17] positions: [41] } row[42] ={ values [-4,-3,17] positions: [1,37,42] } row[43] ={ values [-7,17,-7,1,9,4] positions: [20,43,51,78,91,94] } row[44] ={ values [17,6] positions: [44,69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,17,1] positions: [6,20,21,29,36,39,43,45,59] } row[46] ={ values [-8,8,17] positions: [25,44,46] } row[47] ={ values [-2,-4,-5,6,17,3,2,-9,-7,4] positions: [5,7,9,37,47,50,55,61,63,71] } row[48] ={ values [-2,9,9,17,4] positions: [33,38,40,48,71] } row[49] ={ values [9,17] positions: [35,49] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,17,-2] positions: [5,11,28,32,34,38,40,45,50,80] } row[51] ={ values [17] positions: [51] } row[52] ={ values [4,7,-6,17,-9,4,-2,4] positions: [15,17,45,52,61,72,75,96] } row[53] ={ values [2,17,5] positions: [38,53,58] } row[54] ={ values [7,17,-2] positions: [26,54,94] } row[55] ={ values [-8,9,17,2,-2] positions: [2,36,55,60,98] } row[56] ={ values [-4,17] positions: [19,56] } row[57] ={ values [7,7,4,-8,17,9,-1,6,9] positions: [6,18,32,39,57,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,17,5,-6] positions: [2,16,26,32,39,43,54,58,66,67] } row[59] ={ values [17,-8] positions: [59,95] } row[60] ={ values [1,-10,6,8,17,5,6,-10,-5] positions: [8,17,26,37,60,62,72,75,92] } row[61] ={ values [3,5,17] positions: [10,17,61] } row[62] ={ values [5,-4,-8,6,-9,-8,17,3,-8] positions: [6,14,34,35,49,57,62,66,84] } row[63] ={ values [9,3,-8,13,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,17,-1,9,9] positions: [51,64,86,88,94] } row[65] ={ values [17,2,4] positions: [65,79,92] } row[66] ={ values [7,-5,-4,8,17] positions: [9,13,19,37,66] } row[67] ={ values [-3,4,-1,17,-10,-1] positions: [27,55,66,67,80,97] } row[68] ={ values [-2,17,-6] positions: [33,68,70] } row[69] ={ values [17,-10] positions: [69,81] } row[70] ={ values [-1,-5,-2,17,1] positions: [34,45,53,70,89] } row[71] ={ values [6,2,-1,17,6] positions: [61,64,70,71,88] } row[72] ={ values [17] positions: [72] } row[73] ={ values [-7,-7,17] positions: [42,72,73] } row[74] ={ values [-7,-1,-2,7,7,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [17] positions: [75] } row[76] ={ values [17] positions: [76] } row[77] ={ values [1,17] positions: [18,77] } row[78] ={ values [-7,-10,-4,2,9,17,9] positions: [22,43,51,72,75,78,83] } row[79] ={ values [-5,17] positions: [8,79] } row[80] ={ values [17] positions: [80] } row[81] ={ values [-2,5,17,2,-9] positions: [51,70,81,86,87] } row[82] ={ values [2,-8,1,17] positions: [32,36,41,82] } row[83] ={ values [8,-8,9,-7,-1,-7,17,-6] positions: [15,27,32,48,60,65,83,97] } row[84] ={ values [-2,-9,8,7,-5,17,7,-2,8] positions: [9,12,34,35,38,84,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,17,8,-3,-7] positions: [22,31,39,59,74,85,95,97,99] } row[86] ={ values [9,-1,-5,-3,17] positions: [9,13,54,80,86] } row[87] ={ values [1,-7,-7,17] positions: [14,48,83,87] } row[88] ={ values [-6,1,9,9,-5,-5,-1,17,9] positions: [6,40,47,59,62,73,82,88,91] } row[89] ={ values [-1,-9,1,-2,-2,2,21] positions: [3,10,11,20,22,30,89] } row[90] ={ values [17] positions: [90] } row[91] ={ values [-7,2,6,17,2] positions: [30,44,51,91,99] } row[92] ={ values [17] positions: [92] } row[93] ={ values [4,9,-2,17] positions: [80,85,87,93] } row[94] ={ values [11] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8,17] positions: [20,22,41,51,72,84,95] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8,17] positions: [3,8,13,27,34,41,68,69,70,96] } row[97] ={ values [-10,-10,7,-9,-3,-10,3,17] positions: [17,20,34,35,41,66,85,97] } row[98] ={ values [9,-2,-2,17] positions: [36,59,74,98] } row[99] ={ values [-2,17] positions: [43,99] } row[100] ={ values [-2,5,-6,-7,4,-6,9,17] positions: [13,35,47,53,58,68,82,100] } After subtracting 17 again it is now: row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } scalar addition OK A = 5x5 zero smat: row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } After adding 17 to A it is now: row[1] ={ values [17] positions: [1] } row[2] ={ values [17] positions: [2] } row[3] ={ values [17] positions: [3] } row[4] ={ values [17] positions: [4] } row[5] ={ values [17] positions: [5] } After subtracting 17 again it is now: row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } scalar addition OK test multiplication of smat by matrix enter smat: first row, col and then the rows now enter matrix: first row, col and then the entries the smat is (as a matrix) [[0,-10,-4], [0,6,0], [5,-7,6]] the matrix is [[1,2,3,4], [0,5,6,0], [7,8,9,10]] the product matrix is: [[-28,-82,-96,-40], [0,30,36,0], [47,23,27,80]] Correct Testing transpose function A=(A^t)^t ? yes! enter new value of t test of kernel function enter size of matrix for elimination (row,col) Do you want to input the matrix for elimination or do you want a matrix with random entries? (1 for random and zero otherwise want to determine the rank using matrix? (1 = yes; 0 = no )How many maximum number of non-zero entries per row? enter seed for random number generator calculating matrix, done rank using echmodp : 95 number of non-zero entries: 525 rank is:95 number of non-zero entries: 427 kernel correct enter new value of t eclib-20250122/tests/out_no_ntl/smattest3.out000066400000000000000000004350631474421343600210540ustar00rootroot00000000000000enter 0 to exit enter 1 to do all tests enter 2 to operations enter 3 to special speed test enter> enter 4 to elimination test enter> enter 5 to kernel test enter> enter 6 to multiply smat by smat enter> enter 7 to find eigenspaces enter> Test run of sparse matrix package. enter # of rows: enter # of colums: Unitialized new smat sm = row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } row[6] ={ values [] positions: [] } row[7] ={ values [] positions: [] } row[8] ={ values [] positions: [] } row[9] ={ values [] positions: [] } row[10] ={ values [] positions: [] } row[11] ={ values [] positions: [] } row[12] ={ values [] positions: [] } row[13] ={ values [] positions: [] } row[14] ={ values [] positions: [] } row[15] ={ values [] positions: [] } row[16] ={ values [] positions: [] } row[17] ={ values [] positions: [] } row[18] ={ values [] positions: [] } row[19] ={ values [] positions: [] } row[20] ={ values [] positions: [] } row[21] ={ values [] positions: [] } row[22] ={ values [] positions: [] } row[23] ={ values [] positions: [] } row[24] ={ values [] positions: [] } row[25] ={ values [] positions: [] } row[26] ={ values [] positions: [] } row[27] ={ values [] positions: [] } row[28] ={ values [] positions: [] } row[29] ={ values [] positions: [] } row[30] ={ values [] positions: [] } row[31] ={ values [] positions: [] } row[32] ={ values [] positions: [] } row[33] ={ values [] positions: [] } row[34] ={ values [] positions: [] } row[35] ={ values [] positions: [] } row[36] ={ values [] positions: [] } row[37] ={ values [] positions: [] } row[38] ={ values [] positions: [] } row[39] ={ values [] positions: [] } row[40] ={ values [] positions: [] } row[41] ={ values [] positions: [] } row[42] ={ values [] positions: [] } row[43] ={ values [] positions: [] } row[44] ={ values [] positions: [] } row[45] ={ values [] positions: [] } row[46] ={ values [] positions: [] } row[47] ={ values [] positions: [] } row[48] ={ values [] positions: [] } row[49] ={ values [] positions: [] } row[50] ={ values [] positions: [] } row[51] ={ values [] positions: [] } row[52] ={ values [] positions: [] } row[53] ={ values [] positions: [] } row[54] ={ values [] positions: [] } row[55] ={ values [] positions: [] } row[56] ={ values [] positions: [] } row[57] ={ values [] positions: [] } row[58] ={ values [] positions: [] } row[59] ={ values [] positions: [] } row[60] ={ values [] positions: [] } row[61] ={ values [] positions: [] } row[62] ={ values [] positions: [] } row[63] ={ values [] positions: [] } row[64] ={ values [] positions: [] } row[65] ={ values [] positions: [] } row[66] ={ values [] positions: [] } row[67] ={ values [] positions: [] } row[68] ={ values [] positions: [] } row[69] ={ values [] positions: [] } row[70] ={ values [] positions: [] } row[71] ={ values [] positions: [] } row[72] ={ values [] positions: [] } row[73] ={ values [] positions: [] } row[74] ={ values [] positions: [] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [] positions: [] } row[78] ={ values [] positions: [] } row[79] ={ values [] positions: [] } row[80] ={ values [] positions: [] } row[81] ={ values [] positions: [] } row[82] ={ values [] positions: [] } row[83] ={ values [] positions: [] } row[84] ={ values [] positions: [] } row[85] ={ values [] positions: [] } row[86] ={ values [] positions: [] } row[87] ={ values [] positions: [] } row[88] ={ values [] positions: [] } row[89] ={ values [] positions: [] } row[90] ={ values [] positions: [] } row[91] ={ values [] positions: [] } row[92] ={ values [] positions: [] } row[93] ={ values [] positions: [] } row[94] ={ values [] positions: [] } row[95] ={ values [] positions: [] } row[96] ={ values [] positions: [] } row[97] ={ values [] positions: [] } row[98] ={ values [] positions: [] } row[99] ={ values [] positions: [] } row[100] ={ values [] positions: [] } Enter any number Enter size of a square matrix A: Enter entries of A: A = [[1,2], [3,4]] smat from matrix A = row[1] ={ values [1,2] positions: [1,2] } row[2] ={ values [3,4] positions: [1,2] } Enter any number Copy of smat = row[1] ={ values [1,2] positions: [1,2] } row[2] ={ values [3,4] positions: [1,2] } Enter any number Copy using assignment= row[1] ={ values [1,2] positions: [1,2] } row[2] ={ values [3,4] positions: [1,2] } Enter any number enter number of rows of smat for conversion Now enter number of columns smat = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } smat as a matrix = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,1,0,0,0,0,0,0,-9,0,6,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,9,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,9,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,6,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-3,0,0,0,0,0,1,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2], [0,5,0,-10,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,-8,0,0,0,0,0,0,0,0,0,-5,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,1,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0], [0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0], [0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,6,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-3,0], [0,0,0,0,0,0,9,0,7,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,4,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,8,-7,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0], [0,0,0,0,0,0,0,0,0,0,9,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,-10,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,-1,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,8,0,-4,0,0,0,0,0,0,0,0,0,-9,0,-6,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,-8,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,4,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,-6,0,0,0,0,0,0,0,1,0,0,0,0,0,0,-5,0,0,5,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,-2,0,-4,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,-9,0,-7,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,9,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,-7,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,5,0,9,0,0,0,3,0,9,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,4,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0], [0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,6,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0], [0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,-7,0,0,0,0,0,0,-8,0,0,0,3,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,5,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,6,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,5,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,6,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,9,0,0,0,0,0,0,0,0,0,0,3,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,-10,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,9,0,0,0,0,0,9,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,7,0,0,0,-5,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,2,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,-5,0,-6,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,9,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,-9,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,-8,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0], [0,0,0,0,0,0,0,0,-2,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,-2,8,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,-3,0,-7,0], [0,0,0,0,0,0,0,0,9,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,9,0,0,-5,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0], [0,0,-1,0,0,0,0,0,0,-9,1,0,0,0,0,0,0,0,0,-2,0,-2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,9,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,0,0,0,0,-6,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,-5,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,-5,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,7,-9,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,-7,0,0,0,0,4,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] Enter any number Enter position: (row,col)T(50 , 50) = 0 testing set_row enter new row : which row ? (starting from zero) number of non-zero elements ? values ? positions ? new matrix : row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [1,2,3] positions: [10,20,30] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } testing operations Enter size of smat A row,col: Enter size of smat B: row,col: matrix A row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } matrix B row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number C = A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number B==A?1 B!=A?0 C==A?1 C!=A?0 Enter any number after B+=A, A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-20,-8] positions: [40,94] } row[2] ={ values [12,18] positions: [38,56] } row[3] ={ values [10,12,-2,-14,-20,2,-18,12] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [18,2,-2,6,-14] positions: [9,14,37,46,86] } row[5] ={ values [-10,14,-4,4,-8,18] positions: [24,25,40,66,70,83] } row[6] ={ values [-14,12,18,-18] positions: [39,58,65,98] } row[7] ={ values [6,14,12,-12,-4] positions: [22,26,48,84,85] } row[8] ={ values [18,18,4,-20,12] positions: [54,60,61,91,92] } row[9] ={ values [12,-16,10,4,18] positions: [21,35,52,73,96] } row[10] ={ values [2,16,-2,-6,2,12,2,4] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [10,-20,-6,2,6,-8,-16,-10] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [10,16] positions: [56,91] } row[13] ={ values [16,2,18,8,-6,10] positions: [7,17,19,41,82,88] } row[14] ={ values [-8,6] positions: [69,97] } row[15] ={ values [-18,-14] positions: [2,66] } row[16] ={ values [18,14,12,-16] positions: [44,60,75,94] } row[17] ={ values [-6,18,12,-8,-8,-10,-12] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-2,-6] positions: [48,67] } row[19] ={ values [10,-2,-6] positions: [30,97,99] } row[20] ={ values [18,14,-10,10,18,8,-12,4] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [18] positions: [73] } row[22] ={ values [16,-6] positions: [12,72] } row[23] ={ values [2,-12,8] positions: [33,61,97] } row[24] ={ values [-2,16,-14,-12,-4,-20,6] positions: [37,42,43,54,82,84,97] } row[25] ={ values [18,-6,16,-16,-10,18,-12,-20,14] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-2,-18,-8,-6,-10,2] positions: [9,11,25,28,79,94] } row[27] ={ values [-18,6,-2,16,-16] positions: [10,39,47,75,95] } row[28] ={ values [-10] positions: [74] } row[29] ={ values [-16,-2,10,-4] positions: [7,20,74,77] } row[30] ={ values [4,10] positions: [40,61] } row[31] ={ values [8] positions: [65] } row[32] ={ values [12] positions: [32] } row[33] ={ values [-12,16] positions: [11,92] } row[34] ={ values [10,2,2,18,16,-8,-18,-12] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [18,-18,14,6,16] positions: [23,51,64,80,84] } row[36] ={ values [-4,6,4] positions: [14,25,70] } row[37] ={ values [-12,6,-2,-20,-8] positions: [21,29,76,83,97] } row[38] ={ values [-16,-6,-12] positions: [25,42,69] } row[39] ={ values [10,16,-14,-20] positions: [48,74,83,91] } row[40] ={ values [-16,-8,-6,18,-18] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-8,-6] positions: [1,37] } row[43] ={ values [-14,-14,2,18,8] positions: [20,51,78,91,94] } row[44] ={ values [12] positions: [69] } row[45] ={ values [-8,-4,-12,2,-10,10,-12,2] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-16,16] positions: [25,44] } row[47] ={ values [-4,-8,-10,12,6,4,-18,-14,8] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-4,18,18,8] positions: [33,38,40,71] } row[49] ={ values [18] positions: [35] } row[50] ={ values [-14,-12,-16,10,18,6,18,-4,-4] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [8,14,-12,-18,8,-4,8] positions: [15,17,45,61,72,75,96] } row[53] ={ values [4,10] positions: [38,58] } row[54] ={ values [14,-4] positions: [26,94] } row[55] ={ values [-16,18,4,-4] positions: [2,36,60,98] } row[56] ={ values [-8] positions: [19] } row[57] ={ values [14,14,8,-16,18,-2,12,18] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-6,18,12,-14,-16,6,4,10,-12] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-16] positions: [95] } row[60] ={ values [2,-20,12,16,10,12,-20,-10] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [6,10] positions: [10,17] } row[62] ={ values [10,-8,-16,12,-18,-16,6,-16] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [18,6,-16,-8,-20,-20,-20] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-6,-2,18,18] positions: [51,86,88,94] } row[65] ={ values [4,8] positions: [79,92] } row[66] ={ values [14,-10,-8,16] positions: [9,13,19,37] } row[67] ={ values [-6,8,-2,-20,-2] positions: [27,55,66,80,97] } row[68] ={ values [-4,-12] positions: [33,70] } row[69] ={ values [-20] positions: [81] } row[70] ={ values [-2,-10,-4,2] positions: [34,45,53,89] } row[71] ={ values [12,4,-2,12] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-14,-14] positions: [42,72] } row[74] ={ values [-14,-2,-4,14,-20,-10,-12,-6] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [2] positions: [18] } row[78] ={ values [-14,-20,-8,4,18,18] positions: [22,43,51,72,75,83] } row[79] ={ values [-10] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-4,10,4,-18] positions: [51,70,86,87] } row[82] ={ values [4,-16,2] positions: [32,36,41] } row[83] ={ values [16,-16,18,-14,-2,-14,-12] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-4,-18,16,14,-10,14,-4,16] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [4,-14,-8,2,-12,16,-6,-14] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [18,-2,-10,-6] positions: [9,13,54,80] } row[87] ={ values [2,-14,-14] positions: [14,48,83] } row[88] ={ values [-12,2,18,18,-10,-10,-2,18] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-2,-18,2,-4,-4,4,8] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-14,4,12,4] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [8,18,-4] positions: [80,85,87] } row[94] ={ values [-12] positions: [94] } row[95] ={ values [10,-14,-12,-4,10,-16] positions: [20,22,41,51,72,84] } row[96] ={ values [2,-12,-14,-20,-10,10,6,-10,-16] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-20,-20,14,-18,-6,-20,6] positions: [17,20,34,35,41,66,85] } row[98] ={ values [18,-4,-4] positions: [36,59,74] } row[99] ={ values [-4] positions: [43] } row[100] ={ values [-4,10,-12,-14,8,-12,18] positions: [13,35,47,53,58,68,82] } Enter any number after B-=A, A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number after B*=2, B = row[1] ={ values [-20,-8] positions: [40,94] } row[2] ={ values [12,18] positions: [38,56] } row[3] ={ values [10,12,-2,-14,-20,2,-18,12] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [18,2,-2,6,-14] positions: [9,14,37,46,86] } row[5] ={ values [-10,14,-4,4,-8,18] positions: [24,25,40,66,70,83] } row[6] ={ values [-14,12,18,-18] positions: [39,58,65,98] } row[7] ={ values [6,14,12,-12,-4] positions: [22,26,48,84,85] } row[8] ={ values [18,18,4,-20,12] positions: [54,60,61,91,92] } row[9] ={ values [12,-16,10,4,18] positions: [21,35,52,73,96] } row[10] ={ values [2,16,-2,-6,2,12,2,4] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [10,-20,-6,2,6,-8,-16,-10] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [10,16] positions: [56,91] } row[13] ={ values [16,2,18,8,-6,10] positions: [7,17,19,41,82,88] } row[14] ={ values [-8,6] positions: [69,97] } row[15] ={ values [-18,-14] positions: [2,66] } row[16] ={ values [18,14,12,-16] positions: [44,60,75,94] } row[17] ={ values [-6,18,12,-8,-8,-10,-12] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-2,-6] positions: [48,67] } row[19] ={ values [10,-2,-6] positions: [30,97,99] } row[20] ={ values [18,14,-10,10,18,8,-12,4] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [18] positions: [73] } row[22] ={ values [16,-6] positions: [12,72] } row[23] ={ values [2,-12,8] positions: [33,61,97] } row[24] ={ values [-2,16,-14,-12,-4,-20,6] positions: [37,42,43,54,82,84,97] } row[25] ={ values [18,-6,16,-16,-10,18,-12,-20,14] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-2,-18,-8,-6,-10,2] positions: [9,11,25,28,79,94] } row[27] ={ values [-18,6,-2,16,-16] positions: [10,39,47,75,95] } row[28] ={ values [-10] positions: [74] } row[29] ={ values [-16,-2,10,-4] positions: [7,20,74,77] } row[30] ={ values [4,10] positions: [40,61] } row[31] ={ values [8] positions: [65] } row[32] ={ values [12] positions: [32] } row[33] ={ values [-12,16] positions: [11,92] } row[34] ={ values [10,2,2,18,16,-8,-18,-12] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [18,-18,14,6,16] positions: [23,51,64,80,84] } row[36] ={ values [-4,6,4] positions: [14,25,70] } row[37] ={ values [-12,6,-2,-20,-8] positions: [21,29,76,83,97] } row[38] ={ values [-16,-6,-12] positions: [25,42,69] } row[39] ={ values [10,16,-14,-20] positions: [48,74,83,91] } row[40] ={ values [-16,-8,-6,18,-18] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-8,-6] positions: [1,37] } row[43] ={ values [-14,-14,2,18,8] positions: [20,51,78,91,94] } row[44] ={ values [12] positions: [69] } row[45] ={ values [-8,-4,-12,2,-10,10,-12,2] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-16,16] positions: [25,44] } row[47] ={ values [-4,-8,-10,12,6,4,-18,-14,8] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-4,18,18,8] positions: [33,38,40,71] } row[49] ={ values [18] positions: [35] } row[50] ={ values [-14,-12,-16,10,18,6,18,-4,-4] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [8,14,-12,-18,8,-4,8] positions: [15,17,45,61,72,75,96] } row[53] ={ values [4,10] positions: [38,58] } row[54] ={ values [14,-4] positions: [26,94] } row[55] ={ values [-16,18,4,-4] positions: [2,36,60,98] } row[56] ={ values [-8] positions: [19] } row[57] ={ values [14,14,8,-16,18,-2,12,18] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-6,18,12,-14,-16,6,4,10,-12] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-16] positions: [95] } row[60] ={ values [2,-20,12,16,10,12,-20,-10] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [6,10] positions: [10,17] } row[62] ={ values [10,-8,-16,12,-18,-16,6,-16] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [18,6,-16,-8,-20,-20,-20] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-6,-2,18,18] positions: [51,86,88,94] } row[65] ={ values [4,8] positions: [79,92] } row[66] ={ values [14,-10,-8,16] positions: [9,13,19,37] } row[67] ={ values [-6,8,-2,-20,-2] positions: [27,55,66,80,97] } row[68] ={ values [-4,-12] positions: [33,70] } row[69] ={ values [-20] positions: [81] } row[70] ={ values [-2,-10,-4,2] positions: [34,45,53,89] } row[71] ={ values [12,4,-2,12] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-14,-14] positions: [42,72] } row[74] ={ values [-14,-2,-4,14,-20,-10,-12,-6] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [2] positions: [18] } row[78] ={ values [-14,-20,-8,4,18,18] positions: [22,43,51,72,75,83] } row[79] ={ values [-10] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-4,10,4,-18] positions: [51,70,86,87] } row[82] ={ values [4,-16,2] positions: [32,36,41] } row[83] ={ values [16,-16,18,-14,-2,-14,-12] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-4,-18,16,14,-10,14,-4,16] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [4,-14,-8,2,-12,16,-6,-14] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [18,-2,-10,-6] positions: [9,13,54,80] } row[87] ={ values [2,-14,-14] positions: [14,48,83] } row[88] ={ values [-12,2,18,18,-10,-10,-2,18] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-2,-18,2,-4,-4,4,8] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-14,4,12,4] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [8,18,-4] positions: [80,85,87] } row[94] ={ values [-12] positions: [94] } row[95] ={ values [10,-14,-12,-4,10,-16] positions: [20,22,41,51,72,84] } row[96] ={ values [2,-12,-14,-20,-10,10,6,-10,-16] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-20,-20,14,-18,-6,-20,6] positions: [17,20,34,35,41,66,85] } row[98] ={ values [18,-4,-4] positions: [36,59,74] } row[99] ={ values [-4] positions: [43] } row[100] ={ values [-4,10,-12,-14,8,-12,18] positions: [13,35,47,53,58,68,82] } Enter any number after B/=2, B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number A+B=row[1] ={ values [-20,-8] positions: [40,94] } row[2] ={ values [12,18] positions: [38,56] } row[3] ={ values [10,12,-2,-14,-20,2,-18,12] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [18,2,-2,6,-14] positions: [9,14,37,46,86] } row[5] ={ values [-10,14,-4,4,-8,18] positions: [24,25,40,66,70,83] } row[6] ={ values [-14,12,18,-18] positions: [39,58,65,98] } row[7] ={ values [6,14,12,-12,-4] positions: [22,26,48,84,85] } row[8] ={ values [18,18,4,-20,12] positions: [54,60,61,91,92] } row[9] ={ values [12,-16,10,4,18] positions: [21,35,52,73,96] } row[10] ={ values [2,16,-2,-6,2,12,2,4] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [10,-20,-6,2,6,-8,-16,-10] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [10,16] positions: [56,91] } row[13] ={ values [16,2,18,8,-6,10] positions: [7,17,19,41,82,88] } row[14] ={ values [-8,6] positions: [69,97] } row[15] ={ values [-18,-14] positions: [2,66] } row[16] ={ values [18,14,12,-16] positions: [44,60,75,94] } row[17] ={ values [-6,18,12,-8,-8,-10,-12] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-2,-6] positions: [48,67] } row[19] ={ values [10,-2,-6] positions: [30,97,99] } row[20] ={ values [18,14,-10,10,18,8,-12,4] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [18] positions: [73] } row[22] ={ values [16,-6] positions: [12,72] } row[23] ={ values [2,-12,8] positions: [33,61,97] } row[24] ={ values [-2,16,-14,-12,-4,-20,6] positions: [37,42,43,54,82,84,97] } row[25] ={ values [18,-6,16,-16,-10,18,-12,-20,14] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-2,-18,-8,-6,-10,2] positions: [9,11,25,28,79,94] } row[27] ={ values [-18,6,-2,16,-16] positions: [10,39,47,75,95] } row[28] ={ values [-10] positions: [74] } row[29] ={ values [-16,-2,10,-4] positions: [7,20,74,77] } row[30] ={ values [4,10] positions: [40,61] } row[31] ={ values [8] positions: [65] } row[32] ={ values [12] positions: [32] } row[33] ={ values [-12,16] positions: [11,92] } row[34] ={ values [10,2,2,18,16,-8,-18,-12] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [18,-18,14,6,16] positions: [23,51,64,80,84] } row[36] ={ values [-4,6,4] positions: [14,25,70] } row[37] ={ values [-12,6,-2,-20,-8] positions: [21,29,76,83,97] } row[38] ={ values [-16,-6,-12] positions: [25,42,69] } row[39] ={ values [10,16,-14,-20] positions: [48,74,83,91] } row[40] ={ values [-16,-8,-6,18,-18] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-8,-6] positions: [1,37] } row[43] ={ values [-14,-14,2,18,8] positions: [20,51,78,91,94] } row[44] ={ values [12] positions: [69] } row[45] ={ values [-8,-4,-12,2,-10,10,-12,2] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-16,16] positions: [25,44] } row[47] ={ values [-4,-8,-10,12,6,4,-18,-14,8] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-4,18,18,8] positions: [33,38,40,71] } row[49] ={ values [18] positions: [35] } row[50] ={ values [-14,-12,-16,10,18,6,18,-4,-4] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [8,14,-12,-18,8,-4,8] positions: [15,17,45,61,72,75,96] } row[53] ={ values [4,10] positions: [38,58] } row[54] ={ values [14,-4] positions: [26,94] } row[55] ={ values [-16,18,4,-4] positions: [2,36,60,98] } row[56] ={ values [-8] positions: [19] } row[57] ={ values [14,14,8,-16,18,-2,12,18] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-6,18,12,-14,-16,6,4,10,-12] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-16] positions: [95] } row[60] ={ values [2,-20,12,16,10,12,-20,-10] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [6,10] positions: [10,17] } row[62] ={ values [10,-8,-16,12,-18,-16,6,-16] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [18,6,-16,-8,-20,-20,-20] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-6,-2,18,18] positions: [51,86,88,94] } row[65] ={ values [4,8] positions: [79,92] } row[66] ={ values [14,-10,-8,16] positions: [9,13,19,37] } row[67] ={ values [-6,8,-2,-20,-2] positions: [27,55,66,80,97] } row[68] ={ values [-4,-12] positions: [33,70] } row[69] ={ values [-20] positions: [81] } row[70] ={ values [-2,-10,-4,2] positions: [34,45,53,89] } row[71] ={ values [12,4,-2,12] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-14,-14] positions: [42,72] } row[74] ={ values [-14,-2,-4,14,-20,-10,-12,-6] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [2] positions: [18] } row[78] ={ values [-14,-20,-8,4,18,18] positions: [22,43,51,72,75,83] } row[79] ={ values [-10] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-4,10,4,-18] positions: [51,70,86,87] } row[82] ={ values [4,-16,2] positions: [32,36,41] } row[83] ={ values [16,-16,18,-14,-2,-14,-12] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-4,-18,16,14,-10,14,-4,16] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [4,-14,-8,2,-12,16,-6,-14] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [18,-2,-10,-6] positions: [9,13,54,80] } row[87] ={ values [2,-14,-14] positions: [14,48,83] } row[88] ={ values [-12,2,18,18,-10,-10,-2,18] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-2,-18,2,-4,-4,4,8] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-14,4,12,4] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [8,18,-4] positions: [80,85,87] } row[94] ={ values [-12] positions: [94] } row[95] ={ values [10,-14,-12,-4,10,-16] positions: [20,22,41,51,72,84] } row[96] ={ values [2,-12,-14,-20,-10,10,6,-10,-16] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-20,-20,14,-18,-6,-20,6] positions: [17,20,34,35,41,66,85] } row[98] ={ values [18,-4,-4] positions: [36,59,74] } row[99] ={ values [-4] positions: [43] } row[100] ={ values [-4,10,-12,-14,8,-12,18] positions: [13,35,47,53,58,68,82] } Now A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number A-B=row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } row[6] ={ values [] positions: [] } row[7] ={ values [] positions: [] } row[8] ={ values [] positions: [] } row[9] ={ values [] positions: [] } row[10] ={ values [] positions: [] } row[11] ={ values [] positions: [] } row[12] ={ values [] positions: [] } row[13] ={ values [] positions: [] } row[14] ={ values [] positions: [] } row[15] ={ values [] positions: [] } row[16] ={ values [] positions: [] } row[17] ={ values [] positions: [] } row[18] ={ values [] positions: [] } row[19] ={ values [] positions: [] } row[20] ={ values [] positions: [] } row[21] ={ values [] positions: [] } row[22] ={ values [] positions: [] } row[23] ={ values [] positions: [] } row[24] ={ values [] positions: [] } row[25] ={ values [] positions: [] } row[26] ={ values [] positions: [] } row[27] ={ values [] positions: [] } row[28] ={ values [] positions: [] } row[29] ={ values [] positions: [] } row[30] ={ values [] positions: [] } row[31] ={ values [] positions: [] } row[32] ={ values [] positions: [] } row[33] ={ values [] positions: [] } row[34] ={ values [] positions: [] } row[35] ={ values [] positions: [] } row[36] ={ values [] positions: [] } row[37] ={ values [] positions: [] } row[38] ={ values [] positions: [] } row[39] ={ values [] positions: [] } row[40] ={ values [] positions: [] } row[41] ={ values [] positions: [] } row[42] ={ values [] positions: [] } row[43] ={ values [] positions: [] } row[44] ={ values [] positions: [] } row[45] ={ values [] positions: [] } row[46] ={ values [] positions: [] } row[47] ={ values [] positions: [] } row[48] ={ values [] positions: [] } row[49] ={ values [] positions: [] } row[50] ={ values [] positions: [] } row[51] ={ values [] positions: [] } row[52] ={ values [] positions: [] } row[53] ={ values [] positions: [] } row[54] ={ values [] positions: [] } row[55] ={ values [] positions: [] } row[56] ={ values [] positions: [] } row[57] ={ values [] positions: [] } row[58] ={ values [] positions: [] } row[59] ={ values [] positions: [] } row[60] ={ values [] positions: [] } row[61] ={ values [] positions: [] } row[62] ={ values [] positions: [] } row[63] ={ values [] positions: [] } row[64] ={ values [] positions: [] } row[65] ={ values [] positions: [] } row[66] ={ values [] positions: [] } row[67] ={ values [] positions: [] } row[68] ={ values [] positions: [] } row[69] ={ values [] positions: [] } row[70] ={ values [] positions: [] } row[71] ={ values [] positions: [] } row[72] ={ values [] positions: [] } row[73] ={ values [] positions: [] } row[74] ={ values [] positions: [] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [] positions: [] } row[78] ={ values [] positions: [] } row[79] ={ values [] positions: [] } row[80] ={ values [] positions: [] } row[81] ={ values [] positions: [] } row[82] ={ values [] positions: [] } row[83] ={ values [] positions: [] } row[84] ={ values [] positions: [] } row[85] ={ values [] positions: [] } row[86] ={ values [] positions: [] } row[87] ={ values [] positions: [] } row[88] ={ values [] positions: [] } row[89] ={ values [] positions: [] } row[90] ={ values [] positions: [] } row[91] ={ values [] positions: [] } row[92] ={ values [] positions: [] } row[93] ={ values [] positions: [] } row[94] ={ values [] positions: [] } row[95] ={ values [] positions: [] } row[96] ={ values [] positions: [] } row[97] ={ values [] positions: [] } row[98] ={ values [] positions: [] } row[99] ={ values [] positions: [] } row[100] ={ values [] positions: [] } Now A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } test addition of scalar to smat After adding 17 to A it is now: row[1] ={ values [17,-10,-4] positions: [1,40,94] } row[2] ={ values [17,6,9] positions: [2,38,56] } row[3] ={ values [17,5,6,-1,-7,-10,1,-9,6] positions: [3,19,37,45,54,82,84,91,93] } row[4] ={ values [17,9,1,-1,3,-7] positions: [4,9,14,37,46,86] } row[5] ={ values [17,-5,7,-2,2,-4,9] positions: [5,24,25,40,66,70,83] } row[6] ={ values [17,-7,6,9,-9] positions: [6,39,58,65,98] } row[7] ={ values [17,3,7,6,-6,-2] positions: [7,22,26,48,84,85] } row[8] ={ values [17,9,9,2,-10,6] positions: [8,54,60,61,91,92] } row[9] ={ values [17,6,-8,5,2,9] positions: [9,21,35,52,73,96] } row[10] ={ values [17,1,8,-1,-3,1,6,1,2] positions: [10,13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,17,1,3,-4,-8,-5] positions: [2,4,6,11,43,61,88,89,99] } row[12] ={ values [17,5,8] positions: [12,56,91] } row[13] ={ values [8,17,1,9,4,-3,5] positions: [7,13,17,19,41,82,88] } row[14] ={ values [17,-4,3] positions: [14,69,97] } row[15] ={ values [-9,17,-7] positions: [2,15,66] } row[16] ={ values [17,9,7,6,-8] positions: [16,44,60,75,94] } row[17] ={ values [-3,17,9,6,-4,-4,-5,-6] positions: [7,17,23,26,34,50,68,94] } row[18] ={ values [17,-1,-3] positions: [18,48,67] } row[19] ={ values [17,5,-1,-3] positions: [19,30,97,99] } row[20] ={ values [9,7,-5,17,5,9,4,-6,2] positions: [7,9,11,20,24,34,43,46,74] } row[21] ={ values [17,9] positions: [21,73] } row[22] ={ values [8,17,-3] positions: [12,22,72] } row[23] ={ values [17,1,-6,4] positions: [23,33,61,97] } row[24] ={ values [17,-1,8,-7,-6,-2,-10,3] positions: [24,37,42,43,54,82,84,97] } row[25] ={ values [9,-3,17,8,-8,-5,9,-6,-10,7] positions: [11,12,25,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,17,-3,-5,1] positions: [9,11,25,26,28,79,94] } row[27] ={ values [-9,17,3,-1,8,-8] positions: [10,27,39,47,75,95] } row[28] ={ values [17,-5] positions: [28,74] } row[29] ={ values [-8,-1,17,5,-2] positions: [7,20,29,74,77] } row[30] ={ values [17,2,5] positions: [30,40,61] } row[31] ={ values [17,4] positions: [31,65] } row[32] ={ values [23] positions: [32] } row[33] ={ values [-6,17,8] positions: [11,33,92] } row[34] ={ values [5,1,1,17,9,8,-4,-9,-6] positions: [12,31,33,34,76,79,81,91,93] } row[35] ={ values [9,17,-9,7,3,8] positions: [23,35,51,64,80,84] } row[36] ={ values [-2,3,17,2] positions: [14,25,36,70] } row[37] ={ values [-6,3,17,-1,-10,-4] positions: [21,29,37,76,83,97] } row[38] ={ values [-8,17,-3,-6] positions: [25,38,42,69] } row[39] ={ values [17,5,8,-7,-10] positions: [39,48,74,83,91] } row[40] ={ values [-8,-4,-3,17,9,-9] positions: [6,11,25,40,54,59] } row[41] ={ values [17] positions: [41] } row[42] ={ values [-4,-3,17] positions: [1,37,42] } row[43] ={ values [-7,17,-7,1,9,4] positions: [20,43,51,78,91,94] } row[44] ={ values [17,6] positions: [44,69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,17,1] positions: [6,20,21,29,36,39,43,45,59] } row[46] ={ values [-8,8,17] positions: [25,44,46] } row[47] ={ values [-2,-4,-5,6,17,3,2,-9,-7,4] positions: [5,7,9,37,47,50,55,61,63,71] } row[48] ={ values [-2,9,9,17,4] positions: [33,38,40,48,71] } row[49] ={ values [9,17] positions: [35,49] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,17,-2] positions: [5,11,28,32,34,38,40,45,50,80] } row[51] ={ values [17] positions: [51] } row[52] ={ values [4,7,-6,17,-9,4,-2,4] positions: [15,17,45,52,61,72,75,96] } row[53] ={ values [2,17,5] positions: [38,53,58] } row[54] ={ values [7,17,-2] positions: [26,54,94] } row[55] ={ values [-8,9,17,2,-2] positions: [2,36,55,60,98] } row[56] ={ values [-4,17] positions: [19,56] } row[57] ={ values [7,7,4,-8,17,9,-1,6,9] positions: [6,18,32,39,57,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,17,5,-6] positions: [2,16,26,32,39,43,54,58,66,67] } row[59] ={ values [17,-8] positions: [59,95] } row[60] ={ values [1,-10,6,8,17,5,6,-10,-5] positions: [8,17,26,37,60,62,72,75,92] } row[61] ={ values [3,5,17] positions: [10,17,61] } row[62] ={ values [5,-4,-8,6,-9,-8,17,3,-8] positions: [6,14,34,35,49,57,62,66,84] } row[63] ={ values [9,3,-8,13,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,17,-1,9,9] positions: [51,64,86,88,94] } row[65] ={ values [17,2,4] positions: [65,79,92] } row[66] ={ values [7,-5,-4,8,17] positions: [9,13,19,37,66] } row[67] ={ values [-3,4,-1,17,-10,-1] positions: [27,55,66,67,80,97] } row[68] ={ values [-2,17,-6] positions: [33,68,70] } row[69] ={ values [17,-10] positions: [69,81] } row[70] ={ values [-1,-5,-2,17,1] positions: [34,45,53,70,89] } row[71] ={ values [6,2,-1,17,6] positions: [61,64,70,71,88] } row[72] ={ values [17] positions: [72] } row[73] ={ values [-7,-7,17] positions: [42,72,73] } row[74] ={ values [-7,-1,-2,7,7,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [17] positions: [75] } row[76] ={ values [17] positions: [76] } row[77] ={ values [1,17] positions: [18,77] } row[78] ={ values [-7,-10,-4,2,9,17,9] positions: [22,43,51,72,75,78,83] } row[79] ={ values [-5,17] positions: [8,79] } row[80] ={ values [17] positions: [80] } row[81] ={ values [-2,5,17,2,-9] positions: [51,70,81,86,87] } row[82] ={ values [2,-8,1,17] positions: [32,36,41,82] } row[83] ={ values [8,-8,9,-7,-1,-7,17,-6] positions: [15,27,32,48,60,65,83,97] } row[84] ={ values [-2,-9,8,7,-5,17,7,-2,8] positions: [9,12,34,35,38,84,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,17,8,-3,-7] positions: [22,31,39,59,74,85,95,97,99] } row[86] ={ values [9,-1,-5,-3,17] positions: [9,13,54,80,86] } row[87] ={ values [1,-7,-7,17] positions: [14,48,83,87] } row[88] ={ values [-6,1,9,9,-5,-5,-1,17,9] positions: [6,40,47,59,62,73,82,88,91] } row[89] ={ values [-1,-9,1,-2,-2,2,21] positions: [3,10,11,20,22,30,89] } row[90] ={ values [17] positions: [90] } row[91] ={ values [-7,2,6,17,2] positions: [30,44,51,91,99] } row[92] ={ values [17] positions: [92] } row[93] ={ values [4,9,-2,17] positions: [80,85,87,93] } row[94] ={ values [11] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8,17] positions: [20,22,41,51,72,84,95] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8,17] positions: [3,8,13,27,34,41,68,69,70,96] } row[97] ={ values [-10,-10,7,-9,-3,-10,3,17] positions: [17,20,34,35,41,66,85,97] } row[98] ={ values [9,-2,-2,17] positions: [36,59,74,98] } row[99] ={ values [-2,17] positions: [43,99] } row[100] ={ values [-2,5,-6,-7,4,-6,9,17] positions: [13,35,47,53,58,68,82,100] } After subtracting 17 again it is now: row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } scalar addition OK A = 5x5 zero smat: row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } After adding 17 to A it is now: row[1] ={ values [17] positions: [1] } row[2] ={ values [17] positions: [2] } row[3] ={ values [17] positions: [3] } row[4] ={ values [17] positions: [4] } row[5] ={ values [17] positions: [5] } After subtracting 17 again it is now: row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } scalar addition OK test multiplication of smat by matrix enter smat: first row, col and then the rows now enter matrix: first row, col and then the entries the smat is (as a matrix) [[0,-10,-4], [0,6,0], [5,-7,6]] the matrix is [[1,2,3,4], [0,5,6,0], [7,8,9,10]] the product matrix is: [[-28,-82,-96,-40], [0,30,36,0], [47,23,27,80]] Correct Testing transpose function A=(A^t)^t ? yes! enter new value of t test of kernel function enter size of matrix for elimination (row,col) Do you want to input the matrix for elimination or do you want a matrix with random entries? (1 for random and zero otherwise want to determine the rank using matrix? (1 = yes; 0 = no )How many maximum number of non-zero entries per row? enter seed for random number generator calculating matrix, done rank using echmodp : 95 number of non-zero entries: 525 rank is:95 number of non-zero entries: 427 kernel correct enter new value of t eclib-20250122/tests/out_no_ntl/space1.out000066400000000000000000000006121474421343600202650ustar00rootroot00000000000000 Subspace package test program Enter size of square matrix M: Enter entries of M: M = [[1,2,3], [4,5,6], [7,8,9]] Trace(M) = 15 Enter number of times to repeat kernel tests: kernel(m) has basis [[1], [-2], [1]] pivots: [3] denom: 1 Now compute kernel mod p, p = 1073741789 kernel(m) has basis [[1], [-2], [1]] pivots: [3] !!! Agrees with old version !!! Enter size of square matrix M: eclib-20250122/tests/out_no_ntl/space2.out000066400000000000000000000006121474421343600202660ustar00rootroot00000000000000 Subspace package test program Enter size of square matrix M: Enter entries of M: M = [[1,2,3], [4,5,6], [7,8,9]] Trace(M) = 15 Enter number of times to repeat kernel tests: kernel(m) has basis [[1], [-2], [1]] pivots: [3] denom: 1 Now compute kernel mod p, p = 1073741789 kernel(m) has basis [[1], [-2], [1]] pivots: [3] !!! Agrees with old version !!! Enter size of square matrix M: eclib-20250122/tests/out_no_ntl/space3.out000066400000000000000000000006121474421343600202670ustar00rootroot00000000000000 Subspace package test program Enter size of square matrix M: Enter entries of M: M = [[1,2,3], [4,5,6], [7,8,9]] Trace(M) = 15 Enter number of times to repeat kernel tests: kernel(m) has basis [[1], [-2], [1]] pivots: [3] denom: 1 Now compute kernel mod p, p = 1073741789 kernel(m) has basis [[1], [-2], [1]] pivots: [3] !!! Agrees with old version !!! Enter size of square matrix M: eclib-20250122/tests/out_no_ntl/svectest1.out000066400000000000000000000015201474421343600210310ustar00rootroot00000000000000Test run of sparse vector package. Enter n : Uninitialized new vec v = [] Copy of v = [] Enter new entries of v: Dimension = Number of entries = Position: Entry: Position: Entry: Position: Entry: Now v = [(1:2),(3:4),(5:6)] w = [] After w=v, Now v = [(1:2),(3:4),(5:6)] Now w = [(1:2),(3:4),(5:6)] w==v: 1 w!=v: 0 v+w = [(1:4),(3:8),(5:12)] v-w = [] Enter i : After w*=2, w = [(1:4),(3:8),(5:12)] 3*v = [(1:6),(3:12),(5:18)] Now v = [(1:2),(3:4),(5:6)] v+w = [(1:6),(3:12),(5:18)] Now v = [(1:2),(3:4),(5:6)] v-w = [(1:-2),(3:-4),(5:-6)] Now v = [(1:2),(3:4),(5:6)] w/2 = [(1:2),(3:4),(5:6)] Now w = [(1:4),(3:8),(5:12)] -v = [(1:-2),(3:-4),(5:-6)] +v = [(1:2),(3:4),(5:6)] +w = [(1:4),(3:8),(5:12)] 2*v-w = [] Resetting w[1] to 99: w = [(1:99),(3:8),(5:12)] After w-=2*v, w = [(1:95)] v as an ordinary vector = [2,0,4,0,6,0,0,0,0,0] eclib-20250122/tests/out_no_ntl/svectest2.out000066400000000000000000000015201474421343600210320ustar00rootroot00000000000000Test run of sparse vector package. Enter n : Uninitialized new vec v = [] Copy of v = [] Enter new entries of v: Dimension = Number of entries = Position: Entry: Position: Entry: Position: Entry: Now v = [(1:2),(3:4),(5:6)] w = [] After w=v, Now v = [(1:2),(3:4),(5:6)] Now w = [(1:2),(3:4),(5:6)] w==v: 1 w!=v: 0 v+w = [(1:4),(3:8),(5:12)] v-w = [] Enter i : After w*=2, w = [(1:4),(3:8),(5:12)] 3*v = [(1:6),(3:12),(5:18)] Now v = [(1:2),(3:4),(5:6)] v+w = [(1:6),(3:12),(5:18)] Now v = [(1:2),(3:4),(5:6)] v-w = [(1:-2),(3:-4),(5:-6)] Now v = [(1:2),(3:4),(5:6)] w/2 = [(1:2),(3:4),(5:6)] Now w = [(1:4),(3:8),(5:12)] -v = [(1:-2),(3:-4),(5:-6)] +v = [(1:2),(3:4),(5:6)] +w = [(1:4),(3:8),(5:12)] 2*v-w = [] Resetting w[1] to 99: w = [(1:99),(3:8),(5:12)] After w-=2*v, w = [(1:95)] v as an ordinary vector = [2,0,4,0,6,0,0,0,0,0] eclib-20250122/tests/out_no_ntl/svectest3.out000066400000000000000000000015201474421343600210330ustar00rootroot00000000000000Test run of sparse vector package. Enter n : Uninitialized new vec v = [] Copy of v = [] Enter new entries of v: Dimension = Number of entries = Position: Entry: Position: Entry: Position: Entry: Now v = [(1:2),(3:4),(5:6)] w = [] After w=v, Now v = [(1:2),(3:4),(5:6)] Now w = [(1:2),(3:4),(5:6)] w==v: 1 w!=v: 0 v+w = [(1:4),(3:8),(5:12)] v-w = [] Enter i : After w*=2, w = [(1:4),(3:8),(5:12)] 3*v = [(1:6),(3:12),(5:18)] Now v = [(1:2),(3:4),(5:6)] v+w = [(1:6),(3:12),(5:18)] Now v = [(1:2),(3:4),(5:6)] v-w = [(1:-2),(3:-4),(5:-6)] Now v = [(1:2),(3:4),(5:6)] w/2 = [(1:2),(3:4),(5:6)] Now w = [(1:4),(3:8),(5:12)] -v = [(1:-2),(3:-4),(5:-6)] +v = [(1:2),(3:4),(5:6)] +w = [(1:4),(3:8),(5:12)] 2*v-w = [] Resetting w[1] to 99: w = [(1:99),(3:8),(5:12)] After w-=2*v, w = [(1:95)] v as an ordinary vector = [2,0,4,0,6,0,0,0,0,0] eclib-20250122/tests/out_no_ntl/tate.out000066400000000000000000001211271474421343600200530ustar00rootroot00000000000000-------------------------------------------------------------------------------- Integral model: [0,-1,1,-10,-20] Curve [0,-1,1,-10,-20] (reduced minimal model) b2 = -4 b4 = -20 b6 = -79 b8 = -21 c4 = 496 c6 = 20008 disc = -161051 (bad primes: [ 11 ]; # real components = 1) #torsion not yet computed Conductor = 11 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 11 5 1 5 I5 5 -1 -------------------------------------------------------------------------------- Integral model: [1,0,1,4,-6] Curve [1,0,1,4,-6] (reduced minimal model) b2 = 1 b4 = 9 b6 = -23 b8 = -26 c4 = -215 c6 = 5291 disc = -21952 (bad primes: [ 2 7 ]; # real components = 1) #torsion not yet computed Conductor = 14 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 6 1 6 I6 2 1 7 3 1 3 I3 3 -1 -------------------------------------------------------------------------------- Integral model: [1,1,1,-10,-10] Curve [1,1,1,-10,-10] (reduced minimal model) b2 = 5 b4 = -19 b6 = -39 b8 = -139 c4 = 481 c6 = 4879 disc = 50625 (bad primes: [ 3 5 ]; # real components = 2) #torsion not yet computed Conductor = 15 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 4 1 4 I4 2 1 5 4 1 4 I4 4 -1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,-1,-14] Curve [1,-1,1,-1,-14] (reduced minimal model) b2 = -3 b4 = -1 b6 = -55 b8 = 41 c4 = 33 c6 = 12015 disc = -83521 (bad primes: [ 17 ]; # real components = 1) #torsion not yet computed Conductor = 17 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 17 4 1 4 I4 4 -1 -------------------------------------------------------------------------------- Integral model: [0,1,1,-9,-15] Curve [0,1,1,-9,-15] (reduced minimal model) b2 = 4 b4 = -18 b6 = -59 b8 = -140 c4 = 448 c6 = 10088 disc = -6859 (bad primes: [ 19 ]; # real components = 1) #torsion not yet computed Conductor = 19 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 19 3 1 3 I3 3 -1 -------------------------------------------------------------------------------- Integral model: [0,1,0,4,4] Curve [0,1,0,4,4] (reduced minimal model) b2 = 4 b4 = 8 b6 = 16 b8 = 0 c4 = -176 c6 = -2368 disc = -6400 (bad primes: [ 2 5 ]; # real components = 1) #torsion not yet computed Conductor = 20 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 2 0 IV* 3 -1 5 2 1 2 I2 2 1 -------------------------------------------------------------------------------- Integral model: [1,0,0,-4,-1] Curve [1,0,0,-4,-1] (reduced minimal model) b2 = 1 b4 = -8 b6 = -4 b8 = -17 c4 = 193 c6 = 575 disc = 3969 (bad primes: [ 3 7 ]; # real components = 2) #torsion not yet computed Conductor = 21 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 4 1 4 I4 4 -1 7 2 1 2 I2 2 1 -------------------------------------------------------------------------------- Integral model: [0,-1,0,-4,4] Curve [0,-1,0,-4,4] (reduced minimal model) b2 = -4 b4 = -8 b6 = 16 b8 = -32 c4 = 208 c6 = -2240 disc = 2304 (bad primes: [ 2 3 ]; # real components = 2) #torsion not yet computed Conductor = 24 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 3 0 I*1 4 -1 3 2 1 2 I2 2 1 -------------------------------------------------------------------------------- Integral model: [1,0,1,-5,-8] Curve [1,0,1,-5,-8] (reduced minimal model) b2 = 1 b4 = -9 b6 = -31 b8 = -28 c4 = 217 c6 = 6371 disc = -17576 (bad primes: [ 2 13 ]; # real components = 1) #torsion not yet computed Conductor = 26 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 3 1 3 I3 1 1 13 3 1 3 I3 3 -1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,-3,3] Curve [1,-1,1,-3,3] (reduced minimal model) b2 = -3 b4 = -5 b6 = 13 b8 = -16 c4 = 129 c6 = -2241 disc = -1664 (bad primes: [ 2 13 ]; # real components = 1) #torsion not yet computed Conductor = 26 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 7 1 7 I7 7 -1 13 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,0,1,0,-7] Curve [0,0,1,0,-7] (reduced minimal model) b2 = 0 b4 = 0 b6 = -27 b8 = 0 c4 = 0 c6 = 5832 disc = -19683 (bad primes: [ 3 ]; # real components = 1) #torsion not yet computed Conductor = 27 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 9 3 0 IV* 3 -1 -------------------------------------------------------------------------------- Integral model: [1,0,1,1,2] Curve [1,0,1,1,2] (reduced minimal model) b2 = 1 b4 = 3 b6 = 9 b8 = 0 c4 = -71 c6 = -1837 disc = -2160 (bad primes: [ 2 3 5 ]; # real components = 1) #torsion not yet computed Conductor = 30 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 1 4 I4 2 1 3 3 1 3 I3 3 -1 5 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,0,0,4,0] Curve [0,0,0,4,0] (reduced minimal model) b2 = 0 b4 = 8 b6 = 0 b8 = -16 c4 = -192 c6 = 0 disc = -4096 (bad primes: [ 2 ]; # real components = 1) #torsion not yet computed Conductor = 32 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 12 5 0 I*3 4 -1 -------------------------------------------------------------------------------- Integral model: [1,1,0,-11,0] Curve [1,1,0,-11,0] (reduced minimal model) b2 = 5 b4 = -22 b6 = 0 b8 = -121 c4 = 553 c6 = -4085 disc = 88209 (bad primes: [ 3 11 ]; # real components = 2) #torsion not yet computed Conductor = 33 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 6 1 6 I6 2 1 11 2 1 2 I2 2 -1 -------------------------------------------------------------------------------- Integral model: [1,0,0,-3,1] Curve [1,0,0,-3,1] (reduced minimal model) b2 = 1 b4 = -6 b6 = 4 b8 = -8 c4 = 145 c6 = -1081 disc = 1088 (bad primes: [ 2 17 ]; # real components = 2) #torsion not yet computed Conductor = 34 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 6 1 6 I6 6 -1 17 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,1,1,9,1] Curve [0,1,1,9,1] (reduced minimal model) b2 = 4 b4 = 18 b6 = 5 b8 = -76 c4 = -416 c6 = 1448 disc = -42875 (bad primes: [ 5 7 ]; # real components = 1) #torsion not yet computed Conductor = 35 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 5 3 1 3 I3 1 1 7 3 1 3 I3 3 -1 -------------------------------------------------------------------------------- Integral model: [0,0,0,0,1] Curve [0,0,0,0,1] (reduced minimal model) b2 = 0 b4 = 0 b6 = 4 b8 = 0 c4 = 0 c6 = -864 disc = -432 (bad primes: [ 2 3 ]; # real components = 1) #torsion not yet computed Conductor = 36 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 2 0 IV 3 -1 3 3 2 0 III 2 1 -------------------------------------------------------------------------------- Integral model: [0,0,1,-1,0] Curve [0,0,1,-1,0] (reduced minimal model) b2 = 0 b4 = -2 b6 = 1 b8 = -1 c4 = 48 c6 = -216 disc = 37 (bad primes: [ 37 ]; # real components = 2) #torsion not yet computed Conductor = 37 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 37 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,1,1,-23,-50] Curve [0,1,1,-23,-50] (reduced minimal model) b2 = 4 b4 = -46 b6 = -199 b8 = -728 c4 = 1120 c6 = 36296 disc = 50653 (bad primes: [ 37 ]; # real components = 2) #torsion not yet computed Conductor = 37 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 37 3 1 3 I3 3 -1 -------------------------------------------------------------------------------- Integral model: [1,0,1,9,90] Curve [1,0,1,9,90] (reduced minimal model) b2 = 1 b4 = 19 b6 = 361 b8 = 0 c4 = -455 c6 = -77293 disc = -3511808 (bad primes: [ 2 19 ]; # real components = 1) #torsion not yet computed Conductor = 38 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 9 1 9 I9 1 1 19 3 1 3 I3 3 -1 -------------------------------------------------------------------------------- Integral model: [1,1,1,0,1] Curve [1,1,1,0,1] (reduced minimal model) b2 = 5 b4 = 1 b6 = 5 b8 = 6 c4 = 1 c6 = -1025 disc = -608 (bad primes: [ 2 19 ]; # real components = 1) #torsion not yet computed Conductor = 38 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 5 1 5 I5 5 -1 19 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,1,0,-4,-5] Curve [1,1,0,-4,-5] (reduced minimal model) b2 = 5 b4 = -8 b6 = -20 b8 = -41 c4 = 217 c6 = 2755 disc = 1521 (bad primes: [ 3 13 ]; # real components = 2) #torsion not yet computed Conductor = 39 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 2 1 2 I2 2 1 13 2 1 2 I2 2 -1 -------------------------------------------------------------------------------- Integral model: [0,0,0,-7,-6] Curve [0,0,0,-7,-6] (reduced minimal model) b2 = 0 b4 = -14 b6 = -24 b8 = -49 c4 = 336 c6 = 5184 disc = 6400 (bad primes: [ 2 5 ]; # real components = 2) #torsion not yet computed Conductor = 40 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 3 0 I*1 2 1 5 2 1 2 I2 2 -1 -------------------------------------------------------------------------------- Integral model: [1,1,1,-4,5] Curve [1,1,1,-4,5] (reduced minimal model) b2 = 5 b4 = -7 b6 = 21 b8 = 14 c4 = 193 c6 = -5921 disc = -16128 (bad primes: [ 2 3 7 ]; # real components = 1) #torsion not yet computed Conductor = 42 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 1 8 I8 8 -1 3 2 1 2 I2 2 1 7 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,1,1,0,0] Curve [0,1,1,0,0] (reduced minimal model) b2 = 4 b4 = 0 b6 = 1 b8 = 1 c4 = 16 c6 = -280 disc = -43 (bad primes: [ 43 ]; # real components = 1) #torsion not yet computed Conductor = 43 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 43 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,1,0,3,-1] Curve [0,1,0,3,-1] (reduced minimal model) b2 = 4 b4 = 6 b6 = -4 b8 = -13 c4 = -128 c6 = 1664 disc = -2816 (bad primes: [ 2 11 ]; # real components = 1) #torsion not yet computed Conductor = 44 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 2 0 IV* 3 -1 11 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,-1,0,0,-5] Curve [1,-1,0,0,-5] (reduced minimal model) b2 = -3 b4 = 0 b6 = -20 b8 = 15 c4 = 9 c6 = 4347 disc = -10935 (bad primes: [ 3 5 ]; # real components = 1) #torsion not yet computed Conductor = 45 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 7 2 1 I*1 2 -1 5 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,-1,0,-10,-12] Curve [1,-1,0,-10,-12] (reduced minimal model) b2 = -3 b4 = -20 b6 = -48 b8 = -64 c4 = 489 c6 = 12555 disc = -23552 (bad primes: [ 2 23 ]; # real components = 1) #torsion not yet computed Conductor = 46 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 10 1 10 I10 2 1 23 1 1 1 I1 1 -1 -------------------------------------------------------------------------------- Integral model: [0,1,0,-4,-4] Curve [0,1,0,-4,-4] (reduced minimal model) b2 = 4 b4 = -8 b6 = -16 b8 = -32 c4 = 208 c6 = 2240 disc = 2304 (bad primes: [ 2 3 ]; # real components = 2) #torsion not yet computed Conductor = 48 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 4 0 I*0 2 1 3 2 1 2 I2 2 -1 -------------------------------------------------------------------------------- Integral model: [1,-1,0,-2,-1] Curve [1,-1,0,-2,-1] (reduced minimal model) b2 = -3 b4 = -4 b6 = -4 b8 = -1 c4 = 105 c6 = 1323 disc = -343 (bad primes: [ 7 ]; # real components = 1) #torsion not yet computed Conductor = 49 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 7 3 2 0 III 2 -1 -------------------------------------------------------------------------------- Integral model: [1,0,1,-1,-2] Curve [1,0,1,-1,-2] (reduced minimal model) b2 = 1 b4 = -1 b6 = -7 b8 = -2 c4 = 25 c6 = 1475 disc = -1250 (bad primes: [ 2 5 ]; # real components = 1) #torsion not yet computed Conductor = 50 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 1 1 1 I1 1 1 5 4 2 0 IV 3 -1 -------------------------------------------------------------------------------- Integral model: [1,1,1,-3,1] Curve [1,1,1,-3,1] (reduced minimal model) b2 = 5 b4 = -5 b6 = 5 b8 = 0 c4 = 145 c6 = -2105 disc = -800 (bad primes: [ 2 5 ]; # real components = 1) #torsion not yet computed Conductor = 50 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 5 1 5 I5 5 -1 5 2 2 0 II 1 1 -------------------------------------------------------------------------------- Integral model: [0,1,1,1,-1] Curve [0,1,1,1,-1] (reduced minimal model) b2 = 4 b4 = 2 b6 = -3 b8 = -4 c4 = -32 c6 = 872 disc = -459 (bad primes: [ 3 17 ]; # real components = 1) #torsion not yet computed Conductor = 51 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 3 1 3 I3 3 -1 17 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,0,0,1,-10] Curve [0,0,0,1,-10] (reduced minimal model) b2 = 0 b4 = 2 b6 = -40 b8 = -1 c4 = -48 c6 = 8640 disc = -43264 (bad primes: [ 2 13 ]; # real components = 1) #torsion not yet computed Conductor = 52 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 2 0 IV* 1 -1 13 2 1 2 I2 2 1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,0,0] Curve [1,-1,1,0,0] (reduced minimal model) b2 = -3 b4 = 1 b6 = 1 b8 = -1 c4 = -15 c6 = -297 disc = -53 (bad primes: [ 53 ]; # real components = 1) #torsion not yet computed Conductor = 53 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 53 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,-1,0,12,8] Curve [1,-1,0,12,8] (reduced minimal model) b2 = -3 b4 = 24 b6 = 32 b8 = -168 c4 = -567 c6 = -9477 disc = -157464 (bad primes: [ 2 3 ]; # real components = 1) #torsion not yet computed Conductor = 54 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 3 1 3 I3 1 1 3 9 3 0 IV* 3 -1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,1,-1] Curve [1,-1,1,1,-1] (reduced minimal model) b2 = -3 b4 = 3 b6 = -3 b8 = 0 c4 = -63 c6 = 351 disc = -216 (bad primes: [ 2 3 ]; # real components = 1) #torsion not yet computed Conductor = 54 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 3 1 3 I3 3 -1 3 3 3 0 II 1 1 -------------------------------------------------------------------------------- Integral model: [1,-1,0,-4,3] Curve [1,-1,0,-4,3] (reduced minimal model) b2 = -3 b4 = -8 b6 = 12 b8 = -25 c4 = 201 c6 = -1701 disc = 3025 (bad primes: [ 5 11 ]; # real components = 2) #torsion not yet computed Conductor = 55 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 5 2 1 2 I2 2 -1 11 2 1 2 I2 2 1 -------------------------------------------------------------------------------- Integral model: [0,-1,0,0,-4] Curve [0,-1,0,0,-4] (reduced minimal model) b2 = -4 b4 = 0 b6 = -16 b8 = 16 c4 = 16 c6 = 3520 disc = -7168 (bad primes: [ 2 7 ]; # real components = 1) #torsion not yet computed Conductor = 56 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 10 3 0 III* 2 1 7 1 1 1 I1 1 -1 -------------------------------------------------------------------------------- Integral model: [0,0,0,1,2] Curve [0,0,0,1,2] (reduced minimal model) b2 = 0 b4 = 2 b6 = 8 b8 = -1 c4 = -48 c6 = -1728 disc = -1792 (bad primes: [ 2 7 ]; # real components = 1) #torsion not yet computed Conductor = 56 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 3 0 I*1 4 -1 7 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,-1,1,-2,2] Curve [0,-1,1,-2,2] (reduced minimal model) b2 = -4 b4 = -4 b6 = 9 b8 = -13 c4 = 112 c6 = -1304 disc = -171 (bad primes: [ 3 19 ]; # real components = 1) #torsion not yet computed Conductor = 57 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 2 1 2 I2 2 1 19 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,0,1,-7,5] Curve [1,0,1,-7,5] (reduced minimal model) b2 = 1 b4 = -13 b6 = 21 b8 = -37 c4 = 313 c6 = -5005 disc = 3249 (bad primes: [ 3 19 ]; # real components = 2) #torsion not yet computed Conductor = 57 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 2 1 2 I2 2 -1 19 2 1 2 I2 2 1 -------------------------------------------------------------------------------- Integral model: [0,1,1,20,-32] Curve [0,1,1,20,-32] (reduced minimal model) b2 = 4 b4 = 40 b6 = -127 b8 = -527 c4 = -944 c6 = 33128 disc = -1121931 (bad primes: [ 3 19 ]; # real components = 1) #torsion not yet computed Conductor = 57 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 10 1 10 I10 10 -1 19 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,-1,0,-1,1] Curve [1,-1,0,-1,1] (reduced minimal model) b2 = -3 b4 = -2 b6 = 4 b8 = -4 c4 = 57 c6 = -621 disc = -116 (bad primes: [ 2 29 ]; # real components = 1) #torsion not yet computed Conductor = 58 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 2 1 2 I2 2 1 29 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,1,1,5,9] Curve [1,1,1,5,9] (reduced minimal model) b2 = 5 b4 = 11 b6 = 37 b8 = 16 c4 = -239 c6 = -6137 disc = -29696 (bad primes: [ 2 29 ]; # real components = 1) #torsion not yet computed Conductor = 58 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 10 1 10 I10 10 -1 29 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,0,0,-2,1] Curve [1,0,0,-2,1] (reduced minimal model) b2 = 1 b4 = -4 b6 = 4 b8 = -3 c4 = 97 c6 = -1009 disc = -61 (bad primes: [ 61 ]; # real components = 1) #torsion not yet computed Conductor = 61 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 61 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,-1,1] Curve [1,-1,1,-1,1] (reduced minimal model) b2 = -3 b4 = -1 b6 = 5 b8 = -4 c4 = 33 c6 = -945 disc = -496 (bad primes: [ 2 31 ]; # real components = 1) #torsion not yet computed Conductor = 62 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 1 4 I4 4 -1 31 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,-1,0,9,0] Curve [1,-1,0,9,0] (reduced minimal model) b2 = -3 b4 = 18 b6 = 0 b8 = -81 c4 = -423 c6 = -1917 disc = -45927 (bad primes: [ 3 7 ]; # real components = 1) #torsion not yet computed Conductor = 63 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 8 2 2 I*2 2 -1 7 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,0,0,-4,0] Curve [0,0,0,-4,0] (reduced minimal model) b2 = 0 b4 = -8 b6 = 0 b8 = -16 c4 = 192 c6 = 0 disc = 4096 (bad primes: [ 2 ]; # real components = 2) #torsion not yet computed Conductor = 64 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 12 6 0 I*2 4 -1 -------------------------------------------------------------------------------- Integral model: [1,0,0,-1,0] Curve [1,0,0,-1,0] (reduced minimal model) b2 = 1 b4 = -2 b6 = 0 b8 = -1 c4 = 49 c6 = -73 disc = 65 (bad primes: [ 5 13 ]; # real components = 2) #torsion not yet computed Conductor = 65 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 5 1 1 1 I1 1 1 13 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,0,1,-6,4] Curve [1,0,1,-6,4] (reduced minimal model) b2 = 1 b4 = -11 b6 = 17 b8 = -26 c4 = 265 c6 = -4069 disc = 1188 (bad primes: [ 2 3 11 ]; # real components = 2) #torsion not yet computed Conductor = 66 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 2 1 2 I2 2 1 3 3 1 3 I3 3 -1 11 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,1,1,-2,-1] Curve [1,1,1,-2,-1] (reduced minimal model) b2 = 5 b4 = -3 b6 = -3 b8 = -6 c4 = 97 c6 = -17 disc = 528 (bad primes: [ 2 3 11 ]; # real components = 2) #torsion not yet computed Conductor = 66 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 1 4 I4 4 -1 3 1 1 1 I1 1 1 11 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,0,0,-45,81] Curve [1,0,0,-45,81] (reduced minimal model) b2 = 1 b4 = -90 b6 = 324 b8 = -1944 c4 = 2161 c6 = -73225 disc = 2737152 (bad primes: [ 2 3 11 ]; # real components = 2) #torsion not yet computed Conductor = 66 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 10 1 10 I10 10 -1 3 5 1 5 I5 5 -1 11 1 1 1 I1 1 -1 -------------------------------------------------------------------------------- Integral model: [0,1,1,-12,-21] Curve [0,1,1,-12,-21] (reduced minimal model) b2 = 4 b4 = -24 b6 = -83 b8 = -227 c4 = 592 c6 = 14408 disc = -67 (bad primes: [ 67 ]; # real components = 1) #torsion not yet computed Conductor = 67 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 67 1 1 1 I1 1 -1 -------------------------------------------------------------------------------- Integral model: [1,0,1,-1,-1] Curve [1,0,1,-1,-1] (reduced minimal model) b2 = 1 b4 = -1 b6 = -3 b8 = -1 c4 = 25 c6 = 611 disc = -207 (bad primes: [ 3 23 ]; # real components = 1) #torsion not yet computed Conductor = 69 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 2 1 2 I2 2 -1 23 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,2,-3] Curve [1,-1,1,2,-3] (reduced minimal model) b2 = -3 b4 = 5 b6 = -11 b8 = 2 c4 = -111 c6 = 1863 disc = -2800 (bad primes: [ 2 5 7 ]; # real components = 1) #torsion not yet computed Conductor = 70 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 1 4 I4 4 -1 5 2 1 2 I2 2 1 7 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,0,0,6,-7] Curve [0,0,0,6,-7] (reduced minimal model) b2 = 0 b4 = 12 b6 = -28 b8 = -36 c4 = -288 c6 = 6048 disc = -34992 (bad primes: [ 2 3 ]; # real components = 1) #torsion not yet computed Conductor = 72 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 3 0 III 2 1 3 7 2 1 I*1 4 -1 -------------------------------------------------------------------------------- Integral model: [1,-1,0,4,-3] Curve [1,-1,0,4,-3] (reduced minimal model) b2 = -3 b4 = 8 b6 = -12 b8 = -7 c4 = -183 c6 = 1755 disc = -5329 (bad primes: [ 73 ]; # real components = 1) #torsion not yet computed Conductor = 73 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 73 2 1 2 I2 2 -1 -------------------------------------------------------------------------------- Integral model: [0,-1,1,-8,-7] Curve [0,-1,1,-8,-7] (reduced minimal model) b2 = -4 b4 = -16 b6 = -27 b8 = -37 c4 = 400 c6 = 8200 disc = -1875 (bad primes: [ 3 5 ]; # real components = 1) #torsion not yet computed Conductor = 75 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 1 1 1 I1 1 1 5 4 2 0 IV 1 -1 -------------------------------------------------------------------------------- Integral model: [1,0,1,-1,23] Curve [1,0,1,-1,23] (reduced minimal model) b2 = 1 b4 = -1 b6 = 93 b8 = 23 c4 = 25 c6 = -20125 disc = -234375 (bad primes: [ 3 5 ]; # real components = 1) #torsion not yet computed Conductor = 75 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 1 1 1 I1 1 -1 5 7 2 1 I*1 2 1 -------------------------------------------------------------------------------- Integral model: [0,1,1,2,4] Curve [0,1,1,2,4] (reduced minimal model) b2 = 4 b4 = 4 b6 = 17 b8 = 13 c4 = -80 c6 = -3160 disc = -6075 (bad primes: [ 3 5 ]; # real components = 1) #torsion not yet computed Conductor = 75 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 5 1 5 I5 5 -1 5 2 2 0 II 1 1 -------------------------------------------------------------------------------- Integral model: [0,-1,0,-21,-31] Curve [0,-1,0,-21,-31] (reduced minimal model) b2 = -4 b4 = -42 b6 = -124 b8 = -317 c4 = 1024 c6 = 32896 disc = -4864 (bad primes: [ 2 19 ]; # real components = 1) #torsion not yet computed Conductor = 76 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 2 0 IV* 1 -1 19 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,0,1,2,0] Curve [0,0,1,2,0] (reduced minimal model) b2 = 0 b4 = 4 b6 = 1 b8 = -4 c4 = -96 c6 = -216 disc = -539 (bad primes: [ 7 11 ]; # real components = 1) #torsion not yet computed Conductor = 77 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 7 2 1 2 I2 2 1 11 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,1,0,4,11] Curve [1,1,0,4,11] (reduced minimal model) b2 = 5 b4 = 8 b6 = 44 b8 = 39 c4 = -167 c6 = -8189 disc = -41503 (bad primes: [ 7 11 ]; # real components = 1) #torsion not yet computed Conductor = 77 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 7 3 1 3 I3 1 1 11 2 1 2 I2 2 -1 -------------------------------------------------------------------------------- Integral model: [0,1,1,-49,600] Curve [0,1,1,-49,600] (reduced minimal model) b2 = 4 b4 = -98 b6 = 2401 b8 = 0 c4 = 2368 c6 = -532792 disc = -156590819 (bad primes: [ 7 11 ]; # real components = 1) #torsion not yet computed Conductor = 77 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 7 6 1 6 I6 6 -1 11 3 1 3 I3 1 1 -------------------------------------------------------------------------------- Integral model: [1,1,0,-19,685] Curve [1,1,0,-19,685] (reduced minimal model) b2 = 5 b4 = -38 b6 = 2740 b8 = 3064 c4 = 937 c6 = -598805 disc = -207028224 (bad primes: [ 2 3 13 ]; # real components = 1) #torsion not yet computed Conductor = 78 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 16 1 16 I16 2 1 3 5 1 5 I5 1 1 13 1 1 1 I1 1 -1 -------------------------------------------------------------------------------- Integral model: [1,1,1,-2,0] Curve [1,1,1,-2,0] (reduced minimal model) b2 = 5 b4 = -3 b6 = 1 b8 = -1 c4 = 97 c6 = -881 disc = 79 (bad primes: [ 79 ]; # real components = 2) #torsion not yet computed Conductor = 79 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 79 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,0,0,-7,6] Curve [0,0,0,-7,6] (reduced minimal model) b2 = 0 b4 = -14 b6 = 24 b8 = -49 c4 = 336 c6 = -5184 disc = 6400 (bad primes: [ 2 5 ]; # real components = 2) #torsion not yet computed Conductor = 80 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 4 0 I*0 2 1 5 2 1 2 I2 2 -1 -------------------------------------------------------------------------------- Integral model: [0,-1,0,4,-4] Curve [0,-1,0,4,-4] (reduced minimal model) b2 = -4 b4 = 8 b6 = -16 b8 = 0 c4 = -176 c6 = 2368 disc = -6400 (bad primes: [ 2 5 ]; # real components = 1) #torsion not yet computed Conductor = 80 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 4 0 I*0 1 -1 5 2 1 2 I2 2 1 -------------------------------------------------------------------------------- Integral model: [1,0,1,-2,0] Curve [1,0,1,-2,0] (reduced minimal model) b2 = 1 b4 = -3 b6 = 1 b8 = -2 c4 = 73 c6 = -325 disc = 164 (bad primes: [ 2 41 ]; # real components = 2) #torsion not yet computed Conductor = 82 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 2 1 2 I2 2 1 41 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,1,1,1,0] Curve [1,1,1,1,0] (reduced minimal model) b2 = 5 b4 = 3 b6 = 1 b8 = -1 c4 = -47 c6 = 199 disc = -83 (bad primes: [ 83 ]; # real components = 1) #torsion not yet computed Conductor = 83 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 83 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,-1,0,-1,-2] Curve [0,-1,0,-1,-2] (reduced minimal model) b2 = -4 b4 = -2 b6 = -8 b8 = 7 c4 = 64 c6 = 2080 disc = -2352 (bad primes: [ 2 3 7 ]; # real components = 1) #torsion not yet computed Conductor = 84 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 2 0 IV 1 -1 3 1 1 1 I1 1 1 7 2 1 2 I2 2 1 -------------------------------------------------------------------------------- Integral model: [0,1,0,7,0] Curve [0,1,0,7,0] (reduced minimal model) b2 = 4 b4 = 14 b6 = 0 b8 = -49 c4 = -320 c6 = 1952 disc = -21168 (bad primes: [ 2 3 7 ]; # real components = 1) #torsion not yet computed Conductor = 84 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 2 0 IV 3 -1 3 3 1 3 I3 3 -1 7 2 1 2 I2 2 -1 -------------------------------------------------------------------------------- Integral model: [1,1,0,-8,-13] Curve [1,1,0,-8,-13] (reduced minimal model) b2 = 5 b4 = -16 b6 = -52 b8 = -129 c4 = 409 c6 = 8227 disc = 425 (bad primes: [ 5 17 ]; # real components = 2) #torsion not yet computed Conductor = 85 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 5 2 1 2 I2 2 1 17 1 1 1 I1 1 -1 -------------------------------------------------------------------------------- Integral model: [0,0,0,-4,4] Curve [0,0,0,-4,4] (reduced minimal model) b2 = 0 b4 = -8 b6 = 16 b8 = -16 c4 = 192 c6 = -3456 disc = -2816 (bad primes: [ 2 11 ]; # real components = 1) #torsion not yet computed Conductor = 88 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 3 0 I*1 4 1 11 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,1,1,-1,0] Curve [1,1,1,-1,0] (reduced minimal model) b2 = 5 b4 = -1 b6 = 1 b8 = 1 c4 = 49 c6 = -521 disc = -89 (bad primes: [ 89 ]; # real components = 1) #torsion not yet computed Conductor = 89 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 89 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,1,0,4,5] Curve [1,1,0,4,5] (reduced minimal model) b2 = 5 b4 = 8 b6 = 20 b8 = 9 c4 = -167 c6 = -3005 disc = -7921 (bad primes: [ 89 ]; # real components = 1) #torsion not yet computed Conductor = 89 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 89 2 1 2 I2 2 -1 -------------------------------------------------------------------------------- Integral model: [1,-1,0,6,0] Curve [1,-1,0,6,0] (reduced minimal model) b2 = -3 b4 = 12 b6 = 0 b8 = -36 c4 = -279 c6 = -1269 disc = -13500 (bad primes: [ 2 3 5 ]; # real components = 1) #torsion not yet computed Conductor = 90 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 2 1 2 I2 2 1 3 3 2 0 III 2 1 5 3 1 3 I3 3 -1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,-8,11] Curve [1,-1,1,-8,11] (reduced minimal model) b2 = -3 b4 = -15 b6 = 45 b8 = -90 c4 = 369 c6 = -8073 disc = -8640 (bad primes: [ 2 3 5 ]; # real components = 1) #torsion not yet computed Conductor = 90 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 6 1 6 I6 6 -1 3 3 2 0 III 2 1 5 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,13,-61] Curve [1,-1,1,13,-61] (reduced minimal model) b2 = -3 b4 = 27 b6 = -243 b8 = 0 c4 = -639 c6 = 49599 disc = -1574640 (bad primes: [ 2 3 5 ]; # real components = 1) #torsion not yet computed Conductor = 90 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 1 4 I4 4 -1 3 9 2 3 I*3 4 -1 5 1 1 1 I1 1 -1 -------------------------------------------------------------------------------- Integral model: [0,0,1,1,0] Curve [0,0,1,1,0] (reduced minimal model) b2 = 0 b4 = 2 b6 = 1 b8 = -1 c4 = -48 c6 = -216 disc = -91 (bad primes: [ 7 13 ]; # real components = 1) #torsion not yet computed Conductor = 91 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 7 1 1 1 I1 1 1 13 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,1,1,-7,5] Curve [0,1,1,-7,5] (reduced minimal model) b2 = 4 b4 = -14 b6 = 21 b8 = -28 c4 = 352 c6 = -6616 disc = -91 (bad primes: [ 7 13 ]; # real components = 1) #torsion not yet computed Conductor = 91 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 7 1 1 1 I1 1 -1 13 1 1 1 I1 1 -1 -------------------------------------------------------------------------------- Integral model: [0,1,0,2,1] Curve [0,1,0,2,1] (reduced minimal model) b2 = 4 b4 = 4 b6 = 4 b8 = 0 c4 = -80 c6 = -352 disc = -368 (bad primes: [ 2 23 ]; # real components = 1) #torsion not yet computed Conductor = 92 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 2 0 IV 3 -1 23 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,0,0,-1,1] Curve [0,0,0,-1,1] (reduced minimal model) b2 = 0 b4 = -2 b6 = 4 b8 = -1 c4 = 48 c6 = -864 disc = -368 (bad primes: [ 2 23 ]; # real components = 1) #torsion not yet computed Conductor = 92 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 2 0 IV 3 -1 23 1 1 1 I1 1 -1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,0,-1] Curve [1,-1,1,0,-1] (reduced minimal model) b2 = -3 b4 = 1 b6 = -3 b8 = 2 c4 = -15 c6 = 567 disc = -188 (bad primes: [ 2 47 ]; # real components = 1) #torsion not yet computed Conductor = 94 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 2 1 2 I2 2 -1 47 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,1,0,-2,0] Curve [0,1,0,-2,0] (reduced minimal model) b2 = 4 b4 = -4 b6 = 0 b8 = -4 c4 = 112 c6 = -640 disc = 576 (bad primes: [ 2 3 ]; # real components = 2) #torsion not yet computed Conductor = 96 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 6 5 0 III 2 1 3 2 1 2 I2 2 -1 -------------------------------------------------------------------------------- Integral model: [0,-1,0,-2,0] Curve [0,-1,0,-2,0] (reduced minimal model) b2 = -4 b4 = -4 b6 = 0 b8 = -4 c4 = 112 c6 = 640 disc = 576 (bad primes: [ 2 3 ]; # real components = 2) #torsion not yet computed Conductor = 96 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 6 5 0 III 2 -1 3 2 1 2 I2 2 1 -------------------------------------------------------------------------------- Integral model: [1,1,0,-25,-111] Curve [1,1,0,-25,-111] (reduced minimal model) b2 = 5 b4 = -50 b6 = -444 b8 = -1180 c4 = 1225 c6 = 86779 disc = -3294172 (bad primes: [ 2 7 ]; # real components = 1) #torsion not yet computed Conductor = 98 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 2 1 2 I2 2 1 7 7 2 1 I*1 2 -1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,-2,0] Curve [1,-1,1,-2,0] (reduced minimal model) b2 = -3 b4 = -3 b6 = 1 b8 = -3 c4 = 81 c6 = 135 disc = 297 (bad primes: [ 3 11 ]; # real components = 2) #torsion not yet computed Conductor = 99 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 3 2 0 III 2 1 11 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,-1,0,-15,8] Curve [1,-1,0,-15,8] (reduced minimal model) b2 = -3 b4 = -30 b6 = 32 b8 = -249 c4 = 729 c6 = -3645 disc = 216513 (bad primes: [ 3 11 ]; # real components = 2) #torsion not yet computed Conductor = 99 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 9 2 0 III* 2 1 11 1 1 1 I1 1 -1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,-59,186] Curve [1,-1,1,-59,186] (reduced minimal model) b2 = -3 b4 = -117 b6 = 745 b8 = -3981 c4 = 2817 c6 = -148257 disc = 216513 (bad primes: [ 3 11 ]; # real components = 2) #torsion not yet computed Conductor = 99 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 9 2 3 I*3 4 -1 11 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,0,1,-3,-5] Curve [0,0,1,-3,-5] (reduced minimal model) b2 = 0 b4 = -6 b6 = -19 b8 = -9 c4 = 144 c6 = 4104 disc = -8019 (bad primes: [ 3 11 ]; # real components = 1) #torsion not yet computed Conductor = 99 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 6 2 0 I*0 1 -1 11 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,-1,0,-33,62] Curve [0,-1,0,-33,62] (reduced minimal model) b2 = -4 b4 = -66 b6 = 248 b8 = -1337 c4 = 1600 c6 = -44000 disc = 1250000 (bad primes: [ 2 5 ]; # real components = 2) #torsion not yet computed Conductor = 100 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 2 0 IV 1 -1 5 7 2 1 I*1 2 1 -------------------------------------------------------------------------------- Integral model: [0,0,0,-36,0] Curve [0,0,0,-36,0] (reduced minimal model) b2 = 0 b4 = -72 b6 = 0 b8 = -1296 c4 = 1728 c6 = 0 disc = 2985984 (bad primes: [ 2 3 ]; # real components = 2) #torsion not yet computed Conductor = 576 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 12 6 0 I*2 4 -1 3 6 2 0 I*0 4 -1 -------------------------------------------------------------------------------- eclib-20250122/tests/out_no_ntl/tbessel.out000066400000000000000000000001171474421343600205520ustar00rootroot00000000000000Enter x: x = 1.23 K0(x) = 0.305770989597634 K1(x) = 0.414744832850106 Enter x: eclib-20250122/tests/out_no_ntl/tcon2.out000066400000000000000000000000441474421343600201350ustar00rootroot0000000000000030740 11344956855892619 32088063161 eclib-20250122/tests/out_no_ntl/tcurve.out000066400000000000000000000026301474421343600204230ustar00rootroot00000000000000 Enter a curve: The curve is [0,0,1,-7,6] A test of invariants: The curve is [0,0,1,-7,6] b2 = 0 b4 = -14 b6 = 25 b8 = -49 c4 = 336 c6 = -5400 disc = 5077 (# real components = 2) #torsion not yet computed The minimal curve is [0,0,1,-7,6] (reduced minimal model) b2 = 0 b4 = -14 b6 = 25 b8 = -49 c4 = 336 c6 = -5400 disc = 5077 (# real components = 2) #torsion not yet computed A test of Tate's algorithm: [0,0,1,-7,6] (reduced minimal model) b2 = 0 b4 = -14 b6 = 25 b8 = -49 c4 = 336 c6 = -5400 disc = 5077 (bad primes: [ 5077 ]; # real components = 2) #torsion not yet computed Conductor = 5077 Full display: [0,0,1,-7,6] (reduced minimal model) b2 = 0 b4 = -14 b6 = 25 b8 = -49 c4 = 336 c6 = -5400 disc = 5077 (bad primes: [ 5077 ]; # real components = 2) #torsion not yet computed Conductor = 5077 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 5077 1 1 1 I1 1 1 Traces of Frobenius: p=2: ap=-2 p=3: ap=-3 p=5: ap=-4 p=7: ap=-4 p=11: ap=-6 p=13: ap=-4 p=17: ap=-4 p=19: ap=-7 p=23: ap=-6 p=29: ap=-6 p=31: ap=-2 p=37: ap=0 p=41: ap=0 p=43: ap=-8 p=47: ap=-9 p=53: ap=-9 p=59: ap=-11 p=61: ap=-2 p=67: ap=-12 p=71: ap=-8 p=73: ap=-14 p=79: ap=9 p=83: ap=-2 p=89: ap=11 p=97: ap=6 Testing construction from a non-integral model: After scaling down by 60, coeffs are [0,0,1/216000,-7/12960000,1/7776000000] Constructed curve is [0,0,1,-7,6] with scale = 60 eclib-20250122/tests/out_no_ntl/tdivpol.out000066400000000000000000000346021474421343600206000ustar00rootroot00000000000000Curve [0,0,1,-7,6] Division polynomials: Division Poly (2) = [25 -28 0 4] Division Poly (3) = [-49 75 -42 0 3] Division Poly (4) = [61 350 -490 250 -70 0 2] Division Poly (5) = [155774 -406875 380975 -219125 224875 -213150 93525 -10500 -5145 2375 -434 0 5] Division Poly (6) = [-7450597 33433150 -55698846 38175900 2995139 -22858500 16502416 -7083900 3172008 -1401400 336784 0 -17836 4200 -504 0 3] Division Poly (7) = [-18468518451 129897313175 -445857037878 932404235875 -1243400007052 1026876435550 -437452731142 -17749822300 107968849198 -15732678675 -41963963776 32734719500 -10597551734 1215763500 204773548 -134374100 71781619 -28348950 5133611 4900 -144746 24650 -2156 0 7] Division Poly (8) = [-2571419770853 1215506524050 67371048936842 -320148770148050 780063910616298 -1249129857057600 1423544884020198 -1160552647602600 621047252595462 -133390086758000 -94508756302632 102557214742500 -42735421158370 6650264571300 470955582384 859919970900 -1163784258588 520062744600 -101339901340 -2100672000 5910589524 -1768634400 442778784 -97461000 11262114 409500 -266364 31300 -2044 0 4] Division Poly (9) = [184160099143680751 -1745915691101562000 7553596765573730970 -20009912719373528175 37942026581120864697 -60375121456041861525 93410183300843035368 -141970066026214424625 190405429869508518294 -205725048911535979875 170148544422339746088 -101903285497398603750 37479654863464097844 -301195540341584325 -10122360365346701220 7022704801725188100 -2024994639983255253 -378932954398234425 638476088702667243 -278350695029482875 46649147045567535 8235437040258750 -4808056523794875 -19863562351500 413123504333085 -21629335715325 -61645404898854 25482225972000 -4079567512557 -51564996000 145726971768 -34704720000 6686917839 -1118177550 97716879 3647700 -1573194 142650 -7308 0 9] Division Poly (10) = [413009374512445941380 -5577533221799587495650 34236508339578868067654 -126719683386541187863300 312994894498933292419431 -530641300710685283735000 585897029187423197307976 -280834885094634332916300 -367204662156668126267015 1082254486519067947850050 -1554831039561822593605650 1672867489720306188031100 -1511763332284285767508693 1186278164953699558211100 -786873604739812654099112 405920703060332401917500 -130861468159990009717737 -5601080695755881466900 37964990852501696833520 -25524121253263387893600 8897497566342411821410 -784837740659180354300 -925670621559347454588 522167496232044339600 -83452626309791455327 -45657452461518723000 34482142926904321488 -10360740343811041800 1058457111228061160 328746903184114800 -137359646628361520 17449112283988000 -1181088726955137 1434498958414150 -782923178241638 188460706507500 -17341433546593 -2258719474900 951528824400 -162366029100 21994486360 -2572647000 159807824 8131200 -2124444 149000 -6104 0 5] Division Poly (11) = [-54041658613892771450681999 880907080312611332584912000 -7219594509378023629107644470 38958100184313046991444736425 -152640690458238768754008318817 454785460748010763365906132375 -1056137061172539849022036113531 1936054859688651591523350738175 -2810594691494082952472648616520 3208473937931657698860198494875 -2822039231599463382188559156202 1848423918012109590080578699875 -912617258569632579061077286483 560913385968977938523311946800 -817656871503167956435977465356 1249509868334450532408690045625 -1414165966153163021643340433938 1199336430865617781090316458650 -784676191760539643225675692205 396756309706661409373382542875 -144956275362751028758501833067 23355448732213310557101714875 17220044440091899138064455473 -20247521386823417986151910750 11805434554239601412412797599 -4040005394287265921365582350 234083284571165543297755125 642823838857235347992405825 -419159192063093806076371388 127589838582618892736949000 -6470559713355987866471481 -12226425861215930742609000 5613930837990861266425006 -822808169809586975048075 -285218373979309991270589 186775240363627878171825 -38115245033833256003913 -4184634313923610398775 4784966662201425769762 -1316603611701382184125 126856023732928120092 24162795683139180375 -9281076375640161037 1097831192157003150 -100276466219262732 63186211155991825 -25032991453137052 4693816276634100 -310935739698815 -50338154356875 15290737879263 -2102529532125 227429915559 -21041940150 1025882033 51025100 -10176859 580525 -19558 0 11] Multiplication-by-n maps (x coordinate): n = 2: Numerator: [49 -50 14 0 1] Denominator: [25 -28 0 4] n = 3: Numerator: [-1525 -4641 14700 -10473 1050 1470 -600 84 0 1] Denominator: [2401 -7350 9741 -6300 1470 450 -252 0 9] n = 5: Numerator: [11362160425 25747089400 -441542258500 1506059616215 -2610427772875 2620690440081 -1387765627500 -5048462735 622380767750 -514545267425 213273944550 -37895439750 -6392442000 5509239565 -1991083500 805974932 -259821875 26485165 8844500 -2116075 -204050 110250 -13000 700 0 1] Denominator: [24265539076 -126761092500 284239264925 -378286361750 393514275875 -416360781200 421947611075 -340338334000 222184587415 -139925348500 86109315418 -40174487500 9539139565 1483576500 -2055966500 735111700 -102334925 -17456250 11041735 -2166500 136906 23750 -4340 0 25] n = 7: Numerator: [-478965310761451231025 3253200126164286188149 493504842253691880150 -87437670391256256814141 481053400926406685558475 -1474524847437726457036608 3051293047895397342722300 -4507790169717305498341981 4708354723086060377511600 -3031718411072855187719700 100320809977898287428700 2584762647056569539994518 -3803952756150941424717400 3428800794002557340072846 -2220821754300618338952600 1043523046720703474603804 -312300468078508586572175 1442623950439048333404 74652464685011903431000 -62420322870375191780779 32723404759644607191750 -10817148832748217403500 983621853556791774500 1094908222340954435400 -597643354403853229500 85498396077199034566 40785097726864444800 -20343885839157086724 223835554725509900 2681079531989243980 -1026461532749354800 119137846302349868 37877316216756800 -18977605618891227 3304306659173450 8701877287670 -135764897535400 34412538727721 -5354282777900 727182801268 -86238689250 4295207210 519821400 -43847846 -10392900 1754788 -98000 2744 0 1] Denominator: [341086173774927439401 -4798021850215625783850 33341949831200126354581 -150271512229128794144550 486949620236074001282038 -1192396394453621322632800 2261070134715425544591521 -3347375281558187150583900 3842454854008922612126960 -3324943281677884470444750 2010418069392193707136282 -651020404345562013303800 -96608621157166208197954 166151917069487225505300 48699725372809023988580 -178444916497903457931200 144560299534716328862298 -54814088180206102522950 961202166802238932207 8616789704135225396700 -2291677169592145859020 -1813626803872896374350 1838081104627613478024 -798819036672743394000 191378585118824669566 -10013444688503331600 -15500999700626997900 10243440676476617400 -4123480548928793500 1066016998482282000 -119062576319787996 -30000425318197600 19749888363614829 -6463294466493550 1585109901891446 -246150026516100 -2360054651479 12392379246100 -3190374052068 372027946500 61786550 -7553991900 1303637806 -106222200 2621892 345100 -30184 0 49] Testing division of points: P = [0:2:1] 2*P = [245:-32:125], divided by 2 gives back P, OK 3*P = [-74725:-438957:117649], divided by 3 gives back P, OK 5*P = [1769929178043950:4738372533007263:3779940084024824], divided by 5 gives back P, OK 7*P = [-8845779679186810919721876142275:-26132116500093837448172183040908:6299356293743239735763552887851], divided by 7 gives back P, OK 11*P = [-345907035865394112110113258379175841526681422618969349065465631483788171611500:-603899496397932670693901238084339680074376067505653656300679516648438378729902:157828710767928051843902784106074829349824572090398507020120360018086980045999], divided by 11 gives back P, OK 13*P = [4330944971498881477952763040195461194737358561970732874089910688931368534665435456142865934677314444316324525:474166894211156940132146040087902301358254640922900664396468316978550001533595729712356829915629891398826393:4459345156448775844130923624171028485455804112741895938417180204973106756635206294993276819983272953020126899], divided by 13 gives back P, OK P = [1:0:1] 2*P = [14:51:1], divided by 2 gives back P, OK 3*P = [858:3056:2197], divided by 3 gives back P, OK 5*P = [-13422227300:37155830557:12167000000], divided by 5 gives back P, OK 7*P = [-654363158444498413938:323334584599779613133:232135196336821724283], divided by 7 gives back P, OK 11*P = [-5386909266611602426586636855741750187975628118240481:-31903410988726312174342705633718553251007282422752800:8563273080452283301577237101778658433493825993941319], divided by 11 gives back P, OK 13*P = [6790601027182872441717735378318194615000557734419531444518829576329287422:-21346190491686533430108554189028709484678265994449397859310470032693638296:10895308449429756233096859998848382387567744114034063749875541435853032123], divided by 13 gives back P, OK P = [2:0:1] 2*P = [21:-96:1], divided by 2 gives back P, OK 3*P = [17347:11477:6859], divided by 3 gives back P, OK 5*P = [1314368321100:2192807253559:296474109632], divided by 5 gives back P, OK 7*P = [787735371750610845962493:2815013979731975184348416:58266402897702006018621], divided by 7 gives back P, OK 11*P = [465224049592215941888315944477150086362582688911509781121082:-2835041364493288591742476527691666698801289699650164214285000:12520837463201904227545769580855021289721316529527142889041], divided by 11 gives back P, OK 13*P = [967652288848675141165417507105084877050922452157366640667361749659468531276841232963:-2467719925245805762134421012865078764322728240276925184295644784012954762439103997267:137922062795787281492160592505828749775362042044145821626654801172360654848016552211], divided by 13 gives back P, OK P = [3:3:1] 2*P = [742:-552:343], divided by 2 gives back P, OK 3*P = [1735612:-8697671:68921], divided by 3 gives back P, OK 5*P = [13274790938560307650:-3810346189413166609:6816655498982663368], divided by 5 gives back P, OK 7*P = [15610084384521543609511648390658094288:68045384727563741553482631637942786750:797803639727363681600463977477765079], divided by 7 gives back P, OK 11*P = [1575803501107696145915932812044229184495312851311623153876318357968752759104183973347056429397:1396274583140038254949640133020198974959304566276876829967194082976845151053935966087848230097:557829383989248411534035078306591098535924517768571182260197731835239742103251080379853060699], divided by 11 gives back P, OK 13*P = [6161146492714921360750727810183946205467564656490939099032408800798722540272737508766984883606134682101989119243397164919137164312:-35721620630687298226865205673450160556524720425884654664577788075243215491371022249911678723584335179331885213925899777407539593821:183117292199220258281649737393844871119425437622572982949683718143218212229910662967343636339932171621634631574337220088031542071], divided by 13 gives back P, OK P = [-1:-4:1] 2*P = [798:377:343], divided by 2 gives back P, OK 3*P = [4430992:-438330:4330747], divided by 3 gives back P, OK 5*P = [-12221903491172643150:11468039763290751651:4885740073494125000], divided by 5 gives back P, OK 7*P = [17650003281779675566729443347938708188:-192526580513012204672730365490691444763:72980796628288414077404408180857060533], divided by 7 gives back P, OK 11*P = [-30613130525745975806945896359562605604200966296242976777041809153479858248968536822155766662519:-15714745521957622294462788054133735354109125384042241494977265337200555303010618130240791627276:10342901057480405091454441780213283779071882904636290875244915407676321355926935920245292819619], divided by 11 gives back P, OK 13*P = [1405907707042133954154238850941035663903445083801514062880744416997628088406667394648913262927105511332783388554595372344393472664228:-2211226265150483927592113283252013630287688089685314399591313107761425853236835065390795882450722392047791605464694483959070884011570:1600088061666351860094194147994818358340122989198013456481419612192269188713359699781782586135291445838482977423277673449499162776373], divided by 13 gives back P, OK P = [-3:-1:1] 2*P = [406:8180:1], divided by 2 gives back P, OK 3*P = [-198562138:-133849341:68417929], divided by 3 gives back P, OK 5*P = [-868891893753069223266400:-892775925650647678206441:320035512450753499922432], divided by 5 gives back P, OK 7*P = [-250789195524699438713028256143149165935010703462:-351763092836663361098186249071565146814058578612:102208756706176009076316662108042042887248607671], divided by 7 gives back P, OK 11*P = [-5888498972561699214345998647776423563516419612163855732932875428098479096816453556740071283543529303920465099353451197:-13533256227761692733082484218341561251156460176136586962103570474399526108120718796397535148131526130064613929899679999:3291138473665024086163024275753883782780254080619125033356991189541952502966715638923169363573135424125729714408703999], divided by 11 gives back P, OK 13*P = [-471304787040968158056679651141156035898503824031997613220205307381493602197020538234554557851623914285000405516091920163285632114952834039661937557168333773226984038:-1370873330960135587145910098464877803541908169825891341967548989668552498702749973686005785221486327913645312167741302000549449734377969308776534759994492228417393091:330212063553055881533947376167502836269069675579486301004644611488773223934819786676041306852236930427317775633620010841259816717836527910178288832111727833861202679], divided by 13 gives back P, OK P = [4:-7:1] 2*P = [4277:-1045:2197], divided by 2 gives back P, OK 3*P = [173402493:270630132:41781923], divided by 3 gives back P, OK 5*P = [347958005352980994267950:-591491125266464506985649:90144087121871684875000], divided by 5 gives back P, OK 7*P = [28346791926960812679644342662875487909944722853:46007717633420125671884939882166416087274190645:6574733970234508106612925608541549400717628583], divided by 7 gives back P, OK 11*P = [17474145883556647766828376232602106710826303890390986982624317936592550275465510611644786949719563721070184568269144:29480256355813074498457852565032175239305961624890346125612405835647274977712834264461974502384623321822021473979573:3896217090865641720447450673233504443391236048556578877575563503584301366068007409294978657913670393568854035781361], divided by 11 gives back P, OK 13*P = [141214430924449205970890907019814623022662416842585435331280731630294938794541398360467356587791564443343502605886099748817931388768459086946049432514093725256267:-226503185172742643796701194535524557733787205454975272078361208779360866680687110556127834139290657225066635029141642546627353273657327903648741011104842867737892:39145148418716729635148349998510974266838033447983885103993474847107471829372688807853030441396426545342852451854525365130399276623238448918996402000657968479137], divided by 13 gives back P, OK eclib-20250122/tests/out_no_ntl/tegr.out000066400000000000000000000017471474421343600200640ustar00rootroot00000000000000 =============================================================== 1a1 = [0,2429469980725060,0,275130703388172136833647756388,0] 14 points entered:[ [172656371022254:11183605599461162465976:1] [59018983696173167486925:9046770248558568185070809755805:2803221] [-127897562256303:-1568465432141985518043:1] [179104002703038:11530632350958995292984:1] [20351620436417161937099238:15630342741658265676253387896555759:34645976] [6310504541502:1353961721252033023032:1] [-61804347285637731061518:-1206451034261670590274867000456:32461759] [3183756031646993484900:-1445688913020859355673024573444:15625] [109129972974418179597312:-23118208949065563006261517438272:2571353] [7266977526271761:-716978870073714829212603:1] [140613088567692:33055815750694859233124:27] [679895213412287772:-58522059114298646792700636:12167] [11456459729211596549772:983394088087157723809198920329:203297472] [122207436525982205089872:8219252385969460300109469047112:62570773] ] Tamagawa exponent = 8 Index of egr subgroup = 1024 eclib-20250122/tests/out_no_ntl/telog.out000066400000000000000000000022611474421343600202250ustar00rootroot00000000000000Testing some points: The points are P0 = [0:2:1], P1 = [1:0:1], and P2 = [2:0:1] Curve [0,0,1,-7,6] Elliptic log of P is (0.546563,0.740274) Reconstructed P = [0:2:1] OK! Elliptic log of P is (0.903829,0.740274) Reconstructed P = [1:0:1] OK! Elliptic log of P is (1.1472,0) Reconstructed P = [2:0:1] OK! Elliptic log of P is (1.09313,0) Reconstructed P = [245:-32:125] OK! Elliptic log of P is (1.80766,0) Reconstructed P = [14:51:1] OK! Elliptic log of P is (0.218556,0) Reconstructed P = [21:-96:1] OK! Elliptic log of P is (1.45039,0) Reconstructed P = [3:3:1] OK! Elliptic log of P is (1.83247,0.740274) Reconstructed P = [-2:-4:1] OK! Elliptic log of P is (0.600637,0.740274) Reconstructed P = [2:13:8] OK! (m*[0:2:1])/m = [ [0:2:1] ] Checking... [0:2:1] OK (m*[0:2:1])/m = [ [0:2:1] ] Checking... [0:2:1] OK (m*[0:2:1])/m = [ [0:2:1] ] Checking... [0:2:1] OK ================================ Curve [1,1,0,-202,1025] The point Q is = [-8:51:1] Elliptic log of P is (2.15252,0) Reconstructed P = [-8:51:1] The point P3 is = [8:-3:1] Elliptic log of P is (3.40172,0) Reconstructed P = [8:-3:1] (m*[8:-3:1])/m = [ [8:-3:1] ] Checking... [8:-3:1] OK ================================ eclib-20250122/tests/out_no_ntl/tequiv.out000066400000000000000000000031671474421343600204360ustar00rootroot00000000000000Verbose? How many quartics to check (0 to quit)? Enter quartic coefficients a,b,c,d,e ? 1: (1,0,-80,324,-244) new Enter quartic coefficients a,b,c,d,e ? 2: (1,0,-68,236,-96) Checking equivalence of (1,0,-68,236,-96) and (1,0,-80,324,-244) u-poly = [1,0, -306176, -39149568, 8727953408] No integral roots new Enter quartic coefficients a,b,c,d,e ? 3: (1,1,-35,11,190) Checking equivalence of (1,1,-35,11,190) and (1,0,-80,324,-244) u-poly = [1,0, -194816, -4748544, 7849278464] No integral roots Checking equivalence of (1,1,-35,11,190) and (1,0,-68,236,-96) u-poly = [1,0, -176704, -3458816, 6658838528] Root u = -272 equivalent to #2 Enter quartic coefficients a,b,c,d,e ? 4: (1,0,-26,12,233) Checking equivalence of (1,0,-26,12,233) and (1,0,-80,324,-244) equiv failed on first test! First has I=3472, J=-404912, disc=3463112448, type=1 Second has I=3472, J=-404912, disc=3463112448, type=2 Checking equivalence of (1,0,-26,12,233) and (1,0,-68,236,-96) equiv failed on first test! First has I=3472, J=-404912, disc=3463112448, type=1 Second has I=3472, J=-404912, disc=3463112448, type=2 Checking equivalence of (1,0,-26,12,233) and (1,1,-35,11,190) equiv failed on first test! First has I=3472, J=-404912, disc=3463112448, type=1 Second has I=3472, J=-404912, disc=3463112448, type=2 new How many quartics to check (0 to quit)? Enter quartic coefficients a,b,c,d,e ? 1: (11,-11,21,-5,10) new Enter quartic coefficients a,b,c,d,e ? 2: (10,5,21,11,11) Checking equivalence of (10,5,21,11,11) and (11,-11,21,-5,10) u-poly = [1,0, -5334230, -150935400, 6798600758125] Root u = -1705 equivalent to #1 How many quartics to check (0 to quit)? eclib-20250122/tests/out_no_ntl/theight.out000066400000000000000000000041131474421343600205450ustar00rootroot00000000000000Computed 78519 primes, largest is 1000253 Extra primes in list: Curve [1,0,0,-9632000,11505156432] Point [1794:-732:1] has infinite order Local heights: Sum so far = 0 log(den(x(P))) = 0 2: -0.51986 3: 0 5: -1.07296 7: 0 43: 0 Sum so far = -1.59282 R: 2.68536 Sum of local heights: 1.09254 global height of [1794:-732:1] is 1.09254 Curve [0,1,0,-19357973048906456166239827272707359553313344,21187731957757821187375878909257489490487412099497964528006317056] Input curve is not minimal at [ 2 ] Heights will be computed after mapping points to the minimal model [1,0,0,-1209873315556653510389989204544209972082084,331058311839965956052748107957148273288865814054655695750098704] Point [11376724821019368394185473144824:531128848935479591898724774494856605576120:2212245127] has infinite order Local heights: 1303: 14.3448 Sum so far = 14.3448 log(den(x(P))) = 14.3448 2: -0.649825 3: -3.20429 7: -1.94591 13: -2.56495 29: -1.68365 31: -2.57549 43: -1.8806 73: 0 79: -3.27709 83: 0 89: 0 151: 0 199: -2.64665 239: 0 263: 0 601: -6.39859 617: 0 1433: 0 3449: -4.07292 6199: -4.36607 1607849: -7.1452 Sum so far = -28.0664 R: 48.7913 Sum of local heights: 20.725 global height of [11376724821019368394185473144824:531128848935479591898724774494856605576120:2212245127] is 20.725 Testing points on the curve [0,0,1,-7,6] The points are P0 = [0:2:1], P1 = [1:0:1], and P2 = [2:0:1] Their negatives are -P0 = [0:-3:1], -P1 = [1:-1:1], and -P2 = [2:-1:1] Computing their heights: Heights are 0.990906, 0.668205, and 0.767043 The origin is [0:1:0] Now some additions etc,: P0 + P1 = [3:3:1] P0 - P1 = [8:21:1] P0 - P1 - P2 = [93:-143:27] P0.twice() = [245:-32:125] P0 + P0 = [245:-32:125] 3*P0 = [-74725:-438957:117649] P0 - P0 = [0:1:0] P0 +3 P1 - P2 = [816:-23310:1] 2P0 +2 P1 + P2 = [93:896:1] P0 -P1 -P2 = [93:-143:27] with height 3.51888 2 (P0 -P1 -P2) = [936156018:-10370368:469097433] with height 14.0755 The quotient is 4 3 (P0 -P1 -P2) = [141154686087724689336:364929251737439849995:18067866971533021791] with height 31.6699 The quotient is 9 The regulator of P0, P1, P2 is 0.417144 eclib-20250122/tests/out_no_ntl/thilbert.out000066400000000000000000000003131474421343600207240ustar00rootroot00000000000000Enter nonzero a and b: (1234,5678)_p 0 0 2 0 17 1 167 0 617 1 Global symbol = 1 Check (should be 0) = 0 --agrees with single call to global_hilbert() --agrees with solve_conic() Enter nonzero a and b: eclib-20250122/tests/out_no_ntl/threading.out000066400000000000000000000326261474421343600210700ustar00rootroot00000000000000Primes up to 10000 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 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 521 523 541 547 557 563 569 571 577 587 593 599 601 607 613 617 619 631 641 643 647 653 659 661 673 677 683 691 701 709 719 727 733 739 743 751 757 761 769 773 787 797 809 811 821 823 827 829 839 853 857 859 863 877 881 883 887 907 911 919 929 937 941 947 953 967 971 977 983 991 997 1009 1013 1019 1021 1031 1033 1039 1049 1051 1061 1063 1069 1087 1091 1093 1097 1103 1109 1117 1123 1129 1151 1153 1163 1171 1181 1187 1193 1201 1213 1217 1223 1229 1231 1237 1249 1259 1277 1279 1283 1289 1291 1297 1301 1303 1307 1319 1321 1327 1361 1367 1373 1381 1399 1409 1423 1427 1429 1433 1439 1447 1451 1453 1459 1471 1481 1483 1487 1489 1493 1499 1511 1523 1531 1543 1549 1553 1559 1567 1571 1579 1583 1597 1601 1607 1609 1613 1619 1621 1627 1637 1657 1663 1667 1669 1693 1697 1699 1709 1721 1723 1733 1741 1747 1753 1759 1777 1783 1787 1789 1801 1811 1823 1831 1847 1861 1867 1871 1873 1877 1879 1889 1901 1907 1913 1931 1933 1949 1951 1973 1979 1987 1993 1997 1999 2003 2011 2017 2027 2029 2039 2053 2063 2069 2081 2083 2087 2089 2099 2111 2113 2129 2131 2137 2141 2143 2153 2161 2179 2203 2207 2213 2221 2237 2239 2243 2251 2267 2269 2273 2281 2287 2293 2297 2309 2311 2333 2339 2341 2347 2351 2357 2371 2377 2381 2383 2389 2393 2399 2411 2417 2423 2437 2441 2447 2459 2467 2473 2477 2503 2521 2531 2539 2543 2549 2551 2557 2579 2591 2593 2609 2617 2621 2633 2647 2657 2659 2663 2671 2677 2683 2687 2689 2693 2699 2707 2711 2713 2719 2729 2731 2741 2749 2753 2767 2777 2789 2791 2797 2801 2803 2819 2833 2837 2843 2851 2857 2861 2879 2887 2897 2903 2909 2917 2927 2939 2953 2957 2963 2969 2971 2999 3001 3011 3019 3023 3037 3041 3049 3061 3067 3079 3083 3089 3109 3119 3121 3137 3163 3167 3169 3181 3187 3191 3203 3209 3217 3221 3229 3251 3253 3257 3259 3271 3299 3301 3307 3313 3319 3323 3329 3331 3343 3347 3359 3361 3371 3373 3389 3391 3407 3413 3433 3449 3457 3461 3463 3467 3469 3491 3499 3511 3517 3527 3529 3533 3539 3541 3547 3557 3559 3571 3581 3583 3593 3607 3613 3617 3623 3631 3637 3643 3659 3671 3673 3677 3691 3697 3701 3709 3719 3727 3733 3739 3761 3767 3769 3779 3793 3797 3803 3821 3823 3833 3847 3851 3853 3863 3877 3881 3889 3907 3911 3917 3919 3923 3929 3931 3943 3947 3967 3989 4001 4003 4007 4013 4019 4021 4027 4049 4051 4057 4073 4079 4091 4093 4099 4111 4127 4129 4133 4139 4153 4157 4159 4177 4201 4211 4217 4219 4229 4231 4241 4243 4253 4259 4261 4271 4273 4283 4289 4297 4327 4337 4339 4349 4357 4363 4373 4391 4397 4409 4421 4423 4441 4447 4451 4457 4463 4481 4483 4493 4507 4513 4517 4519 4523 4547 4549 4561 4567 4583 4591 4597 4603 4621 4637 4639 4643 4649 4651 4657 4663 4673 4679 4691 4703 4721 4723 4729 4733 4751 4759 4783 4787 4789 4793 4799 4801 4813 4817 4831 4861 4871 4877 4889 4903 4909 4919 4931 4933 4937 4943 4951 4957 4967 4969 4973 4987 4993 4999 5003 5009 5011 5021 5023 5039 5051 5059 5077 5081 5087 5099 5101 5107 5113 5119 5147 5153 5167 5171 5179 5189 5197 5209 5227 5231 5233 5237 5261 5273 5279 5281 5297 5303 5309 5323 5333 5347 5351 5381 5387 5393 5399 5407 5413 5417 5419 5431 5437 5441 5443 5449 5471 5477 5479 5483 5501 5503 5507 5519 5521 5527 5531 5557 5563 5569 5573 5581 5591 5623 5639 5641 5647 5651 5653 5657 5659 5669 5683 5689 5693 5701 5711 5717 5737 5741 5743 5749 5779 5783 5791 5801 5807 5813 5821 5827 5839 5843 5849 5851 5857 5861 5867 5869 5879 5881 5897 5903 5923 5927 5939 5953 5981 5987 6007 6011 6029 6037 6043 6047 6053 6067 6073 6079 6089 6091 6101 6113 6121 6131 6133 6143 6151 6163 6173 6197 6199 6203 6211 6217 6221 6229 6247 6257 6263 6269 6271 6277 6287 6299 6301 6311 6317 6323 6329 6337 6343 6353 6359 6361 6367 6373 6379 6389 6397 6421 6427 6449 6451 6469 6473 6481 6491 6521 6529 6547 6551 6553 6563 6569 6571 6577 6581 6599 6607 6619 6637 6653 6659 6661 6673 6679 6689 6691 6701 6703 6709 6719 6733 6737 6761 6763 6779 6781 6791 6793 6803 6823 6827 6829 6833 6841 6857 6863 6869 6871 6883 6899 6907 6911 6917 6947 6949 6959 6961 6967 6971 6977 6983 6991 6997 7001 7013 7019 7027 7039 7043 7057 7069 7079 7103 7109 7121 7127 7129 7151 7159 7177 7187 7193 7207 7211 7213 7219 7229 7237 7243 7247 7253 7283 7297 7307 7309 7321 7331 7333 7349 7351 7369 7393 7411 7417 7433 7451 7457 7459 7477 7481 7487 7489 7499 7507 7517 7523 7529 7537 7541 7547 7549 7559 7561 7573 7577 7583 7589 7591 7603 7607 7621 7639 7643 7649 7669 7673 7681 7687 7691 7699 7703 7717 7723 7727 7741 7753 7757 7759 7789 7793 7817 7823 7829 7841 7853 7867 7873 7877 7879 7883 7901 7907 7919 7927 7933 7937 7949 7951 7963 7993 8009 8011 8017 8039 8053 8059 8069 8081 8087 8089 8093 8101 8111 8117 8123 8147 8161 8167 8171 8179 8191 8209 8219 8221 8231 8233 8237 8243 8263 8269 8273 8287 8291 8293 8297 8311 8317 8329 8353 8363 8369 8377 8387 8389 8419 8423 8429 8431 8443 8447 8461 8467 8501 8513 8521 8527 8537 8539 8543 8563 8573 8581 8597 8599 8609 8623 8627 8629 8641 8647 8663 8669 8677 8681 8689 8693 8699 8707 8713 8719 8731 8737 8741 8747 8753 8761 8779 8783 8803 8807 8819 8821 8831 8837 8839 8849 8861 8863 8867 8887 8893 8923 8929 8933 8941 8951 8963 8969 8971 8999 9001 9007 9011 9013 9029 9041 9043 9049 9059 9067 9091 9103 9109 9127 9133 9137 9151 9157 9161 9173 9181 9187 9199 9203 9209 9221 9227 9239 9241 9257 9277 9281 9283 9293 9311 9319 9323 9337 9341 9343 9349 9371 9377 9391 9397 9403 9413 9419 9421 9431 9433 9437 9439 9461 9463 9467 9473 9479 9491 9497 9511 9521 9533 9539 9547 9551 9587 9601 9613 9619 9623 9629 9631 9643 9649 9661 9677 9679 9689 9697 9719 9721 9733 9739 9743 9749 9767 9769 9781 9787 9791 9803 9811 9817 9829 9833 9839 9851 9857 9859 9871 9883 9887 9901 9907 9923 9929 9931 9941 9949 9967 9973 Running with 1 threads There are 1229 primes up to 10000 eclib-20250122/tests/out_no_ntl/thtconst.out000066400000000000000000000010711474421343600207570ustar00rootroot00000000000000 Curve [0,0,1,-7,6]: Silverman bound = 6.28483 CPS bound = 0 egr bound = 0 Shift by 1: [0,3,1,-4,0]: CPS bound 2 = 0 Shift by 2 (up by 1): [0,6,1,5,0]: CPS bound = 0.343561 Shift by 0 (down by 1): [0,0,1,-7,6]: CPS bound = 0 No significant improvement (margin of 0.01)! Best shift by 1: Best CPS bound = 0 Overall, CPS is better for 1 curves out of 1 For 100% of curves the new bound is better. Average difference (silverman-cps) = 6.28483 Average difference (silverman-cps2) = 6.28483 Silverman average = 6.28483 CPS 1 average = 0 CPS 2 average = 0 Average offset = 0 eclib-20250122/tests/out_no_ntl/tilll.out000066400000000000000000000014621474421343600202350ustar00rootroot00000000000000Enter size n: Enter vector number 1: Enter vector number 2: Enter vector number 3: Before reduction, vectors are: [1,2,3] [4,5,6] [7,8,8] FIRST METHOD: JC'S implementation of integer LLL from HC's book After reduction, vectors are: [0,0,-1] [-1,1,0] [1,2,0] Square length of vector 1 is 1 Square length of vector 2 is 2 Square length of vector 3 is 5 Candidates for shortest vectors: (1,1,1): [0,3,-1], norm = 10 (1,1,0): [-1,1,-1], norm = 3 (1,1,-1): [-2,-1,-1], norm = 6 (1,0,1): [1,2,-1], norm = 6 (1,0,0): [0,0,-1], norm = 1 (1,0,-1): [-1,-2,-1], norm = 6 (1,-1,1): [2,1,-1], norm = 6 (1,-1,0): [1,-1,-1], norm = 3 (1,-1,-1): [0,-3,-1], norm = 10 (0,1,1): [0,3,0], norm = 9 (0,1,0): [-1,1,0], norm = 2 (0,1,-1): [-2,-1,0], norm = 5 (0,0,1): [1,2,0], norm = 5 The shortest vector is [0,0,-1] with square length 1 eclib-20250122/tests/out_no_ntl/timing.out000066400000000000000000000001671474421343600204050ustar00rootroot00000000000000Verbose (0/1): Program timing - demonstration and testing. How many subtimers? Start default timer Stopping all timers eclib-20250122/tests/out_no_ntl/tlatconst.out000066400000000000000000000016121474421343600211250ustar00rootroot00000000000000Table of Gamma values --------------------- n Gamma(n) Gamma(n+1/2) 1 1 0.886227 2 1 1.32934 3 2 3.32335 4 6 11.6317 5 24 52.3428 6 120 287.885 7 720 1871.25 8 5040 14034.4 9 40320 119292 10 362880 1.13328e+06 11 3.6288e+06 1.18994e+07 12 3.99168e+07 1.36843e+08 13 4.79002e+08 1.71054e+09 14 6.22702e+09 2.30923e+10 15 8.71783e+10 3.34839e+11 16 1.30767e+12 2.22909e+22 17 2.09228e+13 3.67799e+23 18 3.55687e+14 6.43649e+24 19 6.40237e+15 1.19075e+26 20 1.21645e+17 2.32196e+27 Table of Lattice constants -------------------------- n gamma_n gamma_n^n 1 1 1 2 1.1547 1.33333 3 1.25992 2 4 1.41421 4 5 1.51572 8 6 1.66537 21.3333 7 1.81145 64 8 2 256 9 2.24065 1423.51 10 2.37327 5668.47 11 2.50503 24375.1 12 2.63604 112570 13 2.76637 555686 14 2.89609 2.91986e+06 15 3.02525 1.62715e+07 16 3.15392 9.58535e+07 17 3.28212 5.95162e+08 18 3.40991 3.8848e+09 19 3.5373 2.65934e+10 20 3.66434 1.90508e+11 eclib-20250122/tests/out_no_ntl/tlegcert.out000066400000000000000000000003531474421343600207240ustar00rootroot00000000000000Solving ax^2 + by^2 + cz^2 = 0 Using method 4 Enter coefficients a b c: 10000000019 10000000033 -10000010639 Enter certificate k1 k2 k3: Solution: (x:y:z) = (16081092938:20311652644:-25906834446) --OK Enter coefficients a b c: 0 0 0 eclib-20250122/tests/out_no_ntl/tmanin.out000066400000000000000000000004041474421343600203760ustar00rootroot00000000000000Program tmanin. Using METHOD = 2 to find newforms MODULUS for linear algebra = 1073741789 Verbose output? How many primes for Hecke eigenvalues? Output Hecke eigenvalues to file? (0/1) Sign? (-1/0/1) Enter first and last N: >>>Level 90: 3 newform(s) found. eclib-20250122/tests/out_no_ntl/tmrank-short.out000066400000000000000000000015721474421343600215500ustar00rootroot00000000000000Curve [0,1,1,-2,0] : Rank = 2 Curve [1,0,0,0,1] : Rank = 2 Curve [1,-1,0,-4,4] : Rank = 2 Curve [0,0,1,-7,6] : Rank = 3 Curve [0,0,1,-1,6] : Rank = 3 Curve [0,0,1,-49,132] : Rank = 3 Curve [0,1,1,-72,210] : Rank = 4 Curve [0,0,1,-7,36] : Rank = 4 Curve [1,0,0,-202,1089] : Rank = 4 Curve [0,0,1,-79,342] : Rank = 5 Curve [0,0,1,-169,930] : Rank = 5 Curve [0,1,1,-30,390] : Rank = 5 Curve [0,0,1,-547,-2934] : Rank = 6 Curve [0,0,0,-9907,306370] : Rank = 6 Curve [0,0,1,-277,4566] : Rank = 6 Curve [0,0,0,-9217,300985] : Rank = 7 Curve [0,1,0,-5945,583879] : Rank = 7 Curve [0,0,0,-9217,300985] : Rank = 7 Curve [0,0,0,-6544,7375129] : Rank = 8 Curve [0,1,0,9910,9815689] : Rank = 8 Curve [0,0,0,-6112,12325825] : Rank = 8 Curve [1,0,1,34318214642441646362435632562579908747,3184376895814127197244886284686214848599453811643486936756] : Rank = 15 eclib-20250122/tests/out_no_ntl/tmrank.out000066400000000000000000000016401474421343600204070ustar00rootroot00000000000000Curve [0,1,1,-2,0] : Rank = 2 Curve [1,0,0,0,1] : Rank = 2 Curve [1,-1,0,-4,4] : Rank = 2 Curve [0,0,1,-7,6] : Rank = 3 Curve [0,0,1,-1,6] : Rank = 3 Curve [0,0,1,-49,132] : Rank = 3 Curve [0,1,1,-72,210] : Rank = 4 Curve [0,0,1,-7,36] : Rank = 4 Curve [1,0,0,-202,1089] : Rank = 4 Curve [0,0,1,-79,342] : Rank = 5 Curve [0,0,1,-169,930] : Rank = 5 Curve [0,1,1,-30,390] : Rank = 5 Curve [0,0,1,-547,-2934] : Rank = 6 Curve [0,0,0,-9907,306370] : Rank = 6 Curve [0,0,1,-277,4566] : Rank = 6 Curve [0,0,0,-9217,300985] : Rank = 7 Curve [0,1,0,-5945,583879] : Rank = 7 Curve [0,0,0,-9217,300985] : Rank = 7 Curve [0,0,0,-6544,7375129] : Rank = 8 Curve [0,1,0,9910,9815689] : Rank = 8 Curve [0,0,0,-6112,12325825] : Rank = 8 Curve [1,0,1,34318214642441646362435632562579908747,3184376895814127197244886284686214848599453811643486936756] : Rank = 15 Curve [0,0,0,-532,-4374] : Rank = 1 eclib-20250122/tests/out_no_ntl/tnfd.out000066400000000000000000000103061474421343600200450ustar00rootroot00000000000000Program tnfd. MODULUS for linear algebra = 1073741789 Verbose output? (0/1) Enter level: >>>Level 97 dimension = 8 Split into W-eigenspaces (0/1)? Multiplicity 1 eigenspaces only? (0/1)? Use just one T_p (1) or a linear combination (0)? Computing T_p for p = 2...done. char poly = [-3 28 -54 -54 47 22 -13 -2 1] NTL char poly square-free factors = [[[-3 28 -54 -54 47 22 -13 -2 1] 1]] Factors of multiplicity 1 are: 1: [-3 1] (degree 1) 2: [-1 3 4 1] (degree 3) 3: [-1 6 -1 -3 1] (degree 4) Enter factor number: Degree = 4 (unscaled) min poly = [1 -3 -1 6 -1 ] (rescaled) min poly = [-1 6 -1 -3 1] finished constructing S, now restricting T_p to S done. now combining S and SW 4*Matrix of T(2) restricted to S is [-4,8,4,0;0,4,0,8;-4,4,8,-4;-4,8,4,4] The former poly is the min poly of alpha_1 = 4*alpha The latter is the min poly of alpha, which is the eigenvalue of T(2) Finished computing (dual) subspace S S has denom 4, cumulative denom = 4 W = [1,-4,0,-256;0,8,16,512;0,4,16,320;0,0,48,256] W^(-1)= (1/128)*[128,-64,256,-64;0,176,-320,48;0,16,-32,8;0,-3,6,-1] Basis for Hecke eigenvalues, in terms of powers of alpha: (1/8)*[2,0,0,0] (1/8)*[-1,11,4,-3] (1/8)*[4,-20,-8,6] (1/8)*[-1,3,2,-1] Number of ap? 4*Matrix of T(2) = [-4,8,4,0;0,4,0,8;-4,4,8,-4;-4,8,4,4] char poly = [ -1 6 -1 -3 1 ] a_2 = [0,4,0,8] 4*Matrix of T(3) = [4,4,0,-12;8,-8,-8,-8;-4,8,8,0;0,-4,-4,-4] char poly = [ 4 -1 -5 0 1 ] a_3 = [8,-8,-8,-8] 4*Matrix of T(5) = [8,-8,-4,0;0,0,0,-8;4,-4,-4,4;4,-8,-4,0] char poly = [ 2 1 -4 -1 1 ] a_5 = [0,0,0,-8] 4*Matrix of T(7) = [8,-4,0,4;-8,16,16,0;12,-16,-20,0;0,0,4,8] char poly = [ -16 23 -6 -3 1 ] a_7 = [-8,16,16,0] 4*Matrix of T(11) = [8,-24,-12,16;0,-8,-16,-8;-4,4,20,12;12,-16,-12,0] char poly = [ 92 47 -14 -5 1 ] a_11 = [0,-8,-16,-8] 4*Matrix of T(13) = [-4,-16,-12,0;16,-40,-40,-16;-20,28,40,12;12,-20,-20,-20] char poly = [ -122 -167 -29 6 1 ] a_13 = [16,-40,-40,-16] 4*Matrix of T(17) = [-4,20,12,-4;-8,24,24,16;8,-12,-20,-12;-12,20,16,12] char poly = [ 74 15 -20 -3 1 ] a_17 = [-8,24,24,16] 4*Matrix of T(19) = [-12,0,0,8;0,-8,-8,8;-8,8,12,0;0,4,0,-4] char poly = [ 4 -11 -5 3 1 ] a_19 = [0,-8,-8,8] 4*Matrix of T(23) = [12,-16,-4,32;-16,32,8,16;4,-12,16,4;4,4,4,28] char poly = [ -368 -265 151 -22 1 ] a_23 = [-16,32,8,16] 4*Matrix of T(29) = [-12,32,16,-8;0,16,8,24;-8,8,12,-16;-16,28,16,12] char poly = [ -254 199 -27 -7 1 ] a_29 = [0,16,8,24] 4*Matrix of T(31) = [-8,44,20,-36;8,8,16,8;0,4,-16,-20;-20,24,16,0] char poly = [ 592 -79 -67 4 1 ] a_31 = [8,8,16,8] 4*Matrix of T(37) = [-12,-24,-12,24;0,-24,-24,0;-12,12,24,12;12,-12,-12,-12] char poly = [ 162 -81 -27 6 1 ] a_37 = [0,-24,-24,0] 4*Matrix of T(41) = [48,-12,-8,-36;8,8,16,-48;28,-24,-44,8;8,-32,-12,0] char poly = [ 5506 131 -158 -3 1 ] a_41 = [8,8,16,-48] 4*Matrix of T(43) = [20,-4,-4,-12;8,0,-8,-16;0,4,12,4;4,-12,-8,4] char poly = [ -44 9 20 -9 1 ] a_43 = [8,0,-8,-16] 4*Matrix of T(47) = [36,8,0,-32;16,8,-8,-24;0,8,20,0;0,-12,-8,12] char poly = [ 16 -161 99 -19 1 ] a_47 = [16,8,-8,-24] 4*Matrix of T(53) = [-4,24,4,-40;32,-40,-40,-16;-28,44,48,-4;-4,-4,-12,-20] char poly = [ 1262 -123 -75 4 1 ] a_53 = [32,-40,-40,-16] 4*Matrix of T(59) = [-8,24,4,-32;32,-40,-48,-8;-36,52,68,-4;-4,0,-12,-16] char poly = [ 772 3 -98 -1 1 ] a_59 = [32,-40,-48,-8] 4*Matrix of T(61) = [12,28,12,-44;8,8,24,-16;16,-12,-44,-12;-12,4,8,-4] char poly = [ -1046 -627 -74 7 1 ] a_61 = [8,8,24,-16] 4*Matrix of T(67) = [-32,12,16,36;-40,48,64,48;28,-48,-76,-16;-16,40,36,16] char poly = [ -1604 -1069 -86 11 1 ] a_67 = [-40,48,64,48] 4*Matrix of T(71) = [0,28,8,-28;24,-16,-32,0;-28,40,60,-8;-8,8,-4,0] char poly = [ -656 413 -24 -11 1 ] a_71 = [24,-16,-32,0] 4*Matrix of T(73) = [-40,12,16,36;-40,40,64,48;28,-48,-84,-16;-16,40,36,8] char poly = [ -3982 -1249 4 19 1 ] a_73 = [-40,40,64,48] 4*Matrix of T(79) = [-12,16,-4,-48;48,-80,-72,-32;-44,68,72,4;4,-20,-28,-44] char poly = [ 1952 -1303 -73 16 1 ] a_79 = [48,-80,-72,-32] 4*Matrix of T(83) = [-24,64,32,-16;0,32,16,48;-16,16,24,-32;-32,56,32,24] char poly = [ -4064 1592 -108 -14 1 ] a_83 = [0,32,16,48] 4*Matrix of T(89) = [-16,-44,-12,52;-40,16,48,8;40,-60,-96,12;12,-8,8,-8] char poly = [ -5762 -1449 91 26 1 ] a_89 = [-40,16,48,8] 4*Matrix of W(97) = [-4,0,0,0;0,-4,0,0;0,0,-4,0;0,0,0,-4] char poly = [ 1 4 6 4 1 ] w_97 = [0,0,0,0] Enter level: eclib-20250122/tests/out_no_ntl/torsion.out000066400000000000000000000075501474421343600206160ustar00rootroot00000000000000Curve [0,0,0,1,1] has 1 torsion point(s) [0:1:0] (order 1) Cyclic: C1 Curve [0,1,1,101470,57781877] has 1 torsion point(s) [0:1:0] (order 1) Cyclic: C1 Curve [0,0,0,1,0] has 2 torsion point(s) [0:1:0] (order 1) [0:0:1] (order 2) Cyclic: C2 Curve [0,0,0,0,100] has 3 torsion point(s) [0:1:0] (order 1) [0:-10:1] (order 3) [0:10:1] (order 3) Cyclic: C3 Curve [0,0,0,1,2] has 4 torsion point(s) [0:1:0] (order 1) [-1:0:1] (order 2) [1:-2:1] (order 4) [1:2:1] (order 4) Cyclic: C4 Curve [0,0,0,-1,0] has 4 torsion point(s) [0:1:0] (order 1) [-1:0:1] (order 2) [0:0:1] (order 2) [1:0:1] (order 2) Non-cyclic: C2 x C2 Curve [0,-1,1,0,0] has 5 torsion point(s) [0:1:0] (order 1) [0:-1:1] (order 5) [0:0:1] (order 5) [1:-1:1] (order 5) [1:0:1] (order 5) Cyclic: C5 Curve [0,0,0,0,1] has 6 torsion point(s) [0:1:0] (order 1) [-1:0:1] (order 2) [0:-1:1] (order 3) [0:1:1] (order 3) [2:-3:1] (order 6) [2:3:1] (order 6) Cyclic: C6 Curve [1,-1,1,-3,3] has 7 torsion point(s) [0:1:0] (order 1) [-1:-2:1] (order 7) [-1:2:1] (order 7) [1:-2:1] (order 7) [1:0:1] (order 7) [3:-6:1] (order 7) [3:2:1] (order 7) Cyclic: C7 Curve [0,1,0,-14624,669300] has 8 torsion point(s) [0:1:0] (order 1) [75:0:1] (order 2) [124:-882:1] (order 4) [124:882:1] (order 4) [82:-168:1] (order 8) [82:168:1] (order 8) [418:-8232:1] (order 8) [418:8232:1] (order 8) Cyclic: C8 Curve [0,1,0,-160,308] has 8 torsion point(s) [0:1:0] (order 1) [-14:0:1] (order 2) [2:0:1] (order 2) [11:0:1] (order 2) [-4:-30:1] (order 4) [-4:30:1] (order 4) [26:-120:1] (order 4) [26:120:1] (order 4) Non-cyclic: C2 x C4 Curve [1,-1,1,-14,29] has 9 torsion point(s) [0:1:0] (order 1) [1:-5:1] (order 3) [1:3:1] (order 3) [-3:-5:1] (order 9) [-3:7:1] (order 9) [3:-5:1] (order 9) [3:1:1] (order 9) [9:-29:1] (order 9) [9:19:1] (order 9) Cyclic: C9 Curve [1,0,0,115,561] has 10 torsion point(s) [0:1:0] (order 1) [-34:17:8] (order 2) [-2:-17:1] (order 5) [-2:19:1] (order 5) [16:-89:1] (order 5) [16:73:1] (order 5) [4:-35:1] (order 10) [4:31:1] (order 10) [70:-629:1] (order 10) [70:559:1] (order 10) Cyclic: C10 Curve [1,0,1,-19,26] has 12 torsion point(s) [0:1:0] (order 1) [-5:2:1] (order 2) [3:-2:1] (order 2) [14:-11:8] (order 2) [4:-7:1] (order 3) [4:2:1] (order 3) [-2:-7:1] (order 6) [-2:8:1] (order 6) [1:-4:1] (order 6) [1:2:1] (order 6) [13:-52:1] (order 6) [13:38:1] (order 6) Non-cyclic: C2 x C6 Curve [1,0,0,-1070,7812] has 16 torsion point(s) [0:1:0] (order 1) [-36:18:1] (order 2) [28:-14:1] (order 2) [62:-31:8] (order 2) [-8:-122:1] (order 4) [-8:130:1] (order 4) [64:-482:1] (order 4) [64:418:1] (order 4) [-26:-122:1] (order 8) [-26:148:1] (order 8) [4:-62:1] (order 8) [4:58:1] (order 8) [34:-122:1] (order 8) [34:88:1] (order 8) [244:-3902:1] (order 8) [244:3658:1] (order 8) Non-cyclic: C2 x C8 Curve [1,0,0,-372368141774940800,87459461608665181808640000] has 16 torsion point(s) [0:1:0] (order 1) [352179456:-176089728:1] (order 2) [352441600:-176220800:1] (order 2) [-5636968450:2818484225:8] (order 2) [335795200:-532861020800:1] (order 4) [335795200:532525225600:1] (order 4) [369088000:-549923580800:1] (order 4) [369088000:549554492800:1] (order 4) [117433600:-6734330460800:1] (order 8) [117433600:6734213027200:1] (order 8) [351262480:-33963904400:1] (order 8) [351262480:33612641920:1] (order 8) [353359600:-34032060800:1] (order 8) [353359600:33678701200:1] (order 8) [654296320:-11132578294400:1] (order 8) [654296320:11131923998080:1] (order 8) Non-cyclic: C2 x C8 Curve [0,0,0,-4/9,0] has 4 torsion point(s) [0:1:0] (order 1) [-2:0:3] (order 2) [0:0:1] (order 2) [2:0:3] (order 2) Non-cyclic: C2 x C2 Curve [1,0,0,-24518104183430,46728128863872512100] has 8 torsion point(s) [0:1:0] (order 1) [2859436:-1429718:1] (order 2) [2964412:-312683558:1] (order 4) [2964412:309719146:1] (order 4) [2864620:-18396950:1] (order 8) [2864620:15532330:1] (order 8) [4985200:-6959055290:1] (order 8) [4985200:6954070090:1] (order 8) Cyclic: C8 eclib-20250122/tests/out_no_ntl/tp2points.out000066400000000000000000000007671474421343600210660ustar00rootroot00000000000000Test program for P2Point class Point input formats are [x:y:z], [x,y], [x/z,y/z] with any type of brackets Enter a point P: P=[78:1292:221] output_pari(P) = [6/17,76/13] P==P? 1 After P=P2Point(2,4,-6), P=[-1:-2:3] After Q=P, Q=[-1:-2:3] After Q=transform(P,3,4,5,6,0), Q=[-13:15:27] After R=transform(Q,3,4,5,6,1), R=[-1:-2:3] R==P? 1 Projective coordinates of P are X=-1, Y=-2, Z=3 Affine coordinates of P are X=-1/3, Y=-2/3 Real affine coordinates of P are X=-0.333333, Y=-0.666667 P.isintegral()? 0 eclib-20250122/tests/out_no_ntl/tperiods.out000066400000000000000000000006541474421343600207500ustar00rootroot00000000000000Input curve = [0,0,1,-7,6]: Minimal model = [0,0,1,-7,6] Periods: [w_1,w_2] = [(-0,-1.48055),(2.07584,0)] tau = (-0,1.40208) (abs(tau)=1.40208) w_R = (2.07584,0) w_I = (0,1.48055) Curve from periods: [0,0,1,-7,6] Input curve = [0,0,0,-16/9,0]: Minimal model = [0,0,0,-9,0] Periods: [w_1,w_2] = [(1.51385,0),(0,1.51385)] tau = (0,1) (abs(tau)=1) w_R = (1.51385,0) w_I = (0,1.51385) Curve from periods: [0,0,0,-9,0] eclib-20250122/tests/out_no_ntl/tpoints.out000066400000000000000000000307101474421343600206130ustar00rootroot00000000000000Computed 78519 primes, largest is 1000253 Extra primes in list: Testing some points: The points are P0 = [0:2:1], P1 = [1:0:1], and P2 = [2:0:1] Now in Pari format: The points are P0 = [0,2], P1 = [1,0], and P2 = [2,0] Their negatives are -P0 = [0:-3:1], -P1 = [1:-1:1], and -P2 = [2:-1:1] Computing their heights: Heights are 0.99090633315309, 0.66820516565193, and 0.76704335533155 The origin is [0:1:0] Now some additions etc,: P0 + P1 = [3:3:1] P0 - P1 = [8:21:1] P0 - P1 - P2 = [93:-143:27] P0.twice() = [245:-32:125] P0 + P0 = [245:-32:125] 3*P0 = [-74725:-438957:117649] P0 - P0 = [0:1:0] P0 +3 P1 - P2 = [816:-23310:1] 2P0 +2 P1 + P2 = [93:896:1] Now we try a systematic exploration -3, -3, -3: [173402493:-312412055:41781923] -3, -3, -2: [4189408:8960581:704969] -3, -3, -1: [1786410:-1787743:729000] -3, -3, 0: [1735612:8628750:68921] -3, -3, 1: [160962987:-73608612:81182737] -3, -3, 2: [1356164797:-71126160883:493039] -3, -3, 3: [125658707472212:6072729019689:62179146498113] -3, -2, -3: [2212614:-10179939:4574296] -3, -2, -2: [-34216:251158:103823] -3, -2, -1: [-17639:-109980:29791] -3, -2, 0: [92379:143623:148877] -3, -2, 1: [-4163000:-7596119:1953125] -3, -2, 2: [1838781714:-135929375:1806932232] -3, -2, 3: [-4773144746116:-976602707934:1584834464179] -3, -1, -3: [1178299:-4850852:68921] -3, -1, -2: [94875:71299:35937] -3, -1, -1: [24412:-50127:4913] -3, -1, 0: [85098:154071:17576] -3, -1, 1: [3858272:-4442750:1442897] -3, -1, 2: [587381677:2315829684:36264691] -3, -1, 3: [5308466179635:-3022905914377:2608126472125] -3, 0, -3: [4430992:-3892417:4330747] -3, 0, -2: [-119434:155991:54872] -3, 0, -1: [32412:-97546:50653] -3, 0, 0: [-74725:321308:117649] -3, 0, 1: [-1453671:-16871239:5000211] -3, 0, 2: [1175800444:3238879023:2554497863] -3, 0, 3: [-8489731927494:-19600265861445:4763680807976] -3, 1, -3: [5081640:197180774:3375] -3, 1, -2: [5310773:-336300:2685619] -3, 1, -1: [657459:-3409809:24389] -3, 1, 0: [8348488:4750403:3442951] -3, 1, 1: [228191806:-536379633:37259704] -3, 1, 2: [114813702300:174977582986:28288984823] -3, 1, 3: [556368785287493:-733074121389148:187375095748567] -3, 2, -3: [8704995703:942557295:8960030533] -3, 2, -2: [-363511764:-185058623:122763473] -3, 2, -1: [216346510:-146306363:205379000] -3, 2, 0: [-724812816:692674750:291434247] -3, 2, 1: [28678925057:-61748215932:37360194607] -3, 2, 2: [-8685736238109:26728697273751:8963913629917] -3, 2, 3: [-1258675911627328:-170609866818516791:56286247430493053] -3, 3, -3: [6411102385354:21118267149921:548548738856] -3, 3, -2: [734465224452:-495548440926:348765000319] -3, 3, -1: [46328051291:614238485020:263374721] -3, 3, 0: [2041384645877:-367524023451:1045987472951] -3, 3, 1: [22947655893900:-160349260775081:470003609375] -3, 3, 2: [49052364371736622:19768548114717625:21681696304639736] -3, 3, 3: [141154686087724689336:-382997118708972871786:18067866971533021791] -2, -3, -3: [9718082:-5196113:9129329] -2, -3, -2: [-88288:60819:32768] -2, -3, -1: [10350:-17696:12167] -2, -3, 0: [-8569:21344:6859] -2, -3, 1: [22083:-365579:132651] -2, -3, 2: [1467346:29518545:15813251] -2, -3, 3: [-14840686668:-53202497391:13077534016] -2, -2, -3: [55278:480700:729] -2, -2, -2: [4277:-1152:2197] -2, -2, -1: [93:-897:1] -2, -2, 0: [742:209:343] -2, -2, 1: [5000:-15351:512] -2, -2, 2: [1124214:1218856:357911] -2, -2, 3: [1399931107:-2331158336:371694959] -2, -1, -3: [20213:12411:24389] -2, -1, -2: [-330:-377:125] -2, -1, -1: [68:-25:64] -2, -1, 0: [-78:28:27] -2, -1, 1: [1243:-1632:1331] -2, -1, 2: [-128097:250701:79507] -2, -1, 3: [83553550:-541263919:223648543] -2, 0, -3: [28688:68991:4096] -2, 0, -2: [798:-720:343] -2, 0, -1: [37:224:1] -2, 0, 0: [245:-93:125] -2, 0, 1: [342:-6325:1] -2, 0, 2: [650692:91633:314432] -2, 0, 3: [448295118:-1637295092:33076161] -2, 1, -3: [-19875:324544:148877] -2, 1, -2: [-1807:-8533:2197] -2, 1, -1: [522:559:729] -2, 1, 0: [-1208:-1845:512] -2, 1, 1: [31062:-6216:29791] -2, 1, 2: [-4555265:134912:1520875] -2, 1, 3: [9633434827:-9849844875:9677214091] -2, 2, -3: [22319442:19888197:7880599] -2, 2, -2: [371756:-695903:85184] -2, 2, -1: [67850:138204:12167] -2, 2, 0: [199563:-208288:79507] -2, 2, 1: [1507693:6967591:68921] -2, 2, 2: [936156018:-458727065:469097433] -2, 2, 3: [13269197888:-2985362435769:262144] -2, 3, -3: [-4964538862:7806531200:2565726409] -2, 3, -2: [67004241:-268411616:125751501] -2, 3, -1: [-8104163:48961227:19465109] -2, 3, 0: [-21256194:-153135513:42508549] -2, 3, 1: [836123500:1525038911:1450571968] -2, 3, 2: [-290048080358:-567945909132:142809632083] -2, 3, 3: [924932335876083:-16318887357184:920911723813171] -1, -3, -3: [11454454:20427225:2406104] -1, -3, -2: [80352:-93666:29791] -1, -3, -1: [1955:7564:125] -1, -3, 0: [2717:-1575:1331] -1, -3, 1: [816:23309:1] -1, -3, 2: [798682:-68303:405224] -1, -3, 3: [119498676:-651053998:4019679] -1, -2, -3: [-33633:139628:50653] -1, -2, -2: [-91:-1147:343] -1, -2, -1: [12:35:27] -1, -2, 0: [-14:-33:8] -1, -2, 1: [120:18:125] -1, -2, 2: [-6461:-3700:2197] -1, -2, 3: [4922993:-3160443:4657463] -1, -1, -3: [11832:6549:4913] -1, -1, -2: [50:-119:8] -1, -1, -1: [4:6:1] -1, -1, 0: [3:-4:1] -1, -1, 1: [11:35:1] -1, -1, 2: [1548:-1079:729] -1, -1, 3: [139610:1648791:1000] -1, 0, -3: [-3344:3094:1331] -1, 0, -2: [21:-44:27] -1, 0, -1: [-1:3:1] -1, 0, 0: [0:-3:1] -1, 0, 1: [2:13:8] -1, 0, 2: [-476:-1422:343] -1, 0, 3: [506217:208180:571787] -1, 1, -3: [30475:-5797:15625] -1, 1, -2: [52:-375:1] -1, 1, -1: [18:7:8] -1, 1, 0: [8:-22:1] -1, 1, 1: [93:116:27] -1, 1, 2: [7475:-11361:2197] -1, 1, 3: [4040376:10769499:493039] -1, 2, -3: [-440586:-390925:157464] -1, 2, -2: [5236:-2538:4913] -1, 2, -1: [-345:204:125] -1, 2, 0: [301:-475:343] -1, 2, 1: [-1804:4179:1331] -1, 2, 2: [45066:-518089:195112] -1, 2, 3: [3497024:311754698:158340421] -1, 3, -3: [193462973:-156569868:86938307] -1, 3, -2: [409317:3155489:6859] -1, 3, -1: [202288:-61085:103823] -1, 3, 0: [27222:-305641:216] -1, 3, 1: [1828180:436722:857375] -1, 3, 2: [84254013:-271587900:7880599] -1, 3, 3: [144166484837:146955288613:47555965367] 0, -3, -3: [-198562138:65431412:68417929] 0, -3, -2: [499689:-641312:531441] 0, -3, -1: [-8075:15471:4913] 0, -3, 0: [858:-5253:2197] 0, -3, 1: [-752:9191:4096] 0, -3, 2: [-60458:-305040:79507] 0, -3, 3: [22469403:26544416:32461759] 0, -2, -3: [2021717:-787325:1030301] 0, -2, -2: [406:-8181:1] 0, -2, -1: [132:17:64] 0, -2, 0: [14:-52:1] 0, -2, 1: [75:64:27] 0, -2, 2: [1547:-2967:343] 0, -2, 3: [369738:730191:68921] 0, -1, -3: [-32232:-50399:13824] 0, -1, -2: [130:-24:125] 0, -1, -1: [-3:0:1] 0, -1, 0: [1:-1:1] 0, -1, 1: [-2:3:1] 0, -1, 2: [36:-133:64] 0, -1, 3: [-5750:31324:12167] 0, 0, -3: [17347:-18336:6859] 0, 0, -2: [21:95:1] 0, 0, -1: [2:-1:1] 0, 0, 0: [0:1:0] 0, 0, 1: [2:0:1] 0, 0, 2: [21:-96:1] 0, 0, 3: [17347:11477:6859] 0, 1, -3: [-5750:-43491:12167] 0, 1, -2: [36:69:64] 0, 1, -1: [-2:-4:1] 0, 1, 0: [1:0:1] 0, 1, 1: [-3:-1:1] 0, 1, 2: [130:-101:125] 0, 1, 3: [-32232:36575:13824] 0, 2, -3: [369738:-799112:68921] 0, 2, -2: [1547:2624:343] 0, 2, -1: [75:-91:27] 0, 2, 0: [14:51:1] 0, 2, 1: [132:-81:64] 0, 2, 2: [406:8180:1] 0, 2, 3: [2021717:-242976:1030301] 0, 3, -3: [22469403:-59006175:32461759] 0, 3, -2: [-60458:225533:79507] 0, 3, -1: [-752:-13287:4096] 0, 3, 0: [858:3056:2197] 0, 3, 1: [-8075:-20384:4913] 0, 3, 2: [499689:109871:531441] 0, 3, 3: [-198562138:-133849341:68417929] 1, -3, -3: [144166484837:-194511253980:47555965367] 1, -3, -2: [84254013:263707301:7880599] 1, -3, -1: [1828180:-1294097:857375] 1, -3, 0: [27222:305425:216] 1, -3, 1: [202288:-42738:103823] 1, -3, 2: [409317:-3162348:6859] 1, -3, 3: [193462973:69631561:86938307] 1, -2, -3: [3497024:-470095119:158340421] 1, -2, -2: [45066:322977:195112] 1, -2, -1: [-1804:-5510:1331] 1, -2, 0: [301:132:343] 1, -2, 1: [-345:-329:125] 1, -2, 2: [5236:-2375:4913] 1, -2, 3: [-440586:233461:157464] 1, -1, -3: [4040376:-11262538:493039] 1, -1, -2: [7475:9164:2197] 1, -1, -1: [93:-143:27] 1, -1, 0: [8:21:1] 1, -1, 1: [18:-15:8] 1, -1, 2: [52:374:1] 1, -1, 3: [30475:-9828:15625] 1, 0, -3: [506217:-779967:571787] 1, 0, -2: [-476:1079:343] 1, 0, -1: [2:-21:8] 1, 0, 0: [0:2:1] 1, 0, 1: [-1:-4:1] 1, 0, 2: [21:17:27] 1, 0, 3: [-3344:-4425:1331] 1, 1, -3: [139610:-1649791:1000] 1, 1, -2: [1548:350:729] 1, 1, -1: [11:-36:1] 1, 1, 0: [3:3:1] 1, 1, 1: [4:-7:1] 1, 1, 2: [50:111:8] 1, 1, 3: [11832:-11462:4913] 1, 2, -3: [4922993:-1497020:4657463] 1, 2, -2: [-6461:1503:2197] 1, 2, -1: [120:-143:125] 1, 2, 0: [-14:25:8] 1, 2, 1: [12:-62:27] 1, 2, 2: [-91:804:343] 1, 2, 3: [-33633:-190281:50653] 1, 3, -3: [119498676:647034319:4019679] 1, 3, -2: [798682:-336921:405224] 1, 3, -1: [816:-23310:1] 1, 3, 0: [2717:244:1331] 1, 3, 1: [1955:-7689:125] 1, 3, 2: [80352:63875:29791] 1, 3, 3: [11454454:-22833329:2406104] 2, -3, -3: [924932335876083:-904592836455987:920911723813171] 2, -3, -2: [-290048080358:425136277049:142809632083] 2, -3, -1: [836123500:-2975610879:1450571968] 2, -3, 0: [-21256194:110626964:42508549] 2, -3, 1: [-8104163:-68426336:19465109] 2, -3, 2: [67004241:142660115:125751501] 2, -3, 3: [-4964538862:-10372257609:2565726409] 2, -2, -3: [13269197888:2985362173625:262144] 2, -2, -2: [936156018:-10370368:469097433] 2, -2, -1: [1507693:-7036512:68921] 2, -2, 0: [199563:128781:79507] 2, -2, 1: [67850:-150371:12167] 2, -2, 2: [371756:610719:85184] 2, -2, 3: [22319442:-27768796:7880599] 2, -1, -3: [9633434827:172630784:9677214091] 2, -1, -2: [-4555265:-1655787:1520875] 2, -1, -1: [31062:-23575:29791] 2, -1, 0: [-1208:1333:512] 2, -1, 1: [522:-1288:729] 2, -1, 2: [-1807:6336:2197] 2, -1, 3: [-19875:-473421:148877] 2, 0, -3: [448295118:1604218931:33076161] 2, 0, -2: [650692:-406065:314432] 2, 0, -1: [342:6324:1] 2, 0, 0: [245:-32:125] 2, 0, 1: [37:-225:1] 2, 0, 2: [798:377:343] 2, 0, 3: [28688:-73087:4096] 2, 1, -3: [83553550:317615376:223648543] 2, 1, -2: [-128097:-330208:79507] 2, 1, -1: [1243:301:1331] 2, 1, 0: [-78:-55:27] 2, 1, 1: [68:-39:64] 2, 1, 2: [-330:252:125] 2, 1, 3: [20213:-36800:24389] 2, 2, -3: [1399931107:1959463377:371694959] 2, 2, -2: [1124214:-1576767:357911] 2, 2, -1: [5000:14839:512] 2, 2, 0: [742:-552:343] 2, 2, 1: [93:896:1] 2, 2, 2: [4277:-1045:2197] 2, 2, 3: [55278:-481429:729] 2, 3, -3: [-14840686668:40124963375:13077534016] 2, 3, -2: [1467346:-45331796:15813251] 2, 3, -1: [22083:232928:132651] 2, 3, 0: [-8569:-28203:6859] 2, 3, 1: [10350:5529:12167] 2, 3, 2: [-88288:-93587:32768] 2, 3, 3: [9718082:-3933216:9129329] 3, -3, -3: [141154686087724689336:364929251737439849995:18067866971533021791] 3, -3, -2: [49052364371736622:-41450244419357361:21681696304639736] 3, -3, -1: [22947655893900:159879257165706:470003609375] 3, -3, 0: [2041384645877:-678463449500:1045987472951] 3, -3, 1: [46328051291:-614501859741:263374721] 3, -3, 2: [734465224452:146783440607:348765000319] 3, -3, 3: [6411102385354:-21666815888777:548548738856] 3, -2, -3: [-1258675911627328:114323619388023738:56286247430493053] 3, -2, -2: [-8685736238109:-35692610903668:8963913629917] 3, -2, -1: [28678925057:24388021325:37360194607] 3, -2, 0: [-724812816:-984108997:291434247] 3, -2, 1: [216346510:-59072637:205379000] 3, -2, 2: [-363511764:62295150:122763473] 3, -2, 3: [8704995703:-9902587828:8960030533] 3, -1, -3: [556368785287493:545699025640581:187375095748567] 3, -1, -2: [114813702300:-203266567809:28288984823] 3, -1, -1: [228191806:499119929:37259704] 3, -1, 0: [8348488:-8193354:3442951] 3, -1, 1: [657459:3385420:24389] 3, -1, 2: [5310773:-2349319:2685619] 3, -1, 3: [5081640:-197184149:3375] 3, 0, -3: [-8489731927494:14836585053469:4763680807976] 3, 0, -2: [1175800444:-5793376886:2554497863] 3, 0, -1: [-1453671:11871028:5000211] 3, 0, 0: [-74725:-438957:117649] 3, 0, 1: [32412:46893:50653] 3, 0, 2: [-119434:-210863:54872] 3, 0, 3: [4430992:-438330:4330747] 3, 1, -3: [5308466179635:414779442252:2608126472125] 3, 1, -2: [587381677:-2352094375:36264691] 3, 1, -1: [3858272:2999853:1442897] 3, 1, 0: [85098:-171647:17576] 3, 1, 1: [24412:45214:4913] 3, 1, 2: [94875:-107236:35937] 3, 1, 3: [1178299:4781931:68921] 3, 2, -3: [-4773144746116:-608231756245:1584834464179] 3, 2, -2: [1838781714:-1671002857:1806932232] 3, 2, -1: [-4163000:5642994:1953125] 3, 2, 0: [92379:-292500:148877] 3, 2, 1: [-17639:80189:29791] 3, 2, 2: [-34216:-354981:103823] 3, 2, 3: [2212614:5605643:4574296] 3, 3, -3: [125658707472212:-68251875517802:62179146498113] 3, 3, -2: [1356164797:71125667844:493039] 3, 3, -1: [160962987:-7574125:81182737] 3, 3, 0: [1735612:-8697671:68921] 3, 3, 1: [1786410:1058743:729000] 3, 3, 2: [4189408:-9665550:704969] 3, 3, 3: [173402493:270630132:41781923] P0 -P1 -P2 = [93:-143:27] Height of P0-P1-P2 = 3.5188832555391 3 (P0 -P1 -P2) = [141154686087724689336:364929251737439849995:18067866971533021791] Height of 3*(P0-P1-P2) = 31.669949299852 The quotient is 9 eclib-20250122/tests/out_no_ntl/tsat.out000066400000000000000000000056161474421343600200750ustar00rootroot00000000000000====================================================== E = [0,0,1,-7,36] 4 points entered. Saturating at primes from 3 up to 31 Original generators: [ [1:-6:1] [-30:21:8] [-3:5:1] [-2:6:1] ] Finished saturation Saturation was successful: points were saturated. ====================================================== E = [1,1,1,-218325338,-1241755642969] 1 points entered. Saturating at all primes Original generators: [ [52725:11541787:1] ] Finished saturation Saturation was successful: points were saturated. ====================================================== E = [0,0,1,-23737,960366] 8 points entered. Saturating at all primes Original generators: [ [36:390:1] [-87:1538:1] [181:1610:1] [-159:845:1] [-29:1274:1] [-11005:192282:125] [-3021:40175:27] [10532:78629:64] ] Finished saturation Saturation was successful: index gain = 5. New generators: [ [36:390:1] [-87:1538:1] [181:1610:1] [7046:-2067064:2197] [-29:1274:1] [-11005:192282:125] [-3021:40175:27] [10532:78629:64] ] ====================================================== E = [0,1,0,-3532341,2671895459] 1 points entered. Saturating at primes from 3 up to 3 Original generators: [ [-70530065697753731555722521380451694847027684946481619207066358883190994719487509574998052510855059423334984274230836976431876403642:200898144915891992877832706966832248880788948705776913304828657795482993310179952832361429299128720575547455788810135494156109029455:32383162777362251978562757665550366176161600539636371030636031896984923251479838151766462063041425141567992375986724367103348073] ] Finished saturation Saturation was successful: index gain = 3. New generators: [ [2039080769383242:43530702836852015:1260762051627] ] ====================================================== E = [0,1,1,-9872,374262] 4 points entered. Saturating at primes from 1 up to 211 Original generators: [ [57:0:1] [56:13:1] [458:19:8] [36:-259:1] ] Finished saturation Saturation was successful: points were saturated. ====================================================== E = [0,0,0,-17607,-889490] 1 points entered. Saturating at primes from 1 up to 101 Original generators: [ [46596:-1234751:64] ] Finished saturation Saturation was successful: index gain = 2. New generators: [ [-82:54:1] ] ====================================================== E = [0,0,0,-17607,-889490] 1 points entered. Saturating at all primes Original generators: [ [263280129247652531170706277157407041933571252365420026866208951873920842052396252657635769198080932098233160834620319573506062955649578386039454820298260:12270174977753354259300841932138583546945739892423470904743601423748009727778856605607417283774449633972161184879734495532161875678358689349216627511369921:120754622061233085483190490682227449179649624416185851339590001839002936632584697769070479156764302333294029190402580462433963906189955071839715336000] ] Finished saturation Saturation was successful: index gain = 10. New generators: [ [-82:54:1] ] eclib-20250122/tests/out_no_ntl/tsat2.out000066400000000000000000000013331474421343600201470ustar00rootroot00000000000000 =============================================================== 24129r1 = [0,0,1,-68799,-1969790] 2 points entered:[ [-1870:9257:8] [-197:1984:1] ] Saturation index bound (for points of good reduction) = 4 Tamagawa index primes are [ 2 5 ] Saturation primes are now[ 2 3 5 ] Checking saturation at [ 2 3 5 ] Checking 2-saturation Points were proved 2-saturated (max q used = 17) Checking 3-saturation Points were proved 3-saturated (max q used = 37) Checking 5-saturation Points were proved 5-saturated (max q used = 73) Finished p-saturation, points were saturated =============================================================== Number of curves entered: 1 Number saturated already: 1 Number which were saturated: 0 eclib-20250122/tests/out_no_ntl/tsat3.out000066400000000000000000000017201474421343600201500ustar00rootroot00000000000000 24129181 = [0,0,1,-68799,-1969790] rank = 2 torsion group structure = [ ] (torsion rank 0) Input non-torsion points: [ [-1870:9257:8] [-197:1984:1] ] Input torsion points: [ ] Saturation complete --input points were saturated Generator 1 is [-1870:9257:8]; height 2.00839 Generator 2 is [-197:1984:1]; height 0.182405 Regulator = 0.288919 24129 18 1 [0,0,1,-68799,-1969790] 2 [-1870:9257:8] [-197:1984:1] ============================================================== 133507b2 = [1,-1,0,-898,-7905] rank = 2 torsion group structure = [ 2 2 ] (torsion rank 2) Input non-torsion points: [ [-178:299:8] [-23748:-59351:1728] ] Input torsion points: [ [34:-17:1] [-10:5:1] ] Saturation complete --input points were saturated Generator 1 is [-178:299:8]; height 4.69293 Generator 2 is [-23748:-59351:1728]; height 6.99486 Regulator = 32.7933 133507 b 2 [1,-1,0,-898,-7905] 2 [-178:299:8] [-23748:-59351:1728] ============================================================== eclib-20250122/tests/out_no_ntl/tsatbnd.out000066400000000000000000000167741474421343600205700ustar00rootroot00000000000000====================================================== E = [0,0,1,-7,36] 4 points entered: [1:-6:1] (height 1.6349748928639) [-30:21:8] (height 3.2314398318025) [-3:5:1] (height 1.8051880666154) [-2:6:1] (height 1.7512018533834) Regulator of input points: 3.3063784745913 Subgroup of EGR points has index 1 Images of points in component groups at bad primes and R p Group Image(s) 545723 [ 1 ] [ 0 ][ 0 ][ 0 ][ 0 ] R [ 1 ] [ 0 ][ 0 ][ 0 ][ 0 ] Global Tamagawa number: 1 Global Tamagawa exponent: 1 lower height bound (egr points): 0.21022410381343 bound on saturation index (egr points): 82 lower height bound (all points): 0.21022410381343 bound on saturation index (all points): 82 ====================================================== E = [1,1,1,-218325338,-1241755642969] 1 points entered: [52725:11541787:1] (height 7.3905747176836) Regulator of input points: 7.3905747176836 Subgroup of EGR points has index 6 Images of points in component groups at bad primes and R p Group Image(s) 2 [ 6 ] [ 2 ] 3 [ 2 ] [ 1 ] 5 [ 4 ] [ 2 ] 7 [ 1 ] [ 0 ] 17 [ 1 ] [ 0 ] 43 [ 1 ] [ 0 ] R [ 2 ] [ 0 ] Global Tamagawa number: 96 Global Tamagawa exponent: 12 lower height bound (egr points): 0.94217208951617 bound on saturation index (egr points): 16 lower height bound (all points): 0.0065428617327512 bound on saturation index (all points): 33 ====================================================== E = [0,0,1,-23737,960366] 8 points entered: [36:390:1] (height 4.9361653636229) [-87:1538:1] (height 5.3504215345619) [181:1610:1] (height 5.3726790325808) [-159:845:1] (height 5.5113840512311) [-29:1274:1] (height 5.1867535784134) [-11005:192282:125] (height 8.5719034126844) [-3021:40175:27] (height 7.6074992975745) [10532:78629:64] (height 8.0608521192641) Regulator of input points: 260586.99720495 Subgroup of EGR points has index 2 Images of points in component groups at bad primes and R p Group Image(s) 457532830151317 [ 1 ] [ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ] R [ 2 ] [ 1 ][ 1 ][ 0 ][ 1 ][ 1 ][ 1 ][ 1 ][ 0 ] Global Tamagawa number: 2 Global Tamagawa exponent: 2 lower height bound (egr points): 4.8453850861059 bound on saturation index (egr points): 29 lower height bound (all points): 1.2113462715265 bound on saturation index (all points): 3793 ====================================================== E = [0,1,0,-3532341,2671895459] 1 points entered: [-70530065697753731555722521380451694847027684946481619207066358883190994719487509574998052510855059423334984274230836976431876403642:200898144915891992877832706966832248880788948705776913304828657795482993310179952832361429299128720575547455788810135494156109029455:32383162777362251978562757665550366176161600539636371030636031896984923251479838151766462063041425141567992375986724367103348073] (height 200.11614623735) Regulator of input points: 200.11614623735 Subgroup of EGR points has index 2 Images of points in component groups at bad primes and R p Group Image(s) 2 [ 1 ] [ 0 ] 5 [ 1 ] [ 0 ] 7 [ 1 ] [ 0 ] 41 [ 2 2 ] [ 1 0 ] R [ 1 ] [ 0 ] Global Tamagawa number: 2 Global Tamagawa exponent: 2 lower height bound (egr points): 1.4668632445206 bound on saturation index (egr points): 23 lower height bound (all points): 0.36671581113016 bound on saturation index (all points): 23 ====================================================== E = [0,1,1,-9872,374262] 4 points entered: [57:0:1] (height 1.049801382823) [56:13:1] (height 1.9341984951922) [458:19:8] (height 2.788101102891) [36:-259:1] (height 3.5740919517762) Regulator of input points: 13.99547289159 Subgroup of EGR points has index 1 Images of points in component groups at bad primes and R p Group Image(s) 24191611 [ 1 ] [ 0 ][ 0 ][ 0 ][ 0 ] R [ 1 ] [ 0 ][ 0 ][ 0 ][ 0 ] Global Tamagawa number: 1 Global Tamagawa exponent: 1 lower height bound (egr points): 0.025163911436707 bound on saturation index (egr points): 11816 lower height bound (all points): 0.025163911436707 bound on saturation index (all points): 11816 ====================================================== E = [0,1,0,-19357973048906456166239827272707359553313344,21187731957757821187375878909257489490487412099497964528006317056] 12 points entered: [11376724821019368394185473144824:531128848935479591898724774494856605576120:2212245127] (height 20.724958278806) [7623939119367566734712416:221638196641185505905607878680125440:6859] (height 22.408810521229) [36426251939262077044010523050021856:1440660184888000534262415597113906110443804160:7723644690663] (height 28.213818287161) [-2374492566122734660340122:529890342210233698629090661148812455:2744] (height 25.262656286423) [133315763430614733564506995979036000:12052050702684033030644774922369112945461998208:13452404189687] (height 26.065344483855) [-736456133932085217609486905120:65252742580786613608001616883511206150656:281011375] (height 18.549337908829) [-595772851387421768949418976:167161309967794524103557005329392387840:912673] (height 27.346838711032) [6022489089748785062867974730217810:556978335673856277257836463329999151388906387:588059226152] (height 31.238508420372) [-14469357974751181338226317055916720:4882855888975145618903473912921126613023223376:27655941287521] (height 27.922856002931) [401117760561576371833764564008128488352:9772673504421360502054799343252140728954874846976:98542628343088957] (height 28.927471674018) [289759090016726210750821602762394720:4585180501130133566892803635614473034268791168:75274392943567] (height 26.081232007994) [147460739409404501162213937304:6903716310575347660155145984848699291480:143055667] (height 28.763360826154) Regulator of input points: 1.6549685573276e+14 Subgroup of EGR points has index 12582912 Images of points in component groups at bad primes and R p Group Image(s) 2 [ 16 ] [ 1 ][ 8 ][ 7 ][ 0 ][ -5 ][ 7 ][ -6 ][ 0 ][ -2 ][ -6 ][ 5 ][ 1 ] 3 [ 12 ] [ -5 ][ 4 ][ 0 ][ -5 ][ 1 ][ 3 ][ -5 ][ 0 ][ -4 ][ 3 ][ 3 ][ -2 ] 7 [ 4 ] [ 2 ][ 2 ][ 0 ][ 0 ][ 1 ][ 2 ][ 2 ][ 2 ][ 1 ][ 0 ][ 0 ][ 1 ] 13 [ 4 ] [ 2 ][ 2 ][ 1 ][ 1 ][ 1 ][ 0 ][ 0 ][ 1 ][ 0 ][ 2 ][ 2 ][ 2 ] 29 [ 2 ] [ 1 ][ 0 ][ 1 ][ 1 ][ 0 ][ 0 ][ 1 ][ 1 ][ 0 ][ 1 ][ 1 ][ 0 ] 31 [ 4 ] [ 1 ][ 1 ][ 1 ][ 0 ][ 1 ][ 2 ][ 0 ][ 1 ][ 2 ][ 1 ][ 2 ][ 1 ] 43 [ 2 ] [ 1 ][ 0 ][ 0 ][ 0 ][ 1 ][ 0 ][ 0 ][ 1 ][ 1 ][ 1 ][ 1 ][ 1 ] 73 [ 2 ] [ 0 ][ 1 ][ 1 ][ 1 ][ 1 ][ 1 ][ 1 ][ 0 ][ 1 ][ 1 ][ 0 ][ 0 ] 79 [ 4 ] [ 1 ][ 0 ][ 1 ][ 1 ][ 1 ][ 1 ][ 1 ][ 1 ][ 1 ][ 1 ][ 0 ][ 1 ] 83 [ 2 ] [ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ] 89 [ 2 ] [ 0 ][ 1 ][ 1 ][ 1 ][ 0 ][ 0 ][ 0 ][ 1 ][ 0 ][ 1 ][ 0 ][ 1 ] 151 [ 2 ] [ 0 ][ 0 ][ 1 ][ 1 ][ 1 ][ 1 ][ 1 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ] 199 [ 2 ] [ 1 ][ 0 ][ 1 ][ 1 ][ 0 ][ 1 ][ 1 ][ 0 ][ 0 ][ 0 ][ 1 ][ 1 ] 239 [ 4 ] [ 0 ][ 2 ][ 1 ][ 0 ][ 1 ][ 2 ][ 0 ][ 0 ][ 1 ][ 1 ][ 0 ][ 1 ] 263 [ 4 ] [ 0 ][ 0 ][ 2 ][ 2 ][ 1 ][ 1 ][ 2 ][ 1 ][ 0 ][ 1 ][ 2 ][ 0 ] 601 [ 4 ] [ 2 ][ 1 ][ 1 ][ 1 ][ 1 ][ 1 ][ 1 ][ 2 ][ 2 ][ 1 ][ 2 ][ 1 ] 617 [ 2 ] [ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 1 ][ 0 ][ 0 ][ 1 ][ 0 ][ 1 ][ 0 ] 1433 [ 2 ] [ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ] 3449 [ 2 ] [ 1 ][ 0 ][ 1 ][ 0 ][ 1 ][ 0 ][ 0 ][ 0 ][ 1 ][ 1 ][ 0 ][ 1 ] 6199 [ 2 ] [ 1 ][ 1 ][ 0 ][ 0 ][ 0 ][ 1 ][ 0 ][ 1 ][ 0 ][ 0 ][ 1 ][ 0 ] 1607849 [ 2 ] [ 1 ][ 0 ][ 0 ][ 0 ][ 1 ][ 0 ][ 0 ][ 1 ][ 1 ][ 1 ][ 1 ][ 0 ] R [ 2 ] [ 0 ][ 1 ][ 0 ][ 1 ][ 0 ][ 1 ][ 1 ][ 0 ][ 1 ][ 0 ][ 0 ][ 1 ] Global Tamagawa number: 25769803776 Global Tamagawa exponent: 48 lower height bound (egr points): 49.659667113944 bound on saturation index (egr points): 3621299 lower height bound (all points): 0.021553674962649 bound on saturation index (all points): 43050497269923774464 eclib-20250122/tests/out_no_ntl/tversion.out000066400000000000000000000006421474421343600207650ustar00rootroot00000000000000This eclib version is 20250122 [ year month day ] = [ 2025 1 22 ] Configure options and compilation date: eclib version 20250122, using NTL bigints but no multiprecision floating point Testing comparison of version date and various (year, month, day) date triples: Date 20200101 is before the version date 20250122 Date 20300611 is after the version date 20250122 Date 20210317 is before the version date 20250122 eclib-20250122/tests/out_no_ntl/twist.out000066400000000000000000000030101474421343600202560ustar00rootroot00000000000000 Curve is: [1,-1,0,4,3] (reduced minimal model) b2 = -3 b4 = 8 b6 = 12 b8 = -25 c4 = -183 c6 = -3429 disc = -10351 (bad primes: [ 11 941 ]; # real components = 1) #torsion not yet computed Conductor = 10351 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 11 1 1 1 I1 1 1 941 1 1 1 I1 1 1 Enter a twist value: (0 to set a new `original' curve, 1 to twist original, or any other integer to twist immediately preceding output) E * 10 is: [0,0,0,6100,254000] (reduced minimal model) b2 = 0 b4 = 12200 b6 = 1016000 b8 = -37210000 c4 = -292800 c6 = -219456000 disc = -42397696000000 (bad primes: [ 2 5 11 941 ]; # real components = 1) #torsion not yet computed Conductor = 16561600 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 18 6 0 I*8 4 1 5 6 2 0 I*0 1 1 11 1 1 1 I1 1 -1 941 1 1 1 I1 1 -1 Enter a twist value: (0 to set a new `original' curve, 1 to twist original, or any other integer to twist immediately preceding output) E * 10 is: [1,-1,0,4,3] (reduced minimal model) b2 = -3 b4 = 8 b6 = 12 b8 = -25 c4 = -183 c6 = -3429 disc = -10351 (bad primes: [ 11 941 ]; # real components = 1) #torsion not yet computed Conductor = 10351 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 11 1 1 1 I1 1 1 941 1 1 1 I1 1 1 Enter a twist value: (0 to set a new `original' curve, 1 to twist original, or any other integer to twist immediately preceding output) eclib-20250122/tests/out_no_ntl/vectest1.out000066400000000000000000000015731474421343600206560ustar00rootroot00000000000000Test run of vector package. iota(10) = [1,2,3,4,5,6,7,8,9,10] Enter n : Uninitialized new vec v = [] Copy of v = [] Initialized new vec v = [0] Copy of v = [0] Enter new entries of v: Now v = [1] w = [0,0,0] After w=v, Now v = [1] Now w = [1] w==v: 1 w!=v: 0 Enter i : After w*=2, w = [2] 3*v = [3] Now v = [1] v+w = [3] Now v = [1] v-w = [-1] Now v = [1] v*w = 2 Now v = [1] w/2 = [1] Now w = [2] -v = [-1] +v = [1] +w = [2] v = [1]; w = [2] Elements of v: v[1] = 1 Member test: Enter a test number: 1 IS a member of v. Subscript test Enter length of subscript vec:Enter subscript vector:The sub-vector is [1] Change one entry of v. Index?New entry?New entry: v[1] = 1 Now v = [1] Initial slice; length? Slice = [1] Now v = [1] General slice; beginning, end? Slice = [1] Now v = [1] w = [2]; content(w) = 2 After makeprimitive(w), w = [1] u = [0] After swapvec(u,v): u = [1] v = [0] eclib-20250122/tests/out_no_ntl/vectest2.out000066400000000000000000000015731474421343600206570ustar00rootroot00000000000000Test run of vector package. iota(10) = [1,2,3,4,5,6,7,8,9,10] Enter n : Uninitialized new vec v = [] Copy of v = [] Initialized new vec v = [0] Copy of v = [0] Enter new entries of v: Now v = [1] w = [0,0,0] After w=v, Now v = [1] Now w = [1] w==v: 1 w!=v: 0 Enter i : After w*=2, w = [2] 3*v = [3] Now v = [1] v+w = [3] Now v = [1] v-w = [-1] Now v = [1] v*w = 2 Now v = [1] w/2 = [1] Now w = [2] -v = [-1] +v = [1] +w = [2] v = [1]; w = [2] Elements of v: v[1] = 1 Member test: Enter a test number: 1 IS a member of v. Subscript test Enter length of subscript vec:Enter subscript vector:The sub-vector is [1] Change one entry of v. Index?New entry?New entry: v[1] = 1 Now v = [1] Initial slice; length? Slice = [1] Now v = [1] General slice; beginning, end? Slice = [1] Now v = [1] w = [2]; content(w) = 2 After makeprimitive(w), w = [1] u = [0] After swapvec(u,v): u = [1] v = [0] eclib-20250122/tests/out_no_ntl/vectest3.out000066400000000000000000000015731474421343600206600ustar00rootroot00000000000000Test run of vector package. iota(10) = [1,2,3,4,5,6,7,8,9,10] Enter n : Uninitialized new vec v = [] Copy of v = [] Initialized new vec v = [0] Copy of v = [0] Enter new entries of v: Now v = [1] w = [0,0,0] After w=v, Now v = [1] Now w = [1] w==v: 1 w!=v: 0 Enter i : After w*=2, w = [2] 3*v = [3] Now v = [1] v+w = [3] Now v = [1] v-w = [-1] Now v = [1] v*w = 2 Now v = [1] w/2 = [1] Now w = [2] -v = [-1] +v = [1] +w = [2] v = [1]; w = [2] Elements of v: v[1] = 1 Member test: Enter a test number: 1 IS a member of v. Subscript test Enter length of subscript vec:Enter subscript vector:The sub-vector is [1] Change one entry of v. Index?New entry?New entry: v[1] = 1 Now v = [1] Initial slice; length? Slice = [1] Now v = [1] General slice; beginning, end? Slice = [1] Now v = [1] w = [2]; content(w) = 2 After makeprimitive(w), w = [1] u = [0] After swapvec(u,v): u = [1] v = [0] eclib-20250122/tests/out_ntl/000077500000000000000000000000001474421343600156655ustar00rootroot00000000000000eclib-20250122/tests/out_ntl/allisog.out000066400000000000000000000033261474421343600200540ustar00rootroot00000000000000Verbose? (0/1) [ [0,-1,1,-10,-20] [0,-1,1,-7820,-263580] [0,-1,1,0,0] ] [0,5,5;5,0,0;5,0,0] [ [1,0,1,4,-6] [1,0,1,-36,-70] [1,0,1,-1,0] [1,0,1,-171,-874] [1,0,1,-11,12] [1,0,1,-2731,-55146] ] [0,2,3,3,0,0;2,0,0,0,3,3;3,0,0,0,2,0;3,0,0,0,0,2;0,3,2,0,0,0;0,3,0,2,0,0] [ [1,1,1,-10,-10] [1,1,1,35,-28] [1,1,1,-135,-660] [1,1,1,-5,2] [1,1,1,-110,-880] [1,1,1,-2160,-39540] [1,1,1,-80,242] [1,1,1,0,0] ] [0,2,2,2,0,0,0,0;2,0,0,0,0,0,0,0;2,0,0,0,2,2,0,0;2,0,0,0,0,0,2,2;0,0,2,0,0,0,0,0;0,0,2,0,0,0,0,0;0,0,0,2,0,0,0,0;0,0,0,2,0,0,0,0] [ [1,-1,1,-1,-14] [1,-1,1,-6,-4] [1,-1,1,-91,-310] [1,-1,1,-1,0] ] [0,2,0,0;2,0,2,2;0,2,0,0;0,2,0,0] [ [0,1,1,-9,-15] [0,1,1,1,0] [0,1,1,-769,-8470] ] [0,3,3;3,0,0;3,0,0] [ [0,1,0,4,4] [0,1,0,-1,0] [0,1,0,-36,-140] [0,1,0,-41,-116] ] [0,2,3,0;2,0,0,3;3,0,0,2;0,3,2,0] [ [1,0,0,-4,-1] [1,0,0,-39,90] [1,0,0,-49,-136] [1,0,0,1,0] [1,0,0,-34,-217] [1,0,0,-784,-8515] ] [0,2,2,2,0,0;2,0,0,0,0,0;2,0,0,0,2,2;2,0,0,0,0,0;0,0,2,0,0,0;0,0,2,0,0,0] [ [0,-1,0,-4,4] [0,-1,0,-64,220] [0,-1,0,1,0] [0,-1,0,-24,-36] [0,-1,0,16,-180] [0,-1,0,-384,-2772] ] [0,2,2,2,0,0;2,0,0,0,0,0;2,0,0,0,0,0;2,0,0,0,2,2;0,0,0,2,0,0;0,0,0,2,0,0] [ [1,0,1,-5,-8] [1,0,1,0,0] [1,0,1,-460,-3830] ] [0,3,3;3,0,0;3,0,0] [ [1,-1,1,-3,3] [1,-1,1,-213,-1257] ] [0,7;7,0] [ [0,0,1,0,-7] [0,0,1,0,0] [0,0,1,-270,-1708] [0,0,1,-30,63] ] [0,3,3,0;3,0,0,3;3,0,0,0;0,3,0,0] [ [1,0,1,1,2] [1,0,1,-19,26] [1,0,1,-14,-64] [1,0,1,-289,1862] [1,0,1,-69,-194] [1,0,1,-334,-2368] [1,0,1,-454,-544] [1,0,1,-5334,-150368] ] [0,2,3,0,0,0,0,0;2,0,0,2,2,3,0,0;3,0,0,0,0,2,0,0;0,2,0,0,0,0,3,0;0,2,0,0,0,0,0,3;0,3,2,0,0,0,2,2;0,0,0,3,0,2,0,0;0,0,0,0,3,2,0,0] [ [0,0,0,4,0] [0,0,0,-1,0] [0,0,0,-11,14] [0,0,0,-11,-14] ] [0,2,0,0;2,0,2,2;0,2,0,0;0,2,0,0] eclib-20250122/tests/out_ntl/bigrattest.out000066400000000000000000000006771474421343600206000ustar00rootroot00000000000000Test run of bigrational number procs. gcd(4,6) = 2 q = 2/3 has denominator 3 and numerator 2 Enter a rational (either n or n/d): q = 123456789/234567890 has denominator 234567890 and numerator 123456789 floor(q) = 0 ceil(q) = 1 Enter three rationals separated by whitespace: q1 = 111111111111/2222222222222 q2 = 33333333333/4444444444444 q3 = 185185185185185/22222222222 Enter three rationals in the format [q1:q2:q3]: [q1:q2:q3] = [1/2:3/4:5/6] eclib-20250122/tests/out_ntl/checkgens.out000066400000000000000000000050071474421343600203520ustar00rootroot00000000000000268605a1 [0,0,1,1032,2673]: r = 1 torsion group structure = [ ] (torsion rank 0). P = [41:337:1] OK, order=oo, height=0.59990651734770452119201067743. 268605b1 [0,0,1,14802,-4767741]: r = 1 torsion group structure = [ ] (torsion rank 0). P = [52199:344443:343] OK, order=oo, height=4.8009119417025658580313798627. 268605c1 [1,-1,0,-450,2781]: r = 2 torsion group structure = [ ] (torsion rank 0). P = [-154:585:8] OK, order=oo, height=2.4620339650023437699163975371. P = [76:597:1] OK, order=oo, height=1.9744004986562372890973350171. 268605d1 [1,-1,0,-1194,15983]: r = 1 torsion group structure = [ 2 ] (torsion rank 1). P = [-314:437:8] OK, order=oo, height=4.2655328871552274826126272117. P = [22:-11:1] OK, order=2, height=0. 268605d2 [1,-1,0,-2319,-17992]: r = 1 torsion group structure = [ 2 2 ] (torsion rank 2). P = [-117782:149171:2744] OK, order=oo, height=8.5310657743104549652252544234. P = [52:-26:1] OK, order=2, height=0. P = [-8:4:1] OK, order=2, height=0. 268605d3 [1,-1,0,8256,-142777]: r = 1 torsion group structure = [ 2 ] (torsion rank 1). P = [2451471778:11277201335:138991832] OK, order=oo, height=17.062131548620909930450508847. P = [134:-67:8] OK, order=2, height=0. 268605d4 [1,-1,0,-30894,-2081107]: r = 1 torsion group structure = [ 2 ] (torsion rank 1). P = [-64232978894:39611125679:622835864] OK, order=oo, height=17.062131548620909930450508847. P = [-826:413:8] OK, order=2, height=0. 268605e1 [1,-1,0,8256,753083]: r = 1 torsion group structure = [ 2 ] (torsion rank 1). P = [395144:10859243:512] OK, order=oo, height=8.5829151366781123251964064488. P = [-62:31:1] OK, order=2, height=0. 268605e2 [1,-1,0,-91149,9441080]: r = 1 torsion group structure = [ 2 2 ] (torsion rank 2). P = [317636:-1639318:1331] OK, order=oo, height=4.2914575683390561625982032244. P = [998:-499:8] OK, order=2, height=0. P = [220:-110:1] OK, order=2, height=0. 268605e3 [1,-1,0,-1413024,646849205]: r = 1 torsion group structure = [ 2 ] (torsion rank 1). P = [7372618:-6306479:10648] OK, order=oo, height=8.5829151366781123251964064488. P = [5510:-2755:8] OK, order=2, height=0. 268605e4 [1,-1,0,-359754,-73128097]: r = 1 torsion group structure = [ 2 ] (torsion rank 1). P = [265770428:14415192911:85184] OK, order=oo, height=8.5829151366781123251964064488. P = [-3514:1757:8] OK, order=2, height=0. 268605f1 [0,0,1,-110937,14226165]: r = 1 torsion group structure = [ ] (torsion rank 0). P = [1554:631:8] OK, order=oo, height=1.9389206422900754768913015595. 268605g1 [0,0,1,-747,8255]: r = 0 torsion group structure = [ ] (torsion rank 0). eclib-20250122/tests/out_ntl/comptest.out000066400000000000000000000015261474421343600202600ustar00rootroot00000000000000z = (3.125,4.25) has real part = 3.125 and imaginary part = 4.25i z has complex conjugate = (3.125,-4.25) AGM((3.125,4.25),(1,0)) = (2.07831617217326684,1.56336158990659582) AGM((1,1),(2,1)) = (1.471349362864653566,1.02005412633766002) Enter Integer coefficients of a (monic) cubic:The 1 root(s) are: [ -1 ] Enter a real or complex: Main cube root = (1.628937145922175875,0.5201745023045458395) whose cube is (3,4) Next cube root = (-1.26495290635775166,1.1506136983844505) whose cube is (3,4) Next cube root = (-0.3639842395644242155,-1.670788200688996339) whose cube is (3,4) Enter real coefficients a b c d e of a quartic:Quartic [1,2,3,4,5] has roots: (-1.287815479557647989,-0.8578967583284902864) (-1.287815479557647989,0.8578967583284902864) (0.2878154795576479889,1.416093080171907939) (0.2878154795576479889,-1.416093080171907939) eclib-20250122/tests/out_ntl/conductor.out000066400000000000000000000041431474421343600204200ustar00rootroot00000000000000[0,-1,1,-10,-20]: N = 11 [1,0,1,4,-6]: N = 14 [1,1,1,-10,-10]: N = 15 [1,-1,1,-1,-14]: N = 17 [0,1,1,-9,-15]: N = 19 [0,1,0,4,4]: N = 20 [1,0,0,-4,-1]: N = 21 [0,-1,0,-4,4]: N = 24 [1,0,1,-5,-8]: N = 26 [1,-1,1,-3,3]: N = 26 [0,0,1,0,-7]: N = 27 [1,0,1,1,2]: N = 30 [0,0,0,4,0]: N = 32 [1,1,0,-11,0]: N = 33 [1,0,0,-3,1]: N = 34 [0,1,1,9,1]: N = 35 [0,0,0,0,1]: N = 36 [0,0,1,-1,0]: N = 37 [0,1,1,-23,-50]: N = 37 [1,0,1,9,90]: N = 38 [1,1,1,0,1]: N = 38 [1,1,0,-4,-5]: N = 39 [0,0,0,-7,-6]: N = 40 [1,1,1,-4,5]: N = 42 [0,1,1,0,0]: N = 43 [0,1,0,3,-1]: N = 44 [1,-1,0,0,-5]: N = 45 [1,-1,0,-10,-12]: N = 46 [0,1,0,-4,-4]: N = 48 [1,-1,0,-2,-1]: N = 49 [1,0,1,-1,-2]: N = 50 [1,1,1,-3,1]: N = 50 [0,1,1,1,-1]: N = 51 [0,0,0,1,-10]: N = 52 [1,-1,1,0,0]: N = 53 [1,-1,0,12,8]: N = 54 [1,-1,1,1,-1]: N = 54 [1,-1,0,-4,3]: N = 55 [0,-1,0,0,-4]: N = 56 [0,0,0,1,2]: N = 56 [0,-1,1,-2,2]: N = 57 [1,0,1,-7,5]: N = 57 [0,1,1,20,-32]: N = 57 [1,-1,0,-1,1]: N = 58 [1,1,1,5,9]: N = 58 [1,0,0,-2,1]: N = 61 [1,-1,1,-1,1]: N = 62 [1,-1,0,9,0]: N = 63 [0,0,0,-4,0]: N = 64 [1,0,0,-1,0]: N = 65 [1,0,1,-6,4]: N = 66 [1,1,1,-2,-1]: N = 66 [1,0,0,-45,81]: N = 66 [0,1,1,-12,-21]: N = 67 [1,0,1,-1,-1]: N = 69 [1,-1,1,2,-3]: N = 70 [0,0,0,6,-7]: N = 72 [1,-1,0,4,-3]: N = 73 [0,-1,1,-8,-7]: N = 75 [1,0,1,-1,23]: N = 75 [0,1,1,2,4]: N = 75 [0,-1,0,-21,-31]: N = 76 [0,0,1,2,0]: N = 77 [1,1,0,4,11]: N = 77 [0,1,1,-49,600]: N = 77 [1,1,0,-19,685]: N = 78 [1,1,1,-2,0]: N = 79 [0,0,0,-7,6]: N = 80 [0,-1,0,4,-4]: N = 80 [1,0,1,-2,0]: N = 82 [1,1,1,1,0]: N = 83 [0,-1,0,-1,-2]: N = 84 [0,1,0,7,0]: N = 84 [1,1,0,-8,-13]: N = 85 [0,0,0,-4,4]: N = 88 [1,1,1,-1,0]: N = 89 [1,1,0,4,5]: N = 89 [1,-1,0,6,0]: N = 90 [1,-1,1,-8,11]: N = 90 [1,-1,1,13,-61]: N = 90 [0,0,1,1,0]: N = 91 [0,1,1,-7,5]: N = 91 [0,1,0,2,1]: N = 92 [0,0,0,-1,1]: N = 92 [1,-1,1,0,-1]: N = 94 [0,1,0,-2,0]: N = 96 [0,-1,0,-2,0]: N = 96 [1,1,0,-25,-111]: N = 98 [1,-1,1,-2,0]: N = 99 [1,-1,0,-15,8]: N = 99 [1,-1,1,-59,186]: N = 99 [0,0,1,-3,-5]: N = 99 [0,-1,0,-33,62]: N = 100 [0,0,0,-16/9,0]: N = 288 eclib-20250122/tests/out_ntl/d2.out000066400000000000000000000014031474421343600167210ustar00rootroot00000000000000Verbose? Limit on height? Stop after first point found? Selmer only (0/1: if 1, just tests whether second descent possible)? Enter quartic coefficients (a,0,c,0,e) or just a c e cd-curve (nearer): [0,111,0,2738,0] cd-dash-curve (further): [0,-222,0,1369,0] I = 45177, J = 19146834 Minimal model for Jacobian: [0,0,0,-15059,-709142] Checking local solublity at primes [ 2 3 37 ]: Everywhere locally soluble. ------------------------------------------ RESULTS Quartic has rational point (x:y:z) = (883:37002:145) Point on (c,d) curve = [-113054905:-32672766:3048625] height = 13.565420700285587132 Point on (c',d') curve = [175298864692140:22290732796922058:2098872790442875] height = 27.130841400571174263 Enter quartic coefficients (a,0,c,0,e) or just a c e eclib-20250122/tests/out_ntl/hecketest.out000066400000000000000000000237751474421343600204130ustar00rootroot00000000000000Program hecketest. Using METHOD = 2 to find newforms MODULUS for linear algebra = 1073741789 See the hecke matrices (0/1)? Plus space (0/1)? Enter level: >>>Level 90 Dimension = 22 denominator = 1 Computing conjmat... done. Computing +1 eigenspace... done, dimension = 22 Computing -1 eigenspace... done, dimension = 0 Compute W-eigenspaces? Computing W(2)... done, sparsity = 0.0785124. Computed matrix = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0], [0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,1,0,-1,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,-1,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0], [0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0], [0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,-1,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0], [0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1], [0,0,0,0,0,0,1,-1,0,-1,1,0,0,0,0,0,0,0,0,1,0,-1], [0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,-1,1,0,0,0,0,0], [-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,0,0,0,0]] Using sparse matrix code... Dimension of 1-eigenspace=11 Using sparse matrix code... Dimension of -1-eigenspace=11 Computing W(3)... done, sparsity = 0.179752. Computed matrix = [[0,0,-1,1,-1,0,0,0,0,0,0,0,0,0,0,1,-1,1,0,0,0,0], [0,0,-1,1,-1,0,0,0,0,0,0,0,1,0,0,0,-1,1,0,0,0,0], [0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,1,-1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,0,1,0,0,0,0], [0,0,0,0,0,0,1,-1,0,0,0,-1,1,0,0,0,0,1,0,1,0,-1], [0,0,0,0,0,0,1,-1,0,0,0,0,0,0,0,0,0,1,0,0,0,0], [0,0,0,0,1,0,0,-1,0,0,0,0,1,-1,0,0,0,1,0,0,0,0], [0,0,0,0,0,0,0,-1,1,0,0,0,0,0,0,0,0,1,0,0,0,0], [0,0,0,0,0,0,0,-1,0,0,0,0,1,0,0,0,0,1,0,0,0,0], [0,0,0,0,0,0,0,-1,0,0,1,0,0,0,0,0,0,1,0,0,0,0], [0,0,0,0,0,0,0,-1,0,1,0,-1,1,0,0,0,0,1,0,0,0,0], [0,0,0,0,0,0,0,-1,0,1,0,0,0,0,0,0,0,1,0,0,0,0], [0,0,0,0,0,0,0,-1,0,1,0,0,1,-1,0,0,0,1,0,0,0,0], [0,0,0,0,0,0,0,-1,0,1,0,0,0,-1,1,0,0,1,0,0,0,0], [1,-1,0,0,0,0,0,-1,0,1,0,0,0,0,0,0,0,1,0,0,0,0], [0,-1,1,1,0,0,0,-1,0,1,0,0,0,0,0,0,0,1,0,0,0,0], [0,0,0,0,1,0,0,0,0,0,0,0,1,-1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,0,0,1,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,-1,1,0,0,0,0,0,0,0,1,0], [0,0,0,0,0,0,0,0,0,0,0,-1,1,0,0,0,0,0,0,1,0,0], [0,0,0,0,0,-1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0]] Using sparse matrix code... Dimension of 1-eigenspace=12 Using sparse matrix code... Dimension of -1-eigenspace=10 Computing W(5)... done, sparsity = 0.181818. Computed matrix = [[0,0,0,0,0,0,0,0,0,0,0,-1,1,0,0,0,0,0,0,1,0,0], [0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,1,0,0,0,1,0,0], [0,0,0,0,0,0,0,0,0,1,0,-1,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,-1,0,0,0,0,0,0,0,0,0,1,0,0], [0,0,0,0,0,0,0,0,0,-1,1,0,0,0,-1,1,0,0,0,1,0,0], [0,0,-1,1,-1,0,-1,1,0,0,0,0,0,0,0,1,-1,0,0,0,0,1], [0,0,0,0,0,0,-1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1], [0,0,0,0,0,1,-1,0,0,0,1,-1,0,0,-1,1,0,0,0,0,0,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,0,0,1], [0,0,0,-1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,1], [0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,0,0,1], [1,0,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [0,1,-1,-1,0,0,0,0,0,0,0,0,0,-1,0,1,0,0,0,0,0,1], [0,1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,1], [0,1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [0,1,-1,-1,0,0,0,0,1,-1,0,0,0,0,0,0,0,0,0,0,0,1], [0,0,0,0,0,0,0,0,0,0,1,-1,0,0,-1,1,0,0,0,0,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1,0,0,0,0,0,0], [0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,-1,0,0,0,0,0], [0,0,-1,1,-1,0,0,0,0,0,0,0,0,0,0,1,-1,1,0,0,0,0], [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0]] Using sparse matrix code... Dimension of 1-eigenspace=10 Using sparse matrix code... Dimension of -1-eigenspace=12 How many T_p? Computing T_p for p = 7...Computed matrix = [[8,-4,-2,0,0,0,2,0,0,-2,2,0,0,4,-2,0,0,0,0,2,0,-2], [0,1,0,1,1,1,-1,2,0,2,-1,0,0,1,1,0,0,0,0,0,0,0], [0,0,-2,0,0,-1,1,0,0,-2,0,1,0,1,0,0,0,0,0,1,0,-1], [0,0,2,4,-1,0,2,0,0,2,-1,0,0,0,1,0,1,0,0,-1,0,1], [0,2,1,-1,2,1,-1,1,0,4,-2,1,0,-1,2,0,0,0,0,-2,0,2], [0,1,0,1,1,1,-1,2,0,2,-1,0,0,1,1,0,0,0,0,0,0,0], [0,0,2,3,1,0,2,0,0,0,0,1,0,-1,0,0,2,0,0,-1,0,1], [0,3,0,-2,3,1,-1,0,0,2,-2,3,0,-2,2,0,1,0,0,-2,0,2], [0,1,1,0,2,1,-1,-1,8,-2,0,0,0,-1,0,0,1,0,0,0,0,0], [0,1,1,0,3,2,-2,1,0,0,1,1,0,0,-1,0,2,0,0,0,0,0], [0,1,1,0,2,2,0,-1,0,-2,6,-1,0,-2,2,0,1,0,0,1,0,-1], [0,0,2,1,2,2,-2,2,0,2,1,-1,0,1,-1,0,1,0,0,0,0,0], [0,0,2,1,4,1,-1,0,0,0,1,-2,8,-4,-1,0,1,0,0,1,0,-1], [0,1,3,0,3,3,-3,1,0,2,1,0,0,-1,-1,0,2,0,0,-1,0,1], [0,1,2,1,2,3,-1,0,0,-2,6,-2,0,-3,2,0,1,0,0,1,0,-1], [0,0,1,3,0,3,-1,1,0,0,4,-3,0,-1,-4,8,-2,0,0,0,0,0], [0,-1,4,4,0,1,1,0,0,2,1,-1,0,0,-1,0,2,0,0,-1,0,1], [0,1,-2,0,-1,0,0,-4,0,4,-2,2,0,-1,2,0,-1,8,0,-1,0,1], [0,1,0,0,-2,1,-1,0,0,2,-1,1,0,-2,1,0,0,0,8,-1,0,1], [0,2,-2,-2,0,1,-3,2,0,0,0,-1,0,1,0,0,0,0,0,3,0,5], [0,0,0,0,0,-4,2,2,0,2,0,-2,0,2,0,0,-2,0,0,0,8,0], [0,0,-1,1,-1,-1,1,1,0,-2,1,-1,0,1,-1,0,1,0,0,3,0,5]] done, sparsity = 0.514463. Computing T_p for p = 11...Computed matrix = [[12,-6,0,-4,4,0,4,-2,0,-2,4,0,0,4,-4,0,2,0,0,2,0,-2], [0,1,4,-3,7,1,-1,0,0,4,-1,0,0,-1,1,0,4,0,0,0,0,0], [0,1,-1,-1,1,0,0,-1,0,2,0,-2,0,-1,0,0,1,0,0,0,0,0], [0,-2,5,4,2,-1,5,-1,0,0,1,2,0,0,-1,0,3,0,0,0,0,0], [0,3,1,0,3,0,0,3,0,2,-3,3,0,-2,3,0,0,0,0,0,0,0], [0,1,0,1,3,1,-5,4,0,4,-1,4,0,-1,1,0,0,0,0,-4,0,4], [0,0,2,7,0,-1,1,2,0,2,-3,2,0,-2,3,0,1,0,0,-3,0,3], [0,3,-1,0,3,3,-3,3,0,4,-3,0,0,-1,3,0,0,0,0,-3,0,3], [0,1,1,2,1,2,-2,-1,12,-2,-1,-1,0,0,1,0,0,0,0,0,0,0], [0,0,3,3,2,3,-3,1,0,2,0,1,0,3,0,0,0,0,0,0,0,0], [0,1,1,4,-1,5,-1,-1,0,-2,7,-4,0,-1,5,0,0,0,0,3,0,-3], [0,0,1,3,2,4,-4,1,0,4,0,0,0,2,0,0,0,0,0,-1,0,1], [0,1,0,2,3,2,-2,0,0,2,0,-4,12,-5,0,0,1,0,0,1,0,-1], [0,3,0,0,1,3,-3,2,0,4,0,-1,0,0,0,0,3,0,0,0,0,0], [0,4,-2,0,0,3,1,0,0,-2,8,-3,0,-3,4,0,0,0,0,1,0,-1], [0,3,-3,4,-3,4,0,1,0,0,5,-5,0,0,-5,12,-4,0,0,0,0,0], [0,1,2,6,-3,2,2,0,0,0,2,-2,0,3,-2,0,3,0,0,-1,0,1], [0,2,-4,1,-2,1,-1,-4,0,6,-3,0,0,-2,3,0,-1,12,0,-1,0,1], [0,2,-1,1,-4,1,-1,1,0,2,-2,1,0,-3,2,0,0,0,12,0,0,0], [0,1,-1,-3,3,0,-4,1,0,0,2,0,0,3,-2,0,-1,0,0,4,0,8], [0,0,0,-2,2,-6,2,2,0,2,2,0,0,2,-2,0,-2,0,0,-2,12,2], [0,1,-2,2,-3,-1,1,2,0,-2,0,-1,0,0,0,0,1,0,0,4,0,8]] done, sparsity = 0.528926. Computing T_p for p = 13...Computed matrix = [[14,-8,0,-2,2,2,2,-2,0,-2,6,0,0,6,-6,0,2,0,0,2,0,-2], [0,1,2,-1,5,3,-3,2,0,4,-1,2,0,-1,1,0,2,0,0,-2,0,2], [0,0,0,0,0,1,-1,0,0,2,0,-1,0,-1,0,0,0,0,0,-1,0,1], [0,-1,4,5,1,0,4,0,0,0,1,1,0,0,-1,0,4,0,0,-1,0,1], [0,2,1,1,2,3,-3,3,0,2,0,1,0,1,0,0,2,0,0,0,0,0], [0,3,2,-1,5,1,-3,2,0,4,-1,2,0,-1,1,0,2,0,0,-2,0,2], [0,-1,4,8,-1,0,2,0,0,2,0,0,0,1,0,0,3,0,0,-1,0,1], [0,1,2,2,3,3,-3,2,0,4,0,-1,0,2,0,0,1,0,0,0,0,0], [0,2,1,1,2,1,-1,-1,14,-2,-2,-1,0,-1,2,0,0,0,0,0,0,0], [0,3,1,0,3,2,-2,3,0,4,-3,1,0,0,3,0,0,0,0,-2,0,2], [0,3,0,2,1,3,1,0,0,-2,6,-3,0,-4,8,0,-1,0,0,2,0,-2], [0,4,0,-1,4,2,-2,2,0,4,-3,1,0,-1,3,0,1,0,0,-2,0,2], [0,2,0,1,6,-1,1,0,0,2,-3,-2,14,-8,3,0,-1,0,0,1,0,-1], [0,3,-1,0,3,1,-1,3,0,4,-3,2,0,-1,3,0,0,0,0,-1,0,1], [0,3,-1,1,1,2,2,-1,0,-2,8,-2,0,-3,6,0,-1,0,0,2,0,-2], [0,2,-3,5,-2,3,1,1,0,0,4,-3,0,-1,-4,14,-6,0,0,0,0,0], [0,0,2,7,0,-1,5,0,0,0,-1,2,0,0,1,0,1,0,0,-1,0,1], [0,-1,-2,4,-3,2,-2,-6,0,6,0,0,0,1,0,0,-1,14,0,1,0,-1], [0,1,-1,2,-5,2,-2,1,0,2,-1,1,0,-2,1,0,0,0,14,0,0,0], [0,4,-4,-6,2,1,-5,4,0,0,0,-1,0,1,0,0,0,0,0,3,0,11], [0,2,0,-4,4,-8,4,2,0,2,0,0,0,0,0,0,-2,0,0,-2,14,2], [0,1,-1,2,-3,-1,1,1,0,-2,1,-2,0,1,-1,0,2,0,0,5,0,9]] done, sparsity = 0.566116. Computing T_p for p = 17...Computed matrix = [[18,-10,-2,2,-2,2,2,0,0,-2,6,-2,0,10,-6,0,0,0,0,4,0,-4], [0,3,-1,3,1,3,-3,5,0,4,-2,1,0,2,2,0,-1,0,0,-1,0,1], [0,-2,2,2,-2,0,0,2,0,2,0,-2,0,2,0,0,-2,0,0,0,0,0], [0,0,3,10,-1,1,3,1,0,0,0,0,0,0,0,0,4,0,0,-1,0,1], [0,2,2,0,6,5,-5,2,0,2,2,1,0,1,-2,0,4,0,0,-1,0,1], [0,3,1,1,3,3,-1,3,0,4,-2,-1,0,2,2,0,1,0,0,1,0,-1], [0,-1,6,7,0,1,5,-2,0,2,2,0,0,1,-2,0,5,0,0,-1,0,1], [0,2,6,0,6,5,-5,2,0,4,2,1,0,-1,-2,0,4,0,0,-1,0,1], [0,3,2,-1,4,1,-1,-2,18,-2,-2,0,0,-3,2,0,1,0,0,-1,0,1], [0,5,1,-3,5,2,-2,3,0,8,-4,2,0,-3,4,0,1,0,0,-4,0,4], [0,4,1,-2,5,2,2,-1,0,-2,10,-1,0,-7,8,0,0,0,0,0,0,0], [0,5,-1,-3,5,0,0,3,0,4,-4,4,0,-1,4,0,1,0,0,-2,0,2], [0,3,1,-1,9,-2,2,-1,0,2,-4,0,18,-11,4,0,-1,0,0,0,0,0], [0,5,1,-3,7,2,-2,1,0,4,-4,6,0,-3,4,0,1,0,0,-4,0,4], [0,4,1,0,3,3,1,-3,0,-2,8,0,0,-6,10,0,0,0,0,1,0,-1], [0,2,-2,4,0,3,1,0,0,0,4,-1,0,-3,-4,18,-6,0,0,-1,0,1], [0,0,3,6,3,-2,6,-1,0,0,-2,5,0,-3,2,0,4,0,0,-2,0,2], [0,-2,0,4,-2,3,-3,-8,0,6,2,1,0,1,-2,0,0,18,0,1,0,-1], [0,1,0,1,-4,3,-3,0,0,2,0,2,0,-3,0,0,1,0,18,-1,0,1], [0,6,-6,-6,0,2,-6,6,0,0,-2,-2,0,0,2,0,0,0,0,6,0,12], [0,2,-2,-2,2,-10,6,4,0,2,-2,-2,0,2,2,0,-4,0,0,0,18,0], [0,0,-1,2,-3,-2,2,1,0,-2,2,-3,0,3,-2,0,2,0,0,6,0,12]] done, sparsity = 0.597107. Computing T_p for p = 19...Computed matrix = [[20,-10,-2,-2,2,0,4,-2,0,-4,8,0,0,10,-8,0,2,0,0,4,0,-4], [0,5,1,-1,5,1,-1,3,0,4,0,1,0,2,0,0,1,0,0,-1,0,1], [0,0,0,0,0,-2,2,0,0,-4,0,2,0,2,0,0,0,0,0,2,0,-2], [0,-1,5,9,1,-1,5,-1,0,4,0,1,0,0,0,0,3,0,0,-3,0,3], [0,3,3,1,5,4,-4,1,0,8,-2,0,0,1,2,0,1,0,0,-2,0,2], [0,1,1,-1,5,5,-1,3,0,4,0,1,0,2,0,0,1,0,0,-1,0,1], [0,-1,5,9,-1,2,6,-1,0,0,2,0,0,1,-2,0,5,0,0,0,0,0], [0,5,1,-1,3,4,-4,3,0,4,-2,4,0,-1,2,0,3,0,0,-2,0,2], [0,3,1,1,3,2,-2,-1,20,-4,-2,0,0,-3,2,0,1,0,0,0,0,0], [0,4,0,0,6,3,-3,4,0,4,-2,3,0,-3,2,0,2,0,0,-1,0,1], [0,5,-1,3,1,4,0,1,0,-4,10,-2,0,-7,10,0,-1,0,0,2,0,-2], [0,2,2,2,4,3,-3,6,0,4,-2,3,0,-1,2,0,0,0,0,-1,0,1], [0,2,2,2,8,1,-1,2,0,0,-2,-3,20,-11,2,0,0,0,0,1,0,-1], [0,4,4,0,6,5,-5,4,0,4,-2,1,0,-1,2,0,2,0,0,-3,0,3], [0,2,4,2,4,6,-2,0,0,-4,12,-4,0,-6,8,0,2,0,0,2,0,-2], [0,1,1,7,-1,6,-2,3,0,0,6,-6,0,-3,-6,20,-5,0,0,0,0,0], [0,0,6,8,0,1,3,2,0,4,-2,-1,0,-3,2,0,6,0,0,-3,0,3], [0,1,-3,3,-5,2,-2,-9,0,8,-2,2,0,1,2,0,-1,20,0,0,0,0], [0,2,0,2,-6,3,-3,0,0,4,-2,1,0,-3,2,0,0,0,20,-1,0,1], [0,4,-4,-8,4,0,-4,4,0,0,0,0,0,0,0,0,0,0,0,8,0,12], [0,0,0,-4,4,-10,6,4,0,4,0,-2,0,2,0,0,-4,0,0,-2,20,2], [0,0,-2,4,-4,-1,1,2,0,-4,2,-3,0,3,-2,0,2,0,0,7,0,13]] done, sparsity = 0.582645. Enter level: eclib-20250122/tests/out_ntl/homtest.out000066400000000000000000000035761474421343600201140ustar00rootroot00000000000000Enter first and last levels: >>>Level 900 Sign = 1: Dimension = 186 Cuspidal dimension = 145 Sign = -1: Dimension = 175 Cuspidal dimension = 145 Sign = 0: Dimension = 361 Cuspidal dimension = 290 >>>Level 901 Sign = 1: Dimension = 82 Cuspidal dimension = 79 Sign = -1: Dimension = 79 Cuspidal dimension = 79 Sign = 0: Dimension = 161 Cuspidal dimension = 158 >>>Level 902 Sign = 1: Dimension = 130 Cuspidal dimension = 123 Sign = -1: Dimension = 123 Cuspidal dimension = 123 Sign = 0: Dimension = 253 Cuspidal dimension = 246 >>>Level 903 Sign = 1: Dimension = 120 Cuspidal dimension = 113 Sign = -1: Dimension = 113 Cuspidal dimension = 113 Sign = 0: Dimension = 233 Cuspidal dimension = 226 >>>Level 904 Sign = 1: Dimension = 118 Cuspidal dimension = 111 Sign = -1: Dimension = 111 Cuspidal dimension = 111 Sign = 0: Dimension = 229 Cuspidal dimension = 222 >>>Level 905 Sign = 1: Dimension = 92 Cuspidal dimension = 89 Sign = -1: Dimension = 89 Cuspidal dimension = 89 Sign = 0: Dimension = 181 Cuspidal dimension = 178 >>>Level 906 Sign = 1: Dimension = 156 Cuspidal dimension = 149 Sign = -1: Dimension = 149 Cuspidal dimension = 149 Sign = 0: Dimension = 305 Cuspidal dimension = 298 >>>Level 907 Sign = 1: Dimension = 76 Cuspidal dimension = 75 Sign = -1: Dimension = 75 Cuspidal dimension = 75 Sign = 0: Dimension = 151 Cuspidal dimension = 150 >>>Level 908 Sign = 1: Dimension = 117 Cuspidal dimension = 112 Sign = -1: Dimension = 112 Cuspidal dimension = 112 Sign = 0: Dimension = 229 Cuspidal dimension = 224 >>>Level 909 Sign = 1: Dimension = 104 Cuspidal dimension = 99 Sign = -1: Dimension = 101 Cuspidal dimension = 99 Sign = 0: Dimension = 205 Cuspidal dimension = 198 >>>Level 910 Sign = 1: Dimension = 176 Cuspidal dimension = 161 Sign = -1: Dimension = 161 Cuspidal dimension = 161 Sign = 0: Dimension = 337 Cuspidal dimension = 322 eclib-20250122/tests/out_ntl/mattest1.out000066400000000000000000000032671474421343600201700ustar00rootroot00000000000000 Matrix package test program. Enter size of a square matrix A: Enter entries of A: A = [[1,2], [3,4]] Using A.output(cout): [[1,2], [3,4]] Using A.output_pari(cout): [1,2;3,4] Using A.output_pretty(cout): [1 2] [3 4] Enter a filename for matrix binary output: Matrix dumped to file 1 Matrix reread from file 1 B = [[1,2], [3,4]] agree Enter any number Creating an array of 3 matrices A= [[1,2], [3,4]] 2A= [[2,4], [6,8]] 3A= [[3,6], [9,12]] row(A,1) = [1,2] row(A,2) = [3,4] A = [[1,2], [3,4]] col(A,1) = [1,3] col(A,2) = [2,4] A = [[1,2], [3,4]] directsum(A,A) = [[1,2,0,0], [3,4,0,0], [0,0,1,2], [0,0,3,4]] Enter any number B = A = [[1,2], [3,4]] Enter any number B==A?1 B!=A?0 after B+:=A, A = [[1,2], [3,4]] and B = [[2,4], [6,8]] Enter any number after B-:=A, A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number after B*:=2, A = [[1,2], [3,4]] and B = [[2,4], [6,8]] Enter any number after B/:=2, A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number A+B= [[2,4], [6,8]] Now A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number A-B= [[0,0], [0,0]] Now A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number A*B= [[7,10], [15,22]] Now A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number -A= [[-1,-2], [-3,-4]] Now A = [[1,2], [3,4]] -A= [[-1,-2], [-3,-4]] Now A = [[1,2], [3,4]] Enter any number char. poly. of A has coefficients [ -2 -5 1 ] det(A) = -2 Augmented matrix = [[1,2,1,0], [3,4,0,1]] Which echelon method? (0=standard,1=longlong,2=modular) Using method 0 Echelon matrix = [[2,0,-4,2], [0,2,3,-1]] pivotal columns: [1,2] nonpivotal columns: [3,4] Denom = 2 Rank = 2 Nullity = 0 A has inverse (1/2)* [[-4,2], [3,-1]] Check: A.A^(-1) = I ? True! eclib-20250122/tests/out_ntl/mattest2.out000066400000000000000000000032671474421343600201710ustar00rootroot00000000000000 Matrix package test program. Enter size of a square matrix A: Enter entries of A: A = [[1,2], [3,4]] Using A.output(cout): [[1,2], [3,4]] Using A.output_pari(cout): [1,2;3,4] Using A.output_pretty(cout): [1 2] [3 4] Enter a filename for matrix binary output: Matrix dumped to file 1 Matrix reread from file 1 B = [[1,2], [3,4]] agree Enter any number Creating an array of 3 matrices A= [[1,2], [3,4]] 2A= [[2,4], [6,8]] 3A= [[3,6], [9,12]] row(A,1) = [1,2] row(A,2) = [3,4] A = [[1,2], [3,4]] col(A,1) = [1,3] col(A,2) = [2,4] A = [[1,2], [3,4]] directsum(A,A) = [[1,2,0,0], [3,4,0,0], [0,0,1,2], [0,0,3,4]] Enter any number B = A = [[1,2], [3,4]] Enter any number B==A?1 B!=A?0 after B+:=A, A = [[1,2], [3,4]] and B = [[2,4], [6,8]] Enter any number after B-:=A, A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number after B*:=2, A = [[1,2], [3,4]] and B = [[2,4], [6,8]] Enter any number after B/:=2, A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number A+B= [[2,4], [6,8]] Now A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number A-B= [[0,0], [0,0]] Now A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number A*B= [[7,10], [15,22]] Now A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number -A= [[-1,-2], [-3,-4]] Now A = [[1,2], [3,4]] -A= [[-1,-2], [-3,-4]] Now A = [[1,2], [3,4]] Enter any number char. poly. of A has coefficients [ -2 -5 1 ] det(A) = -2 Augmented matrix = [[1,2,1,0], [3,4,0,1]] Which echelon method? (0=standard,1=longlong,2=modular) Using method 0 Echelon matrix = [[2,0,-4,2], [0,2,3,-1]] pivotal columns: [1,2] nonpivotal columns: [3,4] Denom = 2 Rank = 2 Nullity = 0 A has inverse (1/2)* [[-4,2], [3,-1]] Check: A.A^(-1) = I ? True! eclib-20250122/tests/out_ntl/mattest3.out000066400000000000000000000032671474421343600201720ustar00rootroot00000000000000 Matrix package test program. Enter size of a square matrix A: Enter entries of A: A = [[1,2], [3,4]] Using A.output(cout): [[1,2], [3,4]] Using A.output_pari(cout): [1,2;3,4] Using A.output_pretty(cout): [1 2] [3 4] Enter a filename for matrix binary output: Matrix dumped to file 1 Matrix reread from file 1 B = [[1,2], [3,4]] agree Enter any number Creating an array of 3 matrices A= [[1,2], [3,4]] 2A= [[2,4], [6,8]] 3A= [[3,6], [9,12]] row(A,1) = [1,2] row(A,2) = [3,4] A = [[1,2], [3,4]] col(A,1) = [1,3] col(A,2) = [2,4] A = [[1,2], [3,4]] directsum(A,A) = [[1,2,0,0], [3,4,0,0], [0,0,1,2], [0,0,3,4]] Enter any number B = A = [[1,2], [3,4]] Enter any number B==A?1 B!=A?0 after B+:=A, A = [[1,2], [3,4]] and B = [[2,4], [6,8]] Enter any number after B-:=A, A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number after B*:=2, A = [[1,2], [3,4]] and B = [[2,4], [6,8]] Enter any number after B/:=2, A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number A+B= [[2,4], [6,8]] Now A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number A-B= [[0,0], [0,0]] Now A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number A*B= [[7,10], [15,22]] Now A = [[1,2], [3,4]] and B = [[1,2], [3,4]] Enter any number -A= [[-1,-2], [-3,-4]] Now A = [[1,2], [3,4]] -A= [[-1,-2], [-3,-4]] Now A = [[1,2], [3,4]] Enter any number char. poly. of A has coefficients [ -2 -5 1 ] det(A) = -2 Augmented matrix = [[1,2,1,0], [3,4,0,1]] Which echelon method? (0=standard,1=longlong,2=modular) Using method 0 Echelon matrix = [[2,0,-4,2], [0,2,3,-1]] pivotal columns: [1,2] nonpivotal columns: [3,4] Denom = 2 Rank = 2 Nullity = 0 A has inverse (1/2)* [[-4,2], [3,-1]] Check: A.A^(-1) = I ? True! eclib-20250122/tests/out_ntl/mhcount.out000066400000000000000000000010161474421343600200710ustar00rootroot00000000000000See the matrices? How many primes? p = 3; nmats = 6; p = 5; nmats = 12; p = 7; nmats = 18; p = 11; nmats = 30; p = 13; nmats = 38; p = 17; nmats = 52; p = 19; nmats = 58; p = 23; nmats = 74; p = 29; nmats = 96; p = 31; nmats = 106; p = 37; nmats = 128; p = 41; nmats = 146; p = 43; nmats = 154; p = 47; nmats = 170; p = 53; nmats = 196; p = 59; nmats = 222; p = 61; nmats = 230; p = 67; nmats = 258; p = 71; nmats = 274; p = 73; nmats = 284; p = 79; nmats = 310; p = 83; nmats = 330; p = 89; nmats = 358; p = 97; nmats = 392; eclib-20250122/tests/out_ntl/mmattest.out000066400000000000000000000040041474421343600202520ustar00rootroot00000000000000 Multiprecision matrix package test program. Enter size of a square matrix A: Enter entries of A: A = [[1,2,3], [4,5,6], [7,8,9]] Creating an array of 3 matrices A= [[1,2,3], [4,5,6], [7,8,9]] 2A= [[2,4,6], [8,10,12], [14,16,18]] 3A= [[3,6,9], [12,15,18], [21,24,27]] row(A,1) = [1,2,3] row(A,2) = [4,5,6] row(A,3) = [7,8,9] A = [[1,2,3], [4,5,6], [7,8,9]] col(A,1) = [1,4,7] col(A,2) = [2,5,8] col(A,3) = [3,6,9] A = [[1,2,3], [4,5,6], [7,8,9]] directsum(A,A) = [[1,2,3,0,0,0], [4,5,6,0,0,0], [7,8,9,0,0,0], [0,0,0,1,2,3], [0,0,0,4,5,6], [0,0,0,7,8,9]] Enter any number After shortening to a matrix of ints, A = [[1,2,3], [4,5,6], [7,8,9]] B = A = [[1,2,3], [4,5,6], [7,8,9]] Enter any number B==A?1 B!=A?0 after B+:=A, A = [[1,2,3], [4,5,6], [7,8,9]] and B = [[2,4,6], [8,10,12], [14,16,18]] Enter any number after B-:=A, A = [[1,2,3], [4,5,6], [7,8,9]] and B = [[1,2,3], [4,5,6], [7,8,9]] Enter any number after B*:=2, A = [[1,2,3], [4,5,6], [7,8,9]] and B = [[2,4,6], [8,10,12], [14,16,18]] Enter any number after B/:=2, A = [[1,2,3], [4,5,6], [7,8,9]] and B = [[1,2,3], [4,5,6], [7,8,9]] Enter any number A+B= [[2,4,6], [8,10,12], [14,16,18]] Now A = [[1,2,3], [4,5,6], [7,8,9]] and B = [[1,2,3], [4,5,6], [7,8,9]] Enter any number A-B= [[0,0,0], [0,0,0], [0,0,0]] Now A = [[1,2,3], [4,5,6], [7,8,9]] and B = [[1,2,3], [4,5,6], [7,8,9]] Enter any number A*B= [[30,36,42], [66,81,96], [102,126,150]] Now A = [[1,2,3], [4,5,6], [7,8,9]] and B = [[1,2,3], [4,5,6], [7,8,9]] Enter any number -A= [[-1,-2,-3], [-4,-5,-6], [-7,-8,-9]] Now A = [[1,2,3], [4,5,6], [7,8,9]] -A= [[-1,-2,-3], [-4,-5,-6], [-7,-8,-9]] Now A = [[1,2,3], [4,5,6], [7,8,9]] Enter any number char. poly. of A has coefficients [ 0 -18 -15 1 ] det(A) = 0 Augmented matrix = [[1,2,3,1,0,0], [4,5,6,0,1,0], [7,8,9,0,0,1]] Which echelon method? (0=standard,1=longlong,2=modular) Echelon matrix = [[3,0,-3,0,-8,5], [0,3,6,0,7,-4], [0,0,0,3,-6,3]] pivotal columns: [1,2,4] nonpivotal columns: [3,5,6] Denom = 3 Rank = 2 Nullity = 1 A is not invertible; rk = 2 eclib-20250122/tests/out_ntl/modtest.out000066400000000000000000000010631474421343600200750ustar00rootroot00000000000000Display symbol details (0/1)? Enter first and last levels: >>>Level 900 (2160 symbols) symbols check OK! >>>Level 901 (972 symbols) symbols check OK! >>>Level 902 (1512 symbols) symbols check OK! >>>Level 903 (1408 symbols) symbols check OK! >>>Level 904 (1368 symbols) symbols check OK! >>>Level 905 (1092 symbols) symbols check OK! >>>Level 906 (1824 symbols) symbols check OK! >>>Level 907 (908 symbols) symbols check OK! >>>Level 908 (1368 symbols) symbols check OK! >>>Level 909 (1224 symbols) symbols check OK! >>>Level 910 (2016 symbols) symbols check OK! eclib-20250122/tests/out_ntl/mptest.out000066400000000000000000000124221474421343600177330ustar00rootroot00000000000000Computed 78519 primes, largest is 1000253 Extra primes in list: long prime factors of 420: [ 2 3 5 7 ] with posdivs (long version) [ 1 2 4 3 6 12 5 10 20 15 30 60 7 14 28 21 42 84 35 70 140 105 210 420 ] Elements of a are: 10 20 30 Elements of b are: 10 20 30 a = [ 10 20 30 ] end of output of a b = [ 10 20 30 ] end of output of b After b=a, b = [ 10 20 30 ] bigint versions of divisor functions: bigint prime factors of 420: [ 2 3 5 7 ] with posdivs (bigint version) [ 1 2 4 3 6 12 5 10 20 15 30 60 7 14 28 21 42 84 35 70 140 105 210 420 ] and alldivs (bigint version) [ 1 -1 2 -2 4 -4 3 -3 6 -6 12 -12 5 -5 10 -10 20 -20 15 -15 30 -30 60 -60 7 -7 14 -14 28 -28 21 -21 42 -42 84 -84 35 -35 70 -70 140 -140 105 -105 210 -210 420 -420 ] making a copy of iqlist reuse iqlist for sqdivs iqlist (should be sqdivs) [ 1 2 ] iplist (should be alldivs) [ 1 -1 2 -2 4 -4 3 -3 6 -6 12 -12 5 -5 10 -10 20 -20 15 -15 30 -30 60 -60 7 -7 14 -14 28 -28 21 -21 42 -42 84 -84 35 -35 70 -70 140 -140 105 -105 210 -210 420 -420 ] making an vector of iplist (alldivs) stream output: [ 1 -1 2 -2 4 -4 3 -3 6 -6 12 -12 5 -5 10 -10 20 -20 15 -15 30 -30 60 -60 7 -7 14 -14 28 -28 21 -21 42 -42 84 -84 35 -35 70 -70 140 -140 105 -105 210 -210 420 -420 ] irary(7) is -3 irary[3] is -2 testing find function 35 is there: 35 is item number 36 13 is not there Test of sqrt and isqrt Enter a positive bigint a (999 to stop): a = 123, sign(a) = 1 a = 123, sqrt(a) = 11 (rounded down) a is not a square Enter a positive bigint a (999 to stop): a = 121, sign(a) = 1 a = 121, sqrt(a) = 11 (rounded down) a is a square with exact square root 11 Enter a positive bigint a (999 to stop): Test of sqrt mod p Enter a prime p: 23 sqrt(1 mod p) = 1 ---OK sqrt(2 mod p) = 5 ---OK sqrt(3 mod p) = 7 ---OK sqrt(4 mod p) = 2 ---OK 5 is not a quadratic residue mod p! sqrt(6 mod p) = 11 ---OK 7 is not a quadratic residue mod p! sqrt(8 mod p) = 10 ---OK sqrt(9 mod p) = 3 ---OK 10 is not a quadratic residue mod p! 11 is not a quadratic residue mod p! sqrt(12 mod p) = 9 ---OK sqrt(13 mod p) = 6 ---OK 14 is not a quadratic residue mod p! 15 is not a quadratic residue mod p! sqrt(16 mod p) = 4 ---OK 17 is not a quadratic residue mod p! sqrt(18 mod p) = 8 ---OK 19 is not a quadratic residue mod p! 20 is not a quadratic residue mod p! 21 is not a quadratic residue mod p! 22 is not a quadratic residue mod p! 23 is not a quadratic residue mod p! sqrt(24 mod p) = 1 ---OK sqrt(25 mod p) = 5 ---OK sqrt(26 mod p) = 7 ---OK sqrt(27 mod p) = 2 ---OK 28 is not a quadratic residue mod p! sqrt(29 mod p) = 11 ---OK 30 is not a quadratic residue mod p! sqrt(31 mod p) = 10 ---OK sqrt(32 mod p) = 3 ---OK 33 is not a quadratic residue mod p! 34 is not a quadratic residue mod p! sqrt(35 mod p) = 9 ---OK sqrt(36 mod p) = 6 ---OK 37 is not a quadratic residue mod p! 38 is not a quadratic residue mod p! sqrt(39 mod p) = 4 ---OK 40 is not a quadratic residue mod p! sqrt(41 mod p) = 8 ---OK 42 is not a quadratic residue mod p! 43 is not a quadratic residue mod p! 44 is not a quadratic residue mod p! 45 is not a quadratic residue mod p! 46 is not a quadratic residue mod p! sqrt(47 mod p) = 1 ---OK sqrt(48 mod p) = 5 ---OK sqrt(49 mod p) = 7 ---OK sqrt(50 mod p) = 2 ---OK 51 is not a quadratic residue mod p! sqrt(52 mod p) = 11 ---OK 53 is not a quadratic residue mod p! sqrt(54 mod p) = 10 ---OK sqrt(55 mod p) = 3 ---OK 56 is not a quadratic residue mod p! 57 is not a quadratic residue mod p! sqrt(58 mod p) = 9 ---OK sqrt(59 mod p) = 6 ---OK 60 is not a quadratic residue mod p! 61 is not a quadratic residue mod p! sqrt(62 mod p) = 4 ---OK 63 is not a quadratic residue mod p! sqrt(64 mod p) = 8 ---OK 65 is not a quadratic residue mod p! 66 is not a quadratic residue mod p! 67 is not a quadratic residue mod p! 68 is not a quadratic residue mod p! 69 is not a quadratic residue mod p! sqrt(70 mod p) = 1 ---OK sqrt(71 mod p) = 5 ---OK sqrt(72 mod p) = 7 ---OK sqrt(73 mod p) = 2 ---OK 74 is not a quadratic residue mod p! sqrt(75 mod p) = 11 ---OK 76 is not a quadratic residue mod p! sqrt(77 mod p) = 10 ---OK sqrt(78 mod p) = 3 ---OK 79 is not a quadratic residue mod p! 80 is not a quadratic residue mod p! sqrt(81 mod p) = 9 ---OK sqrt(82 mod p) = 6 ---OK 83 is not a quadratic residue mod p! 84 is not a quadratic residue mod p! sqrt(85 mod p) = 4 ---OK 86 is not a quadratic residue mod p! sqrt(87 mod p) = 8 ---OK 88 is not a quadratic residue mod p! 89 is not a quadratic residue mod p! 90 is not a quadratic residue mod p! 91 is not a quadratic residue mod p! 92 is not a quadratic residue mod p! sqrt(93 mod p) = 1 ---OK sqrt(94 mod p) = 5 ---OK sqrt(95 mod p) = 7 ---OK sqrt(96 mod p) = 2 ---OK 97 is not a quadratic residue mod p! sqrt(98 mod p) = 11 ---OK 99 is not a quadratic residue mod p! First 100 OK Enter a prime p: 0 Enter a bigint m (0 to stop): m = 420 m has 4 prime divisors: [ 2 3 5 7 ] with exponents: 2:2 3:1 5:1 7:1 m has 48 divisors: [ 1 -1 2 -2 4 -4 3 -3 6 -6 12 -12 5 -5 10 -10 20 -20 15 -15 30 -30 60 -60 7 -7 14 -14 28 -28 21 -21 42 -42 84 -84 35 -35 70 -70 140 -140 105 -105 210 -210 420 -420 ] m has 24 positive divisors: [ 1 2 4 3 6 12 5 10 20 15 30 60 7 14 28 21 42 84 35 70 140 105 210 420 ] m has 2 positive divisors whose square divides m: [ 1 2 ] m has 16 positive square-free divisors: [ 1 2 3 6 5 10 15 30 7 14 21 42 35 70 105 210 ] Enter a bigint m (0 to stop): eclib-20250122/tests/out_ntl/mspace.out000066400000000000000000000025501474421343600176700ustar00rootroot00000000000000 M-Subspace package test program Enter size of square matrix M: Enter entries of M: M = [[1,2,3], [4,5,6], [7,8,9]] Trace(M) = 15 m^2 = [[30,36,42], [66,81,96], [102,126,150]] Trace(m^2) = 261 m^3 = [[468,576,684], [1062,1305,1548], [1656,2034,2412]] Trace(m^3) = 4185 char. poly. of m has coefficients [ 0 -18 -15 1 ] det(M) = 0 rank(M) = 2 nullity(M) = 1 kernel(m) has basis [[1], [-2], [1]] pivots: [3] denom: 1 image(m) has basis [[1,0], [0,1], [-1,2]] pivots: [1,2] denom: 1 Enter lambda: eigenspace for lambda = 1 has basis [[], [], []] with dimension 0 Now repeating eigenspace calculation modulo 6074000003 eigenspace for lambda has basis [[], [], []] with dimension 0 Enter size of square matrix M: Enter entries of M: M = [[1,2,3], [4,5,6], [7,8,9]] Trace(M) = 15 m^2 = [[30,36,42], [66,81,96], [102,126,150]] Trace(m^2) = 261 m^3 = [[468,576,684], [1062,1305,1548], [1656,2034,2412]] Trace(m^3) = 4185 char. poly. of m has coefficients [ 0 -18 -15 1 ] det(M) = 0 rank(M) = 2 nullity(M) = 1 kernel(m) has basis [[1], [-2], [1]] pivots: [3] denom: 1 image(m) has basis [[1,0], [0,1], [-1,2]] pivots: [1,2] denom: 1 Enter lambda: eigenspace for lambda = 0 has basis [[1], [-2], [1]] with dimension 1 Now repeating eigenspace calculation modulo 6074000003 eigenspace for lambda has basis [[1], [-2], [1]] with dimension 1 Enter size of square matrix M: eclib-20250122/tests/out_ntl/mvectest.out000066400000000000000000000030341474421343600202500ustar00rootroot00000000000000Test run of vector package. Enter n : Uninitialized new vector v = [] Copy of v = [] Initialized new vector v = [0,0,0,0,0,0,0,0,0,0] Copy of v = [0,0,0,0,0,0,0,0,0,0] Enter new entries of v: Now v = [1,2,3,4,5,4,3,2,1,0] w = [0,0,0] After w=v, Now v = [1,2,3,4,5,4,3,2,1,0] Now w = [1,2,3,4,5,4,3,2,1,0] w==v: 1 w!=v: 0 Enter i : After w*=2, w = [2,4,6,8,10,8,6,4,2,0] 3*v = [3,6,9,12,15,12,9,6,3,0] Now v = [1,2,3,4,5,4,3,2,1,0] v+w = [3,6,9,12,15,12,9,6,3,0] Now v = [1,2,3,4,5,4,3,2,1,0] v-w = [-1,-2,-3,-4,-5,-4,-3,-2,-1,0] Now v = [1,2,3,4,5,4,3,2,1,0] v*w = 170 Now v = [1,2,3,4,5,4,3,2,1,0] w/2 = [1,2,3,4,5,4,3,2,1,0] Now w = [2,4,6,8,10,8,6,4,2,0] -v = [-1,-2,-3,-4,-5,-4,-3,-2,-1,0] +v = [1,2,3,4,5,4,3,2,1,0] +w = [2,4,6,8,10,8,6,4,2,0] v = [1,2,3,4,5,4,3,2,1,0]; w = [2,4,6,8,10,8,6,4,2,0] Elements of v: v[1] = 1 v[2] = 2 v[3] = 3 v[4] = 4 v[5] = 5 v[6] = 4 v[7] = 3 v[8] = 2 v[9] = 1 v[10] = 0 Member test: Enter a test number: 4 IS a member of v. Subscript test Enter length of subscript vector:Enter subscript vector:The sub-vector is [4,3,2] Change one entry of v. Index?New entry?New entry: v[10] = 10 Now v = [1,2,3,4,5,4,3,2,1,10] Initial slice; length? Slice = [1,2,3,4,5] Now v = [1,2,3,4,5,4,3,2,1,10] General slice; beginning, end? Slice = [4,3,2,1,10] Now v = [1,2,3,4,5,4,3,2,1,10] w = [2,4,6,8,10,8,6,4,2,0]; content(w) = 2 After makeprimitive(w), w = [1,2,3,4,5,4,3,2,1,0] v shortened to a vector of ints: [1,2,3,4,5,4,3,2,1,10] u = [0,0,0,0,0,0,0,0,0,0] After swapvec(u,v): u = [1,2,3,4,5,4,3,2,1,10] v = [0,0,0,0,0,0,0,0,0,0] eclib-20250122/tests/out_ntl/nftest.out000066400000000000000000000013261474421343600177230ustar00rootroot00000000000000>>> Level 90 <<< After constructor, about to createfromdata() Retrieving newform data for N = 90 Finished reading newform data for N = 90 3 newform(s), 25 eigs on file. 3 newform(s) at level 90: p0=7 #ap= 25 1: aplist = [ -1 0 1 2 6 -4 -6 -4 0 -6 -4 8 0 8 0 -6 6 2 -4 -12 ...] aq = [ 1 1 -1 ] ap0 = 2, dp0 = 4, np0 = 6 SFE = 1, L/P = 2/3 lplus = 1, mplus = 1 [(-77,2;-3,7),-1,0;?] 2: aplist = [ 1 0 -1 2 -6 -4 6 -4 0 6 -4 8 0 8 0 6 -6 2 -4 12 ...] aq = [ -1 1 1 ] ap0 = 2, dp0 = 4, np0 = 6 SFE = 1, L/P = 2/3 lplus = 1, mplus = 1 [(-77,2;-3,7),-1,0;?] 3: aplist = [ 1 0 1 -4 0 2 -6 -4 0 6 8 2 6 -4 0 6 0 -10 -4 0 ...] aq = [ -1 -1 -1 ] ap0 = -4, dp0 = 24, np0 = 12 SFE = 1, L/P = 2 lplus = 1, mplus = 1 [(13,1;1,7),-2,0;?] eclib-20250122/tests/out_ntl/oftest.out000066400000000000000000000011001474421343600177120ustar00rootroot00000000000000Verbose details of oldform constructor? Enter first and last N: >>>Level 90 Old classes ~~~~~~~~~~~ Level Dimension [ 2 3 5 7 11 13 17 19 23 29 ] 15 1 [ -1 -1 -1 0 -4 -2 2 4 0 -2 ] 15 1 [ 1 -1 -1 0 -4 -2 2 4 0 -2 ] 15 1 [ -1 1 -1 0 -4 -2 2 4 0 -2 ] 15 1 [ 1 1 -1 0 -4 -2 2 4 0 -2 ] 30 1 [ 1 -1 1 -4 0 2 6 -4 0 -6 ] 30 1 [ 1 1 1 -4 0 2 6 -4 0 -6 ] 45 1 [ -1 -1 1 0 4 -2 -2 4 0 2 ] 45 1 [ 1 -1 1 0 4 -2 -2 4 0 2 ] Total number of oldclasses = 8 Total dimension of oldclasses = 8 eclib-20250122/tests/out_ntl/ptest.out000066400000000000000000000024611474421343600175600ustar00rootroot00000000000000Initialized table of 78519 primes, up to 1000253 Enter an index: prime_number(1000) = 7919 How many primes do you want to see (as a vector)? [ 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 ] Enter a number to see if it is that list: NOT in the list iota(10): [ 1 2 3 4 5 6 7 8 9 10 ] n = 527788800 exps = [ 8 2 2 2 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] Comparing previous prime list with [ 2 3 5 7 11 13 17 19 23 29 ] First starts with second, 10 items from 0: 1 First starts with second, 5 items from 5: 1 Second starts with first, 10 items from 0: 1 Second starts with first, 5 items from 5: 1 How many primes do you want to see (one by one)? Prime number 1 = 2 Prime number 2 = 3 Prime number 3 = 5 Prime number 4 = 7 Prime number 5 = 11 Prime number 6 = 13 Prime number 7 = 17 Prime number 8 = 19 Prime number 9 = 23 Prime number 10 = 29 Enter an integer m (0 to stop): Smallest prime factor of 123 is 3 m has 2 prime divisors: [ 3 41 ] with exponents: 3:1 41:1 m has 8 divisors: [ 1 -1 3 -3 41 -41 123 -123 ] m has 4 positive divisors: [ 1 3 41 123 ] m has 1 positive divisors whose square divides m: [ 1 ] m has 4 positive square-free divisors: [ 1 3 41 123 ] Enter an integer m (0 to stop): Enter integers a b (0 0 to stop): gcd = 3 lcm = 18696 Enter integers a b (0 0 to stop): eclib-20250122/tests/out_ntl/rattest.out000066400000000000000000000005351474421343600201070ustar00rootroot00000000000000Test run of rational number procs. gcd(4,6) = 2 q = 2/3 has denominator 3 and numerator 2 Enter a rational (either n or n/d): q = 41/152 has denominator 152 and numerator 41 floor(q) = 0 ceil(q) = 1 Enter three rationals separated by whitespace: q1 = 1/3 q2 = 1/2 q3 = 2/3 Enter three rationals in the format [q1:q2:q3]: [q1:q2:q3] = [1/6:1/3:1/2] eclib-20250122/tests/out_ntl/smattest1.out000066400000000000000000004350631474421343600203560ustar00rootroot00000000000000enter 0 to exit enter 1 to do all tests enter 2 to operations enter 3 to special speed test enter> enter 4 to elimination test enter> enter 5 to kernel test enter> enter 6 to multiply smat by smat enter> enter 7 to find eigenspaces enter> Test run of sparse matrix package. enter # of rows: enter # of colums: Unitialized new smat sm = row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } row[6] ={ values [] positions: [] } row[7] ={ values [] positions: [] } row[8] ={ values [] positions: [] } row[9] ={ values [] positions: [] } row[10] ={ values [] positions: [] } row[11] ={ values [] positions: [] } row[12] ={ values [] positions: [] } row[13] ={ values [] positions: [] } row[14] ={ values [] positions: [] } row[15] ={ values [] positions: [] } row[16] ={ values [] positions: [] } row[17] ={ values [] positions: [] } row[18] ={ values [] positions: [] } row[19] ={ values [] positions: [] } row[20] ={ values [] positions: [] } row[21] ={ values [] positions: [] } row[22] ={ values [] positions: [] } row[23] ={ values [] positions: [] } row[24] ={ values [] positions: [] } row[25] ={ values [] positions: [] } row[26] ={ values [] positions: [] } row[27] ={ values [] positions: [] } row[28] ={ values [] positions: [] } row[29] ={ values [] positions: [] } row[30] ={ values [] positions: [] } row[31] ={ values [] positions: [] } row[32] ={ values [] positions: [] } row[33] ={ values [] positions: [] } row[34] ={ values [] positions: [] } row[35] ={ values [] positions: [] } row[36] ={ values [] positions: [] } row[37] ={ values [] positions: [] } row[38] ={ values [] positions: [] } row[39] ={ values [] positions: [] } row[40] ={ values [] positions: [] } row[41] ={ values [] positions: [] } row[42] ={ values [] positions: [] } row[43] ={ values [] positions: [] } row[44] ={ values [] positions: [] } row[45] ={ values [] positions: [] } row[46] ={ values [] positions: [] } row[47] ={ values [] positions: [] } row[48] ={ values [] positions: [] } row[49] ={ values [] positions: [] } row[50] ={ values [] positions: [] } row[51] ={ values [] positions: [] } row[52] ={ values [] positions: [] } row[53] ={ values [] positions: [] } row[54] ={ values [] positions: [] } row[55] ={ values [] positions: [] } row[56] ={ values [] positions: [] } row[57] ={ values [] positions: [] } row[58] ={ values [] positions: [] } row[59] ={ values [] positions: [] } row[60] ={ values [] positions: [] } row[61] ={ values [] positions: [] } row[62] ={ values [] positions: [] } row[63] ={ values [] positions: [] } row[64] ={ values [] positions: [] } row[65] ={ values [] positions: [] } row[66] ={ values [] positions: [] } row[67] ={ values [] positions: [] } row[68] ={ values [] positions: [] } row[69] ={ values [] positions: [] } row[70] ={ values [] positions: [] } row[71] ={ values [] positions: [] } row[72] ={ values [] positions: [] } row[73] ={ values [] positions: [] } row[74] ={ values [] positions: [] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [] positions: [] } row[78] ={ values [] positions: [] } row[79] ={ values [] positions: [] } row[80] ={ values [] positions: [] } row[81] ={ values [] positions: [] } row[82] ={ values [] positions: [] } row[83] ={ values [] positions: [] } row[84] ={ values [] positions: [] } row[85] ={ values [] positions: [] } row[86] ={ values [] positions: [] } row[87] ={ values [] positions: [] } row[88] ={ values [] positions: [] } row[89] ={ values [] positions: [] } row[90] ={ values [] positions: [] } row[91] ={ values [] positions: [] } row[92] ={ values [] positions: [] } row[93] ={ values [] positions: [] } row[94] ={ values [] positions: [] } row[95] ={ values [] positions: [] } row[96] ={ values [] positions: [] } row[97] ={ values [] positions: [] } row[98] ={ values [] positions: [] } row[99] ={ values [] positions: [] } row[100] ={ values [] positions: [] } Enter any number Enter size of a square matrix A: Enter entries of A: A = [[1,2], [3,4]] smat from matrix A = row[1] ={ values [1,2] positions: [1,2] } row[2] ={ values [3,4] positions: [1,2] } Enter any number Copy of smat = row[1] ={ values [1,2] positions: [1,2] } row[2] ={ values [3,4] positions: [1,2] } Enter any number Copy using assignment= row[1] ={ values [1,2] positions: [1,2] } row[2] ={ values [3,4] positions: [1,2] } Enter any number enter number of rows of smat for conversion Now enter number of columns smat = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } smat as a matrix = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,1,0,0,0,0,0,0,-9,0,6,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,9,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,9,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,6,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-3,0,0,0,0,0,1,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2], [0,5,0,-10,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,-8,0,0,0,0,0,0,0,0,0,-5,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,1,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0], [0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0], [0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,6,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-3,0], [0,0,0,0,0,0,9,0,7,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,4,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,8,-7,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0], [0,0,0,0,0,0,0,0,0,0,9,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,-10,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,-1,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,8,0,-4,0,0,0,0,0,0,0,0,0,-9,0,-6,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,-8,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,4,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,-6,0,0,0,0,0,0,0,1,0,0,0,0,0,0,-5,0,0,5,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,-2,0,-4,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,-9,0,-7,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,9,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,-7,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,5,0,9,0,0,0,3,0,9,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,4,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0], [0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,6,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0], [0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,-7,0,0,0,0,0,0,-8,0,0,0,3,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,5,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,6,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,5,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,6,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,9,0,0,0,0,0,0,0,0,0,0,3,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,-10,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,9,0,0,0,0,0,9,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,7,0,0,0,-5,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,2,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,-5,0,-6,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,9,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,-9,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,-8,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0], [0,0,0,0,0,0,0,0,-2,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,-2,8,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,-3,0,-7,0], [0,0,0,0,0,0,0,0,9,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,9,0,0,-5,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0], [0,0,-1,0,0,0,0,0,0,-9,1,0,0,0,0,0,0,0,0,-2,0,-2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,9,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,0,0,0,0,-6,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,-5,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,-5,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,7,-9,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,-7,0,0,0,0,4,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] Enter any number Enter position: (row,col)T(50 , 50) = 0 testing set_row enter new row : which row ? (starting from zero) number of non-zero elements ? values ? positions ? new matrix : row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [1,2,3] positions: [10,20,30] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } testing operations Enter size of smat A row,col: Enter size of smat B: row,col: matrix A row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } matrix B row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number C = A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number B==A?1 B!=A?0 C==A?1 C!=A?0 Enter any number after B+=A, A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-20,-8] positions: [40,94] } row[2] ={ values [12,18] positions: [38,56] } row[3] ={ values [10,12,-2,-14,-20,2,-18,12] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [18,2,-2,6,-14] positions: [9,14,37,46,86] } row[5] ={ values [-10,14,-4,4,-8,18] positions: [24,25,40,66,70,83] } row[6] ={ values [-14,12,18,-18] positions: [39,58,65,98] } row[7] ={ values [6,14,12,-12,-4] positions: [22,26,48,84,85] } row[8] ={ values [18,18,4,-20,12] positions: [54,60,61,91,92] } row[9] ={ values [12,-16,10,4,18] positions: [21,35,52,73,96] } row[10] ={ values [2,16,-2,-6,2,12,2,4] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [10,-20,-6,2,6,-8,-16,-10] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [10,16] positions: [56,91] } row[13] ={ values [16,2,18,8,-6,10] positions: [7,17,19,41,82,88] } row[14] ={ values [-8,6] positions: [69,97] } row[15] ={ values [-18,-14] positions: [2,66] } row[16] ={ values [18,14,12,-16] positions: [44,60,75,94] } row[17] ={ values [-6,18,12,-8,-8,-10,-12] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-2,-6] positions: [48,67] } row[19] ={ values [10,-2,-6] positions: [30,97,99] } row[20] ={ values [18,14,-10,10,18,8,-12,4] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [18] positions: [73] } row[22] ={ values [16,-6] positions: [12,72] } row[23] ={ values [2,-12,8] positions: [33,61,97] } row[24] ={ values [-2,16,-14,-12,-4,-20,6] positions: [37,42,43,54,82,84,97] } row[25] ={ values [18,-6,16,-16,-10,18,-12,-20,14] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-2,-18,-8,-6,-10,2] positions: [9,11,25,28,79,94] } row[27] ={ values [-18,6,-2,16,-16] positions: [10,39,47,75,95] } row[28] ={ values [-10] positions: [74] } row[29] ={ values [-16,-2,10,-4] positions: [7,20,74,77] } row[30] ={ values [4,10] positions: [40,61] } row[31] ={ values [8] positions: [65] } row[32] ={ values [12] positions: [32] } row[33] ={ values [-12,16] positions: [11,92] } row[34] ={ values [10,2,2,18,16,-8,-18,-12] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [18,-18,14,6,16] positions: [23,51,64,80,84] } row[36] ={ values [-4,6,4] positions: [14,25,70] } row[37] ={ values [-12,6,-2,-20,-8] positions: [21,29,76,83,97] } row[38] ={ values [-16,-6,-12] positions: [25,42,69] } row[39] ={ values [10,16,-14,-20] positions: [48,74,83,91] } row[40] ={ values [-16,-8,-6,18,-18] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-8,-6] positions: [1,37] } row[43] ={ values [-14,-14,2,18,8] positions: [20,51,78,91,94] } row[44] ={ values [12] positions: [69] } row[45] ={ values [-8,-4,-12,2,-10,10,-12,2] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-16,16] positions: [25,44] } row[47] ={ values [-4,-8,-10,12,6,4,-18,-14,8] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-4,18,18,8] positions: [33,38,40,71] } row[49] ={ values [18] positions: [35] } row[50] ={ values [-14,-12,-16,10,18,6,18,-4,-4] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [8,14,-12,-18,8,-4,8] positions: [15,17,45,61,72,75,96] } row[53] ={ values [4,10] positions: [38,58] } row[54] ={ values [14,-4] positions: [26,94] } row[55] ={ values [-16,18,4,-4] positions: [2,36,60,98] } row[56] ={ values [-8] positions: [19] } row[57] ={ values [14,14,8,-16,18,-2,12,18] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-6,18,12,-14,-16,6,4,10,-12] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-16] positions: [95] } row[60] ={ values [2,-20,12,16,10,12,-20,-10] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [6,10] positions: [10,17] } row[62] ={ values [10,-8,-16,12,-18,-16,6,-16] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [18,6,-16,-8,-20,-20,-20] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-6,-2,18,18] positions: [51,86,88,94] } row[65] ={ values [4,8] positions: [79,92] } row[66] ={ values [14,-10,-8,16] positions: [9,13,19,37] } row[67] ={ values [-6,8,-2,-20,-2] positions: [27,55,66,80,97] } row[68] ={ values [-4,-12] positions: [33,70] } row[69] ={ values [-20] positions: [81] } row[70] ={ values [-2,-10,-4,2] positions: [34,45,53,89] } row[71] ={ values [12,4,-2,12] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-14,-14] positions: [42,72] } row[74] ={ values [-14,-2,-4,14,-20,-10,-12,-6] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [2] positions: [18] } row[78] ={ values [-14,-20,-8,4,18,18] positions: [22,43,51,72,75,83] } row[79] ={ values [-10] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-4,10,4,-18] positions: [51,70,86,87] } row[82] ={ values [4,-16,2] positions: [32,36,41] } row[83] ={ values [16,-16,18,-14,-2,-14,-12] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-4,-18,16,14,-10,14,-4,16] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [4,-14,-8,2,-12,16,-6,-14] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [18,-2,-10,-6] positions: [9,13,54,80] } row[87] ={ values [2,-14,-14] positions: [14,48,83] } row[88] ={ values [-12,2,18,18,-10,-10,-2,18] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-2,-18,2,-4,-4,4,8] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-14,4,12,4] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [8,18,-4] positions: [80,85,87] } row[94] ={ values [-12] positions: [94] } row[95] ={ values [10,-14,-12,-4,10,-16] positions: [20,22,41,51,72,84] } row[96] ={ values [2,-12,-14,-20,-10,10,6,-10,-16] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-20,-20,14,-18,-6,-20,6] positions: [17,20,34,35,41,66,85] } row[98] ={ values [18,-4,-4] positions: [36,59,74] } row[99] ={ values [-4] positions: [43] } row[100] ={ values [-4,10,-12,-14,8,-12,18] positions: [13,35,47,53,58,68,82] } Enter any number after B-=A, A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number after B*=2, B = row[1] ={ values [-20,-8] positions: [40,94] } row[2] ={ values [12,18] positions: [38,56] } row[3] ={ values [10,12,-2,-14,-20,2,-18,12] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [18,2,-2,6,-14] positions: [9,14,37,46,86] } row[5] ={ values [-10,14,-4,4,-8,18] positions: [24,25,40,66,70,83] } row[6] ={ values [-14,12,18,-18] positions: [39,58,65,98] } row[7] ={ values [6,14,12,-12,-4] positions: [22,26,48,84,85] } row[8] ={ values [18,18,4,-20,12] positions: [54,60,61,91,92] } row[9] ={ values [12,-16,10,4,18] positions: [21,35,52,73,96] } row[10] ={ values [2,16,-2,-6,2,12,2,4] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [10,-20,-6,2,6,-8,-16,-10] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [10,16] positions: [56,91] } row[13] ={ values [16,2,18,8,-6,10] positions: [7,17,19,41,82,88] } row[14] ={ values [-8,6] positions: [69,97] } row[15] ={ values [-18,-14] positions: [2,66] } row[16] ={ values [18,14,12,-16] positions: [44,60,75,94] } row[17] ={ values [-6,18,12,-8,-8,-10,-12] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-2,-6] positions: [48,67] } row[19] ={ values [10,-2,-6] positions: [30,97,99] } row[20] ={ values [18,14,-10,10,18,8,-12,4] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [18] positions: [73] } row[22] ={ values [16,-6] positions: [12,72] } row[23] ={ values [2,-12,8] positions: [33,61,97] } row[24] ={ values [-2,16,-14,-12,-4,-20,6] positions: [37,42,43,54,82,84,97] } row[25] ={ values [18,-6,16,-16,-10,18,-12,-20,14] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-2,-18,-8,-6,-10,2] positions: [9,11,25,28,79,94] } row[27] ={ values [-18,6,-2,16,-16] positions: [10,39,47,75,95] } row[28] ={ values [-10] positions: [74] } row[29] ={ values [-16,-2,10,-4] positions: [7,20,74,77] } row[30] ={ values [4,10] positions: [40,61] } row[31] ={ values [8] positions: [65] } row[32] ={ values [12] positions: [32] } row[33] ={ values [-12,16] positions: [11,92] } row[34] ={ values [10,2,2,18,16,-8,-18,-12] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [18,-18,14,6,16] positions: [23,51,64,80,84] } row[36] ={ values [-4,6,4] positions: [14,25,70] } row[37] ={ values [-12,6,-2,-20,-8] positions: [21,29,76,83,97] } row[38] ={ values [-16,-6,-12] positions: [25,42,69] } row[39] ={ values [10,16,-14,-20] positions: [48,74,83,91] } row[40] ={ values [-16,-8,-6,18,-18] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-8,-6] positions: [1,37] } row[43] ={ values [-14,-14,2,18,8] positions: [20,51,78,91,94] } row[44] ={ values [12] positions: [69] } row[45] ={ values [-8,-4,-12,2,-10,10,-12,2] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-16,16] positions: [25,44] } row[47] ={ values [-4,-8,-10,12,6,4,-18,-14,8] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-4,18,18,8] positions: [33,38,40,71] } row[49] ={ values [18] positions: [35] } row[50] ={ values [-14,-12,-16,10,18,6,18,-4,-4] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [8,14,-12,-18,8,-4,8] positions: [15,17,45,61,72,75,96] } row[53] ={ values [4,10] positions: [38,58] } row[54] ={ values [14,-4] positions: [26,94] } row[55] ={ values [-16,18,4,-4] positions: [2,36,60,98] } row[56] ={ values [-8] positions: [19] } row[57] ={ values [14,14,8,-16,18,-2,12,18] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-6,18,12,-14,-16,6,4,10,-12] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-16] positions: [95] } row[60] ={ values [2,-20,12,16,10,12,-20,-10] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [6,10] positions: [10,17] } row[62] ={ values [10,-8,-16,12,-18,-16,6,-16] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [18,6,-16,-8,-20,-20,-20] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-6,-2,18,18] positions: [51,86,88,94] } row[65] ={ values [4,8] positions: [79,92] } row[66] ={ values [14,-10,-8,16] positions: [9,13,19,37] } row[67] ={ values [-6,8,-2,-20,-2] positions: [27,55,66,80,97] } row[68] ={ values [-4,-12] positions: [33,70] } row[69] ={ values [-20] positions: [81] } row[70] ={ values [-2,-10,-4,2] positions: [34,45,53,89] } row[71] ={ values [12,4,-2,12] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-14,-14] positions: [42,72] } row[74] ={ values [-14,-2,-4,14,-20,-10,-12,-6] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [2] positions: [18] } row[78] ={ values [-14,-20,-8,4,18,18] positions: [22,43,51,72,75,83] } row[79] ={ values [-10] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-4,10,4,-18] positions: [51,70,86,87] } row[82] ={ values [4,-16,2] positions: [32,36,41] } row[83] ={ values [16,-16,18,-14,-2,-14,-12] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-4,-18,16,14,-10,14,-4,16] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [4,-14,-8,2,-12,16,-6,-14] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [18,-2,-10,-6] positions: [9,13,54,80] } row[87] ={ values [2,-14,-14] positions: [14,48,83] } row[88] ={ values [-12,2,18,18,-10,-10,-2,18] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-2,-18,2,-4,-4,4,8] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-14,4,12,4] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [8,18,-4] positions: [80,85,87] } row[94] ={ values [-12] positions: [94] } row[95] ={ values [10,-14,-12,-4,10,-16] positions: [20,22,41,51,72,84] } row[96] ={ values [2,-12,-14,-20,-10,10,6,-10,-16] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-20,-20,14,-18,-6,-20,6] positions: [17,20,34,35,41,66,85] } row[98] ={ values [18,-4,-4] positions: [36,59,74] } row[99] ={ values [-4] positions: [43] } row[100] ={ values [-4,10,-12,-14,8,-12,18] positions: [13,35,47,53,58,68,82] } Enter any number after B/=2, B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number A+B=row[1] ={ values [-20,-8] positions: [40,94] } row[2] ={ values [12,18] positions: [38,56] } row[3] ={ values [10,12,-2,-14,-20,2,-18,12] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [18,2,-2,6,-14] positions: [9,14,37,46,86] } row[5] ={ values [-10,14,-4,4,-8,18] positions: [24,25,40,66,70,83] } row[6] ={ values [-14,12,18,-18] positions: [39,58,65,98] } row[7] ={ values [6,14,12,-12,-4] positions: [22,26,48,84,85] } row[8] ={ values [18,18,4,-20,12] positions: [54,60,61,91,92] } row[9] ={ values [12,-16,10,4,18] positions: [21,35,52,73,96] } row[10] ={ values [2,16,-2,-6,2,12,2,4] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [10,-20,-6,2,6,-8,-16,-10] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [10,16] positions: [56,91] } row[13] ={ values [16,2,18,8,-6,10] positions: [7,17,19,41,82,88] } row[14] ={ values [-8,6] positions: [69,97] } row[15] ={ values [-18,-14] positions: [2,66] } row[16] ={ values [18,14,12,-16] positions: [44,60,75,94] } row[17] ={ values [-6,18,12,-8,-8,-10,-12] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-2,-6] positions: [48,67] } row[19] ={ values [10,-2,-6] positions: [30,97,99] } row[20] ={ values [18,14,-10,10,18,8,-12,4] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [18] positions: [73] } row[22] ={ values [16,-6] positions: [12,72] } row[23] ={ values [2,-12,8] positions: [33,61,97] } row[24] ={ values [-2,16,-14,-12,-4,-20,6] positions: [37,42,43,54,82,84,97] } row[25] ={ values [18,-6,16,-16,-10,18,-12,-20,14] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-2,-18,-8,-6,-10,2] positions: [9,11,25,28,79,94] } row[27] ={ values [-18,6,-2,16,-16] positions: [10,39,47,75,95] } row[28] ={ values [-10] positions: [74] } row[29] ={ values [-16,-2,10,-4] positions: [7,20,74,77] } row[30] ={ values [4,10] positions: [40,61] } row[31] ={ values [8] positions: [65] } row[32] ={ values [12] positions: [32] } row[33] ={ values [-12,16] positions: [11,92] } row[34] ={ values [10,2,2,18,16,-8,-18,-12] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [18,-18,14,6,16] positions: [23,51,64,80,84] } row[36] ={ values [-4,6,4] positions: [14,25,70] } row[37] ={ values [-12,6,-2,-20,-8] positions: [21,29,76,83,97] } row[38] ={ values [-16,-6,-12] positions: [25,42,69] } row[39] ={ values [10,16,-14,-20] positions: [48,74,83,91] } row[40] ={ values [-16,-8,-6,18,-18] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-8,-6] positions: [1,37] } row[43] ={ values [-14,-14,2,18,8] positions: [20,51,78,91,94] } row[44] ={ values [12] positions: [69] } row[45] ={ values [-8,-4,-12,2,-10,10,-12,2] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-16,16] positions: [25,44] } row[47] ={ values [-4,-8,-10,12,6,4,-18,-14,8] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-4,18,18,8] positions: [33,38,40,71] } row[49] ={ values [18] positions: [35] } row[50] ={ values [-14,-12,-16,10,18,6,18,-4,-4] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [8,14,-12,-18,8,-4,8] positions: [15,17,45,61,72,75,96] } row[53] ={ values [4,10] positions: [38,58] } row[54] ={ values [14,-4] positions: [26,94] } row[55] ={ values [-16,18,4,-4] positions: [2,36,60,98] } row[56] ={ values [-8] positions: [19] } row[57] ={ values [14,14,8,-16,18,-2,12,18] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-6,18,12,-14,-16,6,4,10,-12] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-16] positions: [95] } row[60] ={ values [2,-20,12,16,10,12,-20,-10] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [6,10] positions: [10,17] } row[62] ={ values [10,-8,-16,12,-18,-16,6,-16] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [18,6,-16,-8,-20,-20,-20] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-6,-2,18,18] positions: [51,86,88,94] } row[65] ={ values [4,8] positions: [79,92] } row[66] ={ values [14,-10,-8,16] positions: [9,13,19,37] } row[67] ={ values [-6,8,-2,-20,-2] positions: [27,55,66,80,97] } row[68] ={ values [-4,-12] positions: [33,70] } row[69] ={ values [-20] positions: [81] } row[70] ={ values [-2,-10,-4,2] positions: [34,45,53,89] } row[71] ={ values [12,4,-2,12] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-14,-14] positions: [42,72] } row[74] ={ values [-14,-2,-4,14,-20,-10,-12,-6] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [2] positions: [18] } row[78] ={ values [-14,-20,-8,4,18,18] positions: [22,43,51,72,75,83] } row[79] ={ values [-10] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-4,10,4,-18] positions: [51,70,86,87] } row[82] ={ values [4,-16,2] positions: [32,36,41] } row[83] ={ values [16,-16,18,-14,-2,-14,-12] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-4,-18,16,14,-10,14,-4,16] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [4,-14,-8,2,-12,16,-6,-14] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [18,-2,-10,-6] positions: [9,13,54,80] } row[87] ={ values [2,-14,-14] positions: [14,48,83] } row[88] ={ values [-12,2,18,18,-10,-10,-2,18] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-2,-18,2,-4,-4,4,8] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-14,4,12,4] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [8,18,-4] positions: [80,85,87] } row[94] ={ values [-12] positions: [94] } row[95] ={ values [10,-14,-12,-4,10,-16] positions: [20,22,41,51,72,84] } row[96] ={ values [2,-12,-14,-20,-10,10,6,-10,-16] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-20,-20,14,-18,-6,-20,6] positions: [17,20,34,35,41,66,85] } row[98] ={ values [18,-4,-4] positions: [36,59,74] } row[99] ={ values [-4] positions: [43] } row[100] ={ values [-4,10,-12,-14,8,-12,18] positions: [13,35,47,53,58,68,82] } Now A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number A-B=row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } row[6] ={ values [] positions: [] } row[7] ={ values [] positions: [] } row[8] ={ values [] positions: [] } row[9] ={ values [] positions: [] } row[10] ={ values [] positions: [] } row[11] ={ values [] positions: [] } row[12] ={ values [] positions: [] } row[13] ={ values [] positions: [] } row[14] ={ values [] positions: [] } row[15] ={ values [] positions: [] } row[16] ={ values [] positions: [] } row[17] ={ values [] positions: [] } row[18] ={ values [] positions: [] } row[19] ={ values [] positions: [] } row[20] ={ values [] positions: [] } row[21] ={ values [] positions: [] } row[22] ={ values [] positions: [] } row[23] ={ values [] positions: [] } row[24] ={ values [] positions: [] } row[25] ={ values [] positions: [] } row[26] ={ values [] positions: [] } row[27] ={ values [] positions: [] } row[28] ={ values [] positions: [] } row[29] ={ values [] positions: [] } row[30] ={ values [] positions: [] } row[31] ={ values [] positions: [] } row[32] ={ values [] positions: [] } row[33] ={ values [] positions: [] } row[34] ={ values [] positions: [] } row[35] ={ values [] positions: [] } row[36] ={ values [] positions: [] } row[37] ={ values [] positions: [] } row[38] ={ values [] positions: [] } row[39] ={ values [] positions: [] } row[40] ={ values [] positions: [] } row[41] ={ values [] positions: [] } row[42] ={ values [] positions: [] } row[43] ={ values [] positions: [] } row[44] ={ values [] positions: [] } row[45] ={ values [] positions: [] } row[46] ={ values [] positions: [] } row[47] ={ values [] positions: [] } row[48] ={ values [] positions: [] } row[49] ={ values [] positions: [] } row[50] ={ values [] positions: [] } row[51] ={ values [] positions: [] } row[52] ={ values [] positions: [] } row[53] ={ values [] positions: [] } row[54] ={ values [] positions: [] } row[55] ={ values [] positions: [] } row[56] ={ values [] positions: [] } row[57] ={ values [] positions: [] } row[58] ={ values [] positions: [] } row[59] ={ values [] positions: [] } row[60] ={ values [] positions: [] } row[61] ={ values [] positions: [] } row[62] ={ values [] positions: [] } row[63] ={ values [] positions: [] } row[64] ={ values [] positions: [] } row[65] ={ values [] positions: [] } row[66] ={ values [] positions: [] } row[67] ={ values [] positions: [] } row[68] ={ values [] positions: [] } row[69] ={ values [] positions: [] } row[70] ={ values [] positions: [] } row[71] ={ values [] positions: [] } row[72] ={ values [] positions: [] } row[73] ={ values [] positions: [] } row[74] ={ values [] positions: [] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [] positions: [] } row[78] ={ values [] positions: [] } row[79] ={ values [] positions: [] } row[80] ={ values [] positions: [] } row[81] ={ values [] positions: [] } row[82] ={ values [] positions: [] } row[83] ={ values [] positions: [] } row[84] ={ values [] positions: [] } row[85] ={ values [] positions: [] } row[86] ={ values [] positions: [] } row[87] ={ values [] positions: [] } row[88] ={ values [] positions: [] } row[89] ={ values [] positions: [] } row[90] ={ values [] positions: [] } row[91] ={ values [] positions: [] } row[92] ={ values [] positions: [] } row[93] ={ values [] positions: [] } row[94] ={ values [] positions: [] } row[95] ={ values [] positions: [] } row[96] ={ values [] positions: [] } row[97] ={ values [] positions: [] } row[98] ={ values [] positions: [] } row[99] ={ values [] positions: [] } row[100] ={ values [] positions: [] } Now A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } test addition of scalar to smat After adding 17 to A it is now: row[1] ={ values [17,-10,-4] positions: [1,40,94] } row[2] ={ values [17,6,9] positions: [2,38,56] } row[3] ={ values [17,5,6,-1,-7,-10,1,-9,6] positions: [3,19,37,45,54,82,84,91,93] } row[4] ={ values [17,9,1,-1,3,-7] positions: [4,9,14,37,46,86] } row[5] ={ values [17,-5,7,-2,2,-4,9] positions: [5,24,25,40,66,70,83] } row[6] ={ values [17,-7,6,9,-9] positions: [6,39,58,65,98] } row[7] ={ values [17,3,7,6,-6,-2] positions: [7,22,26,48,84,85] } row[8] ={ values [17,9,9,2,-10,6] positions: [8,54,60,61,91,92] } row[9] ={ values [17,6,-8,5,2,9] positions: [9,21,35,52,73,96] } row[10] ={ values [17,1,8,-1,-3,1,6,1,2] positions: [10,13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,17,1,3,-4,-8,-5] positions: [2,4,6,11,43,61,88,89,99] } row[12] ={ values [17,5,8] positions: [12,56,91] } row[13] ={ values [8,17,1,9,4,-3,5] positions: [7,13,17,19,41,82,88] } row[14] ={ values [17,-4,3] positions: [14,69,97] } row[15] ={ values [-9,17,-7] positions: [2,15,66] } row[16] ={ values [17,9,7,6,-8] positions: [16,44,60,75,94] } row[17] ={ values [-3,17,9,6,-4,-4,-5,-6] positions: [7,17,23,26,34,50,68,94] } row[18] ={ values [17,-1,-3] positions: [18,48,67] } row[19] ={ values [17,5,-1,-3] positions: [19,30,97,99] } row[20] ={ values [9,7,-5,17,5,9,4,-6,2] positions: [7,9,11,20,24,34,43,46,74] } row[21] ={ values [17,9] positions: [21,73] } row[22] ={ values [8,17,-3] positions: [12,22,72] } row[23] ={ values [17,1,-6,4] positions: [23,33,61,97] } row[24] ={ values [17,-1,8,-7,-6,-2,-10,3] positions: [24,37,42,43,54,82,84,97] } row[25] ={ values [9,-3,17,8,-8,-5,9,-6,-10,7] positions: [11,12,25,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,17,-3,-5,1] positions: [9,11,25,26,28,79,94] } row[27] ={ values [-9,17,3,-1,8,-8] positions: [10,27,39,47,75,95] } row[28] ={ values [17,-5] positions: [28,74] } row[29] ={ values [-8,-1,17,5,-2] positions: [7,20,29,74,77] } row[30] ={ values [17,2,5] positions: [30,40,61] } row[31] ={ values [17,4] positions: [31,65] } row[32] ={ values [23] positions: [32] } row[33] ={ values [-6,17,8] positions: [11,33,92] } row[34] ={ values [5,1,1,17,9,8,-4,-9,-6] positions: [12,31,33,34,76,79,81,91,93] } row[35] ={ values [9,17,-9,7,3,8] positions: [23,35,51,64,80,84] } row[36] ={ values [-2,3,17,2] positions: [14,25,36,70] } row[37] ={ values [-6,3,17,-1,-10,-4] positions: [21,29,37,76,83,97] } row[38] ={ values [-8,17,-3,-6] positions: [25,38,42,69] } row[39] ={ values [17,5,8,-7,-10] positions: [39,48,74,83,91] } row[40] ={ values [-8,-4,-3,17,9,-9] positions: [6,11,25,40,54,59] } row[41] ={ values [17] positions: [41] } row[42] ={ values [-4,-3,17] positions: [1,37,42] } row[43] ={ values [-7,17,-7,1,9,4] positions: [20,43,51,78,91,94] } row[44] ={ values [17,6] positions: [44,69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,17,1] positions: [6,20,21,29,36,39,43,45,59] } row[46] ={ values [-8,8,17] positions: [25,44,46] } row[47] ={ values [-2,-4,-5,6,17,3,2,-9,-7,4] positions: [5,7,9,37,47,50,55,61,63,71] } row[48] ={ values [-2,9,9,17,4] positions: [33,38,40,48,71] } row[49] ={ values [9,17] positions: [35,49] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,17,-2] positions: [5,11,28,32,34,38,40,45,50,80] } row[51] ={ values [17] positions: [51] } row[52] ={ values [4,7,-6,17,-9,4,-2,4] positions: [15,17,45,52,61,72,75,96] } row[53] ={ values [2,17,5] positions: [38,53,58] } row[54] ={ values [7,17,-2] positions: [26,54,94] } row[55] ={ values [-8,9,17,2,-2] positions: [2,36,55,60,98] } row[56] ={ values [-4,17] positions: [19,56] } row[57] ={ values [7,7,4,-8,17,9,-1,6,9] positions: [6,18,32,39,57,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,17,5,-6] positions: [2,16,26,32,39,43,54,58,66,67] } row[59] ={ values [17,-8] positions: [59,95] } row[60] ={ values [1,-10,6,8,17,5,6,-10,-5] positions: [8,17,26,37,60,62,72,75,92] } row[61] ={ values [3,5,17] positions: [10,17,61] } row[62] ={ values [5,-4,-8,6,-9,-8,17,3,-8] positions: [6,14,34,35,49,57,62,66,84] } row[63] ={ values [9,3,-8,13,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,17,-1,9,9] positions: [51,64,86,88,94] } row[65] ={ values [17,2,4] positions: [65,79,92] } row[66] ={ values [7,-5,-4,8,17] positions: [9,13,19,37,66] } row[67] ={ values [-3,4,-1,17,-10,-1] positions: [27,55,66,67,80,97] } row[68] ={ values [-2,17,-6] positions: [33,68,70] } row[69] ={ values [17,-10] positions: [69,81] } row[70] ={ values [-1,-5,-2,17,1] positions: [34,45,53,70,89] } row[71] ={ values [6,2,-1,17,6] positions: [61,64,70,71,88] } row[72] ={ values [17] positions: [72] } row[73] ={ values [-7,-7,17] positions: [42,72,73] } row[74] ={ values [-7,-1,-2,7,7,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [17] positions: [75] } row[76] ={ values [17] positions: [76] } row[77] ={ values [1,17] positions: [18,77] } row[78] ={ values [-7,-10,-4,2,9,17,9] positions: [22,43,51,72,75,78,83] } row[79] ={ values [-5,17] positions: [8,79] } row[80] ={ values [17] positions: [80] } row[81] ={ values [-2,5,17,2,-9] positions: [51,70,81,86,87] } row[82] ={ values [2,-8,1,17] positions: [32,36,41,82] } row[83] ={ values [8,-8,9,-7,-1,-7,17,-6] positions: [15,27,32,48,60,65,83,97] } row[84] ={ values [-2,-9,8,7,-5,17,7,-2,8] positions: [9,12,34,35,38,84,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,17,8,-3,-7] positions: [22,31,39,59,74,85,95,97,99] } row[86] ={ values [9,-1,-5,-3,17] positions: [9,13,54,80,86] } row[87] ={ values [1,-7,-7,17] positions: [14,48,83,87] } row[88] ={ values [-6,1,9,9,-5,-5,-1,17,9] positions: [6,40,47,59,62,73,82,88,91] } row[89] ={ values [-1,-9,1,-2,-2,2,21] positions: [3,10,11,20,22,30,89] } row[90] ={ values [17] positions: [90] } row[91] ={ values [-7,2,6,17,2] positions: [30,44,51,91,99] } row[92] ={ values [17] positions: [92] } row[93] ={ values [4,9,-2,17] positions: [80,85,87,93] } row[94] ={ values [11] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8,17] positions: [20,22,41,51,72,84,95] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8,17] positions: [3,8,13,27,34,41,68,69,70,96] } row[97] ={ values [-10,-10,7,-9,-3,-10,3,17] positions: [17,20,34,35,41,66,85,97] } row[98] ={ values [9,-2,-2,17] positions: [36,59,74,98] } row[99] ={ values [-2,17] positions: [43,99] } row[100] ={ values [-2,5,-6,-7,4,-6,9,17] positions: [13,35,47,53,58,68,82,100] } After subtracting 17 again it is now: row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } scalar addition OK A = 5x5 zero smat: row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } After adding 17 to A it is now: row[1] ={ values [17] positions: [1] } row[2] ={ values [17] positions: [2] } row[3] ={ values [17] positions: [3] } row[4] ={ values [17] positions: [4] } row[5] ={ values [17] positions: [5] } After subtracting 17 again it is now: row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } scalar addition OK test multiplication of smat by matrix enter smat: first row, col and then the rows now enter matrix: first row, col and then the entries the smat is (as a matrix) [[0,-10,-4], [0,6,0], [5,-7,6]] the matrix is [[1,2,3,4], [0,5,6,0], [7,8,9,10]] the product matrix is: [[-28,-82,-96,-40], [0,30,36,0], [47,23,27,80]] Correct Testing transpose function A=(A^t)^t ? yes! enter new value of t test of kernel function enter size of matrix for elimination (row,col) Do you want to input the matrix for elimination or do you want a matrix with random entries? (1 for random and zero otherwise want to determine the rank using matrix? (1 = yes; 0 = no )How many maximum number of non-zero entries per row? enter seed for random number generator calculating matrix, done rank using echmodp : 95 number of non-zero entries: 525 rank is:95 number of non-zero entries: 427 kernel correct enter new value of t eclib-20250122/tests/out_ntl/smattest2.out000066400000000000000000004350631474421343600203570ustar00rootroot00000000000000enter 0 to exit enter 1 to do all tests enter 2 to operations enter 3 to special speed test enter> enter 4 to elimination test enter> enter 5 to kernel test enter> enter 6 to multiply smat by smat enter> enter 7 to find eigenspaces enter> Test run of sparse matrix package. enter # of rows: enter # of colums: Unitialized new smat sm = row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } row[6] ={ values [] positions: [] } row[7] ={ values [] positions: [] } row[8] ={ values [] positions: [] } row[9] ={ values [] positions: [] } row[10] ={ values [] positions: [] } row[11] ={ values [] positions: [] } row[12] ={ values [] positions: [] } row[13] ={ values [] positions: [] } row[14] ={ values [] positions: [] } row[15] ={ values [] positions: [] } row[16] ={ values [] positions: [] } row[17] ={ values [] positions: [] } row[18] ={ values [] positions: [] } row[19] ={ values [] positions: [] } row[20] ={ values [] positions: [] } row[21] ={ values [] positions: [] } row[22] ={ values [] positions: [] } row[23] ={ values [] positions: [] } row[24] ={ values [] positions: [] } row[25] ={ values [] positions: [] } row[26] ={ values [] positions: [] } row[27] ={ values [] positions: [] } row[28] ={ values [] positions: [] } row[29] ={ values [] positions: [] } row[30] ={ values [] positions: [] } row[31] ={ values [] positions: [] } row[32] ={ values [] positions: [] } row[33] ={ values [] positions: [] } row[34] ={ values [] positions: [] } row[35] ={ values [] positions: [] } row[36] ={ values [] positions: [] } row[37] ={ values [] positions: [] } row[38] ={ values [] positions: [] } row[39] ={ values [] positions: [] } row[40] ={ values [] positions: [] } row[41] ={ values [] positions: [] } row[42] ={ values [] positions: [] } row[43] ={ values [] positions: [] } row[44] ={ values [] positions: [] } row[45] ={ values [] positions: [] } row[46] ={ values [] positions: [] } row[47] ={ values [] positions: [] } row[48] ={ values [] positions: [] } row[49] ={ values [] positions: [] } row[50] ={ values [] positions: [] } row[51] ={ values [] positions: [] } row[52] ={ values [] positions: [] } row[53] ={ values [] positions: [] } row[54] ={ values [] positions: [] } row[55] ={ values [] positions: [] } row[56] ={ values [] positions: [] } row[57] ={ values [] positions: [] } row[58] ={ values [] positions: [] } row[59] ={ values [] positions: [] } row[60] ={ values [] positions: [] } row[61] ={ values [] positions: [] } row[62] ={ values [] positions: [] } row[63] ={ values [] positions: [] } row[64] ={ values [] positions: [] } row[65] ={ values [] positions: [] } row[66] ={ values [] positions: [] } row[67] ={ values [] positions: [] } row[68] ={ values [] positions: [] } row[69] ={ values [] positions: [] } row[70] ={ values [] positions: [] } row[71] ={ values [] positions: [] } row[72] ={ values [] positions: [] } row[73] ={ values [] positions: [] } row[74] ={ values [] positions: [] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [] positions: [] } row[78] ={ values [] positions: [] } row[79] ={ values [] positions: [] } row[80] ={ values [] positions: [] } row[81] ={ values [] positions: [] } row[82] ={ values [] positions: [] } row[83] ={ values [] positions: [] } row[84] ={ values [] positions: [] } row[85] ={ values [] positions: [] } row[86] ={ values [] positions: [] } row[87] ={ values [] positions: [] } row[88] ={ values [] positions: [] } row[89] ={ values [] positions: [] } row[90] ={ values [] positions: [] } row[91] ={ values [] positions: [] } row[92] ={ values [] positions: [] } row[93] ={ values [] positions: [] } row[94] ={ values [] positions: [] } row[95] ={ values [] positions: [] } row[96] ={ values [] positions: [] } row[97] ={ values [] positions: [] } row[98] ={ values [] positions: [] } row[99] ={ values [] positions: [] } row[100] ={ values [] positions: [] } Enter any number Enter size of a square matrix A: Enter entries of A: A = [[1,2], [3,4]] smat from matrix A = row[1] ={ values [1,2] positions: [1,2] } row[2] ={ values [3,4] positions: [1,2] } Enter any number Copy of smat = row[1] ={ values [1,2] positions: [1,2] } row[2] ={ values [3,4] positions: [1,2] } Enter any number Copy using assignment= row[1] ={ values [1,2] positions: [1,2] } row[2] ={ values [3,4] positions: [1,2] } Enter any number enter number of rows of smat for conversion Now enter number of columns smat = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } smat as a matrix = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,1,0,0,0,0,0,0,-9,0,6,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,9,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,9,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,6,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-3,0,0,0,0,0,1,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2], [0,5,0,-10,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,-8,0,0,0,0,0,0,0,0,0,-5,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,1,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0], [0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0], [0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,6,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-3,0], [0,0,0,0,0,0,9,0,7,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,4,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,8,-7,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0], [0,0,0,0,0,0,0,0,0,0,9,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,-10,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,-1,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,8,0,-4,0,0,0,0,0,0,0,0,0,-9,0,-6,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,-8,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,4,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,-6,0,0,0,0,0,0,0,1,0,0,0,0,0,0,-5,0,0,5,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,-2,0,-4,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,-9,0,-7,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,9,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,-7,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,5,0,9,0,0,0,3,0,9,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,4,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0], [0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,6,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0], [0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,-7,0,0,0,0,0,0,-8,0,0,0,3,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,5,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,6,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,5,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,6,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,9,0,0,0,0,0,0,0,0,0,0,3,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,-10,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,9,0,0,0,0,0,9,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,7,0,0,0,-5,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,2,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,-5,0,-6,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,9,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,-9,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,-8,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0], [0,0,0,0,0,0,0,0,-2,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,-2,8,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,-3,0,-7,0], [0,0,0,0,0,0,0,0,9,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,9,0,0,-5,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0], [0,0,-1,0,0,0,0,0,0,-9,1,0,0,0,0,0,0,0,0,-2,0,-2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,9,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,0,0,0,0,-6,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,-5,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,-5,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,7,-9,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,-7,0,0,0,0,4,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] Enter any number Enter position: (row,col)T(50 , 50) = 0 testing set_row enter new row : which row ? (starting from zero) number of non-zero elements ? values ? positions ? new matrix : row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [1,2,3] positions: [10,20,30] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } testing operations Enter size of smat A row,col: Enter size of smat B: row,col: matrix A row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } matrix B row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number C = A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number B==A?1 B!=A?0 C==A?1 C!=A?0 Enter any number after B+=A, A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-20,-8] positions: [40,94] } row[2] ={ values [12,18] positions: [38,56] } row[3] ={ values [10,12,-2,-14,-20,2,-18,12] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [18,2,-2,6,-14] positions: [9,14,37,46,86] } row[5] ={ values [-10,14,-4,4,-8,18] positions: [24,25,40,66,70,83] } row[6] ={ values [-14,12,18,-18] positions: [39,58,65,98] } row[7] ={ values [6,14,12,-12,-4] positions: [22,26,48,84,85] } row[8] ={ values [18,18,4,-20,12] positions: [54,60,61,91,92] } row[9] ={ values [12,-16,10,4,18] positions: [21,35,52,73,96] } row[10] ={ values [2,16,-2,-6,2,12,2,4] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [10,-20,-6,2,6,-8,-16,-10] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [10,16] positions: [56,91] } row[13] ={ values [16,2,18,8,-6,10] positions: [7,17,19,41,82,88] } row[14] ={ values [-8,6] positions: [69,97] } row[15] ={ values [-18,-14] positions: [2,66] } row[16] ={ values [18,14,12,-16] positions: [44,60,75,94] } row[17] ={ values [-6,18,12,-8,-8,-10,-12] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-2,-6] positions: [48,67] } row[19] ={ values [10,-2,-6] positions: [30,97,99] } row[20] ={ values [18,14,-10,10,18,8,-12,4] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [18] positions: [73] } row[22] ={ values [16,-6] positions: [12,72] } row[23] ={ values [2,-12,8] positions: [33,61,97] } row[24] ={ values [-2,16,-14,-12,-4,-20,6] positions: [37,42,43,54,82,84,97] } row[25] ={ values [18,-6,16,-16,-10,18,-12,-20,14] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-2,-18,-8,-6,-10,2] positions: [9,11,25,28,79,94] } row[27] ={ values [-18,6,-2,16,-16] positions: [10,39,47,75,95] } row[28] ={ values [-10] positions: [74] } row[29] ={ values [-16,-2,10,-4] positions: [7,20,74,77] } row[30] ={ values [4,10] positions: [40,61] } row[31] ={ values [8] positions: [65] } row[32] ={ values [12] positions: [32] } row[33] ={ values [-12,16] positions: [11,92] } row[34] ={ values [10,2,2,18,16,-8,-18,-12] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [18,-18,14,6,16] positions: [23,51,64,80,84] } row[36] ={ values [-4,6,4] positions: [14,25,70] } row[37] ={ values [-12,6,-2,-20,-8] positions: [21,29,76,83,97] } row[38] ={ values [-16,-6,-12] positions: [25,42,69] } row[39] ={ values [10,16,-14,-20] positions: [48,74,83,91] } row[40] ={ values [-16,-8,-6,18,-18] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-8,-6] positions: [1,37] } row[43] ={ values [-14,-14,2,18,8] positions: [20,51,78,91,94] } row[44] ={ values [12] positions: [69] } row[45] ={ values [-8,-4,-12,2,-10,10,-12,2] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-16,16] positions: [25,44] } row[47] ={ values [-4,-8,-10,12,6,4,-18,-14,8] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-4,18,18,8] positions: [33,38,40,71] } row[49] ={ values [18] positions: [35] } row[50] ={ values [-14,-12,-16,10,18,6,18,-4,-4] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [8,14,-12,-18,8,-4,8] positions: [15,17,45,61,72,75,96] } row[53] ={ values [4,10] positions: [38,58] } row[54] ={ values [14,-4] positions: [26,94] } row[55] ={ values [-16,18,4,-4] positions: [2,36,60,98] } row[56] ={ values [-8] positions: [19] } row[57] ={ values [14,14,8,-16,18,-2,12,18] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-6,18,12,-14,-16,6,4,10,-12] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-16] positions: [95] } row[60] ={ values [2,-20,12,16,10,12,-20,-10] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [6,10] positions: [10,17] } row[62] ={ values [10,-8,-16,12,-18,-16,6,-16] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [18,6,-16,-8,-20,-20,-20] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-6,-2,18,18] positions: [51,86,88,94] } row[65] ={ values [4,8] positions: [79,92] } row[66] ={ values [14,-10,-8,16] positions: [9,13,19,37] } row[67] ={ values [-6,8,-2,-20,-2] positions: [27,55,66,80,97] } row[68] ={ values [-4,-12] positions: [33,70] } row[69] ={ values [-20] positions: [81] } row[70] ={ values [-2,-10,-4,2] positions: [34,45,53,89] } row[71] ={ values [12,4,-2,12] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-14,-14] positions: [42,72] } row[74] ={ values [-14,-2,-4,14,-20,-10,-12,-6] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [2] positions: [18] } row[78] ={ values [-14,-20,-8,4,18,18] positions: [22,43,51,72,75,83] } row[79] ={ values [-10] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-4,10,4,-18] positions: [51,70,86,87] } row[82] ={ values [4,-16,2] positions: [32,36,41] } row[83] ={ values [16,-16,18,-14,-2,-14,-12] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-4,-18,16,14,-10,14,-4,16] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [4,-14,-8,2,-12,16,-6,-14] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [18,-2,-10,-6] positions: [9,13,54,80] } row[87] ={ values [2,-14,-14] positions: [14,48,83] } row[88] ={ values [-12,2,18,18,-10,-10,-2,18] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-2,-18,2,-4,-4,4,8] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-14,4,12,4] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [8,18,-4] positions: [80,85,87] } row[94] ={ values [-12] positions: [94] } row[95] ={ values [10,-14,-12,-4,10,-16] positions: [20,22,41,51,72,84] } row[96] ={ values [2,-12,-14,-20,-10,10,6,-10,-16] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-20,-20,14,-18,-6,-20,6] positions: [17,20,34,35,41,66,85] } row[98] ={ values [18,-4,-4] positions: [36,59,74] } row[99] ={ values [-4] positions: [43] } row[100] ={ values [-4,10,-12,-14,8,-12,18] positions: [13,35,47,53,58,68,82] } Enter any number after B-=A, A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number after B*=2, B = row[1] ={ values [-20,-8] positions: [40,94] } row[2] ={ values [12,18] positions: [38,56] } row[3] ={ values [10,12,-2,-14,-20,2,-18,12] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [18,2,-2,6,-14] positions: [9,14,37,46,86] } row[5] ={ values [-10,14,-4,4,-8,18] positions: [24,25,40,66,70,83] } row[6] ={ values [-14,12,18,-18] positions: [39,58,65,98] } row[7] ={ values [6,14,12,-12,-4] positions: [22,26,48,84,85] } row[8] ={ values [18,18,4,-20,12] positions: [54,60,61,91,92] } row[9] ={ values [12,-16,10,4,18] positions: [21,35,52,73,96] } row[10] ={ values [2,16,-2,-6,2,12,2,4] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [10,-20,-6,2,6,-8,-16,-10] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [10,16] positions: [56,91] } row[13] ={ values [16,2,18,8,-6,10] positions: [7,17,19,41,82,88] } row[14] ={ values [-8,6] positions: [69,97] } row[15] ={ values [-18,-14] positions: [2,66] } row[16] ={ values [18,14,12,-16] positions: [44,60,75,94] } row[17] ={ values [-6,18,12,-8,-8,-10,-12] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-2,-6] positions: [48,67] } row[19] ={ values [10,-2,-6] positions: [30,97,99] } row[20] ={ values [18,14,-10,10,18,8,-12,4] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [18] positions: [73] } row[22] ={ values [16,-6] positions: [12,72] } row[23] ={ values [2,-12,8] positions: [33,61,97] } row[24] ={ values [-2,16,-14,-12,-4,-20,6] positions: [37,42,43,54,82,84,97] } row[25] ={ values [18,-6,16,-16,-10,18,-12,-20,14] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-2,-18,-8,-6,-10,2] positions: [9,11,25,28,79,94] } row[27] ={ values [-18,6,-2,16,-16] positions: [10,39,47,75,95] } row[28] ={ values [-10] positions: [74] } row[29] ={ values [-16,-2,10,-4] positions: [7,20,74,77] } row[30] ={ values [4,10] positions: [40,61] } row[31] ={ values [8] positions: [65] } row[32] ={ values [12] positions: [32] } row[33] ={ values [-12,16] positions: [11,92] } row[34] ={ values [10,2,2,18,16,-8,-18,-12] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [18,-18,14,6,16] positions: [23,51,64,80,84] } row[36] ={ values [-4,6,4] positions: [14,25,70] } row[37] ={ values [-12,6,-2,-20,-8] positions: [21,29,76,83,97] } row[38] ={ values [-16,-6,-12] positions: [25,42,69] } row[39] ={ values [10,16,-14,-20] positions: [48,74,83,91] } row[40] ={ values [-16,-8,-6,18,-18] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-8,-6] positions: [1,37] } row[43] ={ values [-14,-14,2,18,8] positions: [20,51,78,91,94] } row[44] ={ values [12] positions: [69] } row[45] ={ values [-8,-4,-12,2,-10,10,-12,2] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-16,16] positions: [25,44] } row[47] ={ values [-4,-8,-10,12,6,4,-18,-14,8] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-4,18,18,8] positions: [33,38,40,71] } row[49] ={ values [18] positions: [35] } row[50] ={ values [-14,-12,-16,10,18,6,18,-4,-4] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [8,14,-12,-18,8,-4,8] positions: [15,17,45,61,72,75,96] } row[53] ={ values [4,10] positions: [38,58] } row[54] ={ values [14,-4] positions: [26,94] } row[55] ={ values [-16,18,4,-4] positions: [2,36,60,98] } row[56] ={ values [-8] positions: [19] } row[57] ={ values [14,14,8,-16,18,-2,12,18] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-6,18,12,-14,-16,6,4,10,-12] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-16] positions: [95] } row[60] ={ values [2,-20,12,16,10,12,-20,-10] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [6,10] positions: [10,17] } row[62] ={ values [10,-8,-16,12,-18,-16,6,-16] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [18,6,-16,-8,-20,-20,-20] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-6,-2,18,18] positions: [51,86,88,94] } row[65] ={ values [4,8] positions: [79,92] } row[66] ={ values [14,-10,-8,16] positions: [9,13,19,37] } row[67] ={ values [-6,8,-2,-20,-2] positions: [27,55,66,80,97] } row[68] ={ values [-4,-12] positions: [33,70] } row[69] ={ values [-20] positions: [81] } row[70] ={ values [-2,-10,-4,2] positions: [34,45,53,89] } row[71] ={ values [12,4,-2,12] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-14,-14] positions: [42,72] } row[74] ={ values [-14,-2,-4,14,-20,-10,-12,-6] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [2] positions: [18] } row[78] ={ values [-14,-20,-8,4,18,18] positions: [22,43,51,72,75,83] } row[79] ={ values [-10] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-4,10,4,-18] positions: [51,70,86,87] } row[82] ={ values [4,-16,2] positions: [32,36,41] } row[83] ={ values [16,-16,18,-14,-2,-14,-12] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-4,-18,16,14,-10,14,-4,16] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [4,-14,-8,2,-12,16,-6,-14] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [18,-2,-10,-6] positions: [9,13,54,80] } row[87] ={ values [2,-14,-14] positions: [14,48,83] } row[88] ={ values [-12,2,18,18,-10,-10,-2,18] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-2,-18,2,-4,-4,4,8] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-14,4,12,4] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [8,18,-4] positions: [80,85,87] } row[94] ={ values [-12] positions: [94] } row[95] ={ values [10,-14,-12,-4,10,-16] positions: [20,22,41,51,72,84] } row[96] ={ values [2,-12,-14,-20,-10,10,6,-10,-16] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-20,-20,14,-18,-6,-20,6] positions: [17,20,34,35,41,66,85] } row[98] ={ values [18,-4,-4] positions: [36,59,74] } row[99] ={ values [-4] positions: [43] } row[100] ={ values [-4,10,-12,-14,8,-12,18] positions: [13,35,47,53,58,68,82] } Enter any number after B/=2, B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number A+B=row[1] ={ values [-20,-8] positions: [40,94] } row[2] ={ values [12,18] positions: [38,56] } row[3] ={ values [10,12,-2,-14,-20,2,-18,12] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [18,2,-2,6,-14] positions: [9,14,37,46,86] } row[5] ={ values [-10,14,-4,4,-8,18] positions: [24,25,40,66,70,83] } row[6] ={ values [-14,12,18,-18] positions: [39,58,65,98] } row[7] ={ values [6,14,12,-12,-4] positions: [22,26,48,84,85] } row[8] ={ values [18,18,4,-20,12] positions: [54,60,61,91,92] } row[9] ={ values [12,-16,10,4,18] positions: [21,35,52,73,96] } row[10] ={ values [2,16,-2,-6,2,12,2,4] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [10,-20,-6,2,6,-8,-16,-10] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [10,16] positions: [56,91] } row[13] ={ values [16,2,18,8,-6,10] positions: [7,17,19,41,82,88] } row[14] ={ values [-8,6] positions: [69,97] } row[15] ={ values [-18,-14] positions: [2,66] } row[16] ={ values [18,14,12,-16] positions: [44,60,75,94] } row[17] ={ values [-6,18,12,-8,-8,-10,-12] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-2,-6] positions: [48,67] } row[19] ={ values [10,-2,-6] positions: [30,97,99] } row[20] ={ values [18,14,-10,10,18,8,-12,4] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [18] positions: [73] } row[22] ={ values [16,-6] positions: [12,72] } row[23] ={ values [2,-12,8] positions: [33,61,97] } row[24] ={ values [-2,16,-14,-12,-4,-20,6] positions: [37,42,43,54,82,84,97] } row[25] ={ values [18,-6,16,-16,-10,18,-12,-20,14] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-2,-18,-8,-6,-10,2] positions: [9,11,25,28,79,94] } row[27] ={ values [-18,6,-2,16,-16] positions: [10,39,47,75,95] } row[28] ={ values [-10] positions: [74] } row[29] ={ values [-16,-2,10,-4] positions: [7,20,74,77] } row[30] ={ values [4,10] positions: [40,61] } row[31] ={ values [8] positions: [65] } row[32] ={ values [12] positions: [32] } row[33] ={ values [-12,16] positions: [11,92] } row[34] ={ values [10,2,2,18,16,-8,-18,-12] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [18,-18,14,6,16] positions: [23,51,64,80,84] } row[36] ={ values [-4,6,4] positions: [14,25,70] } row[37] ={ values [-12,6,-2,-20,-8] positions: [21,29,76,83,97] } row[38] ={ values [-16,-6,-12] positions: [25,42,69] } row[39] ={ values [10,16,-14,-20] positions: [48,74,83,91] } row[40] ={ values [-16,-8,-6,18,-18] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-8,-6] positions: [1,37] } row[43] ={ values [-14,-14,2,18,8] positions: [20,51,78,91,94] } row[44] ={ values [12] positions: [69] } row[45] ={ values [-8,-4,-12,2,-10,10,-12,2] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-16,16] positions: [25,44] } row[47] ={ values [-4,-8,-10,12,6,4,-18,-14,8] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-4,18,18,8] positions: [33,38,40,71] } row[49] ={ values [18] positions: [35] } row[50] ={ values [-14,-12,-16,10,18,6,18,-4,-4] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [8,14,-12,-18,8,-4,8] positions: [15,17,45,61,72,75,96] } row[53] ={ values [4,10] positions: [38,58] } row[54] ={ values [14,-4] positions: [26,94] } row[55] ={ values [-16,18,4,-4] positions: [2,36,60,98] } row[56] ={ values [-8] positions: [19] } row[57] ={ values [14,14,8,-16,18,-2,12,18] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-6,18,12,-14,-16,6,4,10,-12] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-16] positions: [95] } row[60] ={ values [2,-20,12,16,10,12,-20,-10] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [6,10] positions: [10,17] } row[62] ={ values [10,-8,-16,12,-18,-16,6,-16] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [18,6,-16,-8,-20,-20,-20] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-6,-2,18,18] positions: [51,86,88,94] } row[65] ={ values [4,8] positions: [79,92] } row[66] ={ values [14,-10,-8,16] positions: [9,13,19,37] } row[67] ={ values [-6,8,-2,-20,-2] positions: [27,55,66,80,97] } row[68] ={ values [-4,-12] positions: [33,70] } row[69] ={ values [-20] positions: [81] } row[70] ={ values [-2,-10,-4,2] positions: [34,45,53,89] } row[71] ={ values [12,4,-2,12] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-14,-14] positions: [42,72] } row[74] ={ values [-14,-2,-4,14,-20,-10,-12,-6] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [2] positions: [18] } row[78] ={ values [-14,-20,-8,4,18,18] positions: [22,43,51,72,75,83] } row[79] ={ values [-10] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-4,10,4,-18] positions: [51,70,86,87] } row[82] ={ values [4,-16,2] positions: [32,36,41] } row[83] ={ values [16,-16,18,-14,-2,-14,-12] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-4,-18,16,14,-10,14,-4,16] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [4,-14,-8,2,-12,16,-6,-14] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [18,-2,-10,-6] positions: [9,13,54,80] } row[87] ={ values [2,-14,-14] positions: [14,48,83] } row[88] ={ values [-12,2,18,18,-10,-10,-2,18] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-2,-18,2,-4,-4,4,8] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-14,4,12,4] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [8,18,-4] positions: [80,85,87] } row[94] ={ values [-12] positions: [94] } row[95] ={ values [10,-14,-12,-4,10,-16] positions: [20,22,41,51,72,84] } row[96] ={ values [2,-12,-14,-20,-10,10,6,-10,-16] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-20,-20,14,-18,-6,-20,6] positions: [17,20,34,35,41,66,85] } row[98] ={ values [18,-4,-4] positions: [36,59,74] } row[99] ={ values [-4] positions: [43] } row[100] ={ values [-4,10,-12,-14,8,-12,18] positions: [13,35,47,53,58,68,82] } Now A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number A-B=row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } row[6] ={ values [] positions: [] } row[7] ={ values [] positions: [] } row[8] ={ values [] positions: [] } row[9] ={ values [] positions: [] } row[10] ={ values [] positions: [] } row[11] ={ values [] positions: [] } row[12] ={ values [] positions: [] } row[13] ={ values [] positions: [] } row[14] ={ values [] positions: [] } row[15] ={ values [] positions: [] } row[16] ={ values [] positions: [] } row[17] ={ values [] positions: [] } row[18] ={ values [] positions: [] } row[19] ={ values [] positions: [] } row[20] ={ values [] positions: [] } row[21] ={ values [] positions: [] } row[22] ={ values [] positions: [] } row[23] ={ values [] positions: [] } row[24] ={ values [] positions: [] } row[25] ={ values [] positions: [] } row[26] ={ values [] positions: [] } row[27] ={ values [] positions: [] } row[28] ={ values [] positions: [] } row[29] ={ values [] positions: [] } row[30] ={ values [] positions: [] } row[31] ={ values [] positions: [] } row[32] ={ values [] positions: [] } row[33] ={ values [] positions: [] } row[34] ={ values [] positions: [] } row[35] ={ values [] positions: [] } row[36] ={ values [] positions: [] } row[37] ={ values [] positions: [] } row[38] ={ values [] positions: [] } row[39] ={ values [] positions: [] } row[40] ={ values [] positions: [] } row[41] ={ values [] positions: [] } row[42] ={ values [] positions: [] } row[43] ={ values [] positions: [] } row[44] ={ values [] positions: [] } row[45] ={ values [] positions: [] } row[46] ={ values [] positions: [] } row[47] ={ values [] positions: [] } row[48] ={ values [] positions: [] } row[49] ={ values [] positions: [] } row[50] ={ values [] positions: [] } row[51] ={ values [] positions: [] } row[52] ={ values [] positions: [] } row[53] ={ values [] positions: [] } row[54] ={ values [] positions: [] } row[55] ={ values [] positions: [] } row[56] ={ values [] positions: [] } row[57] ={ values [] positions: [] } row[58] ={ values [] positions: [] } row[59] ={ values [] positions: [] } row[60] ={ values [] positions: [] } row[61] ={ values [] positions: [] } row[62] ={ values [] positions: [] } row[63] ={ values [] positions: [] } row[64] ={ values [] positions: [] } row[65] ={ values [] positions: [] } row[66] ={ values [] positions: [] } row[67] ={ values [] positions: [] } row[68] ={ values [] positions: [] } row[69] ={ values [] positions: [] } row[70] ={ values [] positions: [] } row[71] ={ values [] positions: [] } row[72] ={ values [] positions: [] } row[73] ={ values [] positions: [] } row[74] ={ values [] positions: [] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [] positions: [] } row[78] ={ values [] positions: [] } row[79] ={ values [] positions: [] } row[80] ={ values [] positions: [] } row[81] ={ values [] positions: [] } row[82] ={ values [] positions: [] } row[83] ={ values [] positions: [] } row[84] ={ values [] positions: [] } row[85] ={ values [] positions: [] } row[86] ={ values [] positions: [] } row[87] ={ values [] positions: [] } row[88] ={ values [] positions: [] } row[89] ={ values [] positions: [] } row[90] ={ values [] positions: [] } row[91] ={ values [] positions: [] } row[92] ={ values [] positions: [] } row[93] ={ values [] positions: [] } row[94] ={ values [] positions: [] } row[95] ={ values [] positions: [] } row[96] ={ values [] positions: [] } row[97] ={ values [] positions: [] } row[98] ={ values [] positions: [] } row[99] ={ values [] positions: [] } row[100] ={ values [] positions: [] } Now A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } test addition of scalar to smat After adding 17 to A it is now: row[1] ={ values [17,-10,-4] positions: [1,40,94] } row[2] ={ values [17,6,9] positions: [2,38,56] } row[3] ={ values [17,5,6,-1,-7,-10,1,-9,6] positions: [3,19,37,45,54,82,84,91,93] } row[4] ={ values [17,9,1,-1,3,-7] positions: [4,9,14,37,46,86] } row[5] ={ values [17,-5,7,-2,2,-4,9] positions: [5,24,25,40,66,70,83] } row[6] ={ values [17,-7,6,9,-9] positions: [6,39,58,65,98] } row[7] ={ values [17,3,7,6,-6,-2] positions: [7,22,26,48,84,85] } row[8] ={ values [17,9,9,2,-10,6] positions: [8,54,60,61,91,92] } row[9] ={ values [17,6,-8,5,2,9] positions: [9,21,35,52,73,96] } row[10] ={ values [17,1,8,-1,-3,1,6,1,2] positions: [10,13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,17,1,3,-4,-8,-5] positions: [2,4,6,11,43,61,88,89,99] } row[12] ={ values [17,5,8] positions: [12,56,91] } row[13] ={ values [8,17,1,9,4,-3,5] positions: [7,13,17,19,41,82,88] } row[14] ={ values [17,-4,3] positions: [14,69,97] } row[15] ={ values [-9,17,-7] positions: [2,15,66] } row[16] ={ values [17,9,7,6,-8] positions: [16,44,60,75,94] } row[17] ={ values [-3,17,9,6,-4,-4,-5,-6] positions: [7,17,23,26,34,50,68,94] } row[18] ={ values [17,-1,-3] positions: [18,48,67] } row[19] ={ values [17,5,-1,-3] positions: [19,30,97,99] } row[20] ={ values [9,7,-5,17,5,9,4,-6,2] positions: [7,9,11,20,24,34,43,46,74] } row[21] ={ values [17,9] positions: [21,73] } row[22] ={ values [8,17,-3] positions: [12,22,72] } row[23] ={ values [17,1,-6,4] positions: [23,33,61,97] } row[24] ={ values [17,-1,8,-7,-6,-2,-10,3] positions: [24,37,42,43,54,82,84,97] } row[25] ={ values [9,-3,17,8,-8,-5,9,-6,-10,7] positions: [11,12,25,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,17,-3,-5,1] positions: [9,11,25,26,28,79,94] } row[27] ={ values [-9,17,3,-1,8,-8] positions: [10,27,39,47,75,95] } row[28] ={ values [17,-5] positions: [28,74] } row[29] ={ values [-8,-1,17,5,-2] positions: [7,20,29,74,77] } row[30] ={ values [17,2,5] positions: [30,40,61] } row[31] ={ values [17,4] positions: [31,65] } row[32] ={ values [23] positions: [32] } row[33] ={ values [-6,17,8] positions: [11,33,92] } row[34] ={ values [5,1,1,17,9,8,-4,-9,-6] positions: [12,31,33,34,76,79,81,91,93] } row[35] ={ values [9,17,-9,7,3,8] positions: [23,35,51,64,80,84] } row[36] ={ values [-2,3,17,2] positions: [14,25,36,70] } row[37] ={ values [-6,3,17,-1,-10,-4] positions: [21,29,37,76,83,97] } row[38] ={ values [-8,17,-3,-6] positions: [25,38,42,69] } row[39] ={ values [17,5,8,-7,-10] positions: [39,48,74,83,91] } row[40] ={ values [-8,-4,-3,17,9,-9] positions: [6,11,25,40,54,59] } row[41] ={ values [17] positions: [41] } row[42] ={ values [-4,-3,17] positions: [1,37,42] } row[43] ={ values [-7,17,-7,1,9,4] positions: [20,43,51,78,91,94] } row[44] ={ values [17,6] positions: [44,69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,17,1] positions: [6,20,21,29,36,39,43,45,59] } row[46] ={ values [-8,8,17] positions: [25,44,46] } row[47] ={ values [-2,-4,-5,6,17,3,2,-9,-7,4] positions: [5,7,9,37,47,50,55,61,63,71] } row[48] ={ values [-2,9,9,17,4] positions: [33,38,40,48,71] } row[49] ={ values [9,17] positions: [35,49] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,17,-2] positions: [5,11,28,32,34,38,40,45,50,80] } row[51] ={ values [17] positions: [51] } row[52] ={ values [4,7,-6,17,-9,4,-2,4] positions: [15,17,45,52,61,72,75,96] } row[53] ={ values [2,17,5] positions: [38,53,58] } row[54] ={ values [7,17,-2] positions: [26,54,94] } row[55] ={ values [-8,9,17,2,-2] positions: [2,36,55,60,98] } row[56] ={ values [-4,17] positions: [19,56] } row[57] ={ values [7,7,4,-8,17,9,-1,6,9] positions: [6,18,32,39,57,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,17,5,-6] positions: [2,16,26,32,39,43,54,58,66,67] } row[59] ={ values [17,-8] positions: [59,95] } row[60] ={ values [1,-10,6,8,17,5,6,-10,-5] positions: [8,17,26,37,60,62,72,75,92] } row[61] ={ values [3,5,17] positions: [10,17,61] } row[62] ={ values [5,-4,-8,6,-9,-8,17,3,-8] positions: [6,14,34,35,49,57,62,66,84] } row[63] ={ values [9,3,-8,13,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,17,-1,9,9] positions: [51,64,86,88,94] } row[65] ={ values [17,2,4] positions: [65,79,92] } row[66] ={ values [7,-5,-4,8,17] positions: [9,13,19,37,66] } row[67] ={ values [-3,4,-1,17,-10,-1] positions: [27,55,66,67,80,97] } row[68] ={ values [-2,17,-6] positions: [33,68,70] } row[69] ={ values [17,-10] positions: [69,81] } row[70] ={ values [-1,-5,-2,17,1] positions: [34,45,53,70,89] } row[71] ={ values [6,2,-1,17,6] positions: [61,64,70,71,88] } row[72] ={ values [17] positions: [72] } row[73] ={ values [-7,-7,17] positions: [42,72,73] } row[74] ={ values [-7,-1,-2,7,7,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [17] positions: [75] } row[76] ={ values [17] positions: [76] } row[77] ={ values [1,17] positions: [18,77] } row[78] ={ values [-7,-10,-4,2,9,17,9] positions: [22,43,51,72,75,78,83] } row[79] ={ values [-5,17] positions: [8,79] } row[80] ={ values [17] positions: [80] } row[81] ={ values [-2,5,17,2,-9] positions: [51,70,81,86,87] } row[82] ={ values [2,-8,1,17] positions: [32,36,41,82] } row[83] ={ values [8,-8,9,-7,-1,-7,17,-6] positions: [15,27,32,48,60,65,83,97] } row[84] ={ values [-2,-9,8,7,-5,17,7,-2,8] positions: [9,12,34,35,38,84,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,17,8,-3,-7] positions: [22,31,39,59,74,85,95,97,99] } row[86] ={ values [9,-1,-5,-3,17] positions: [9,13,54,80,86] } row[87] ={ values [1,-7,-7,17] positions: [14,48,83,87] } row[88] ={ values [-6,1,9,9,-5,-5,-1,17,9] positions: [6,40,47,59,62,73,82,88,91] } row[89] ={ values [-1,-9,1,-2,-2,2,21] positions: [3,10,11,20,22,30,89] } row[90] ={ values [17] positions: [90] } row[91] ={ values [-7,2,6,17,2] positions: [30,44,51,91,99] } row[92] ={ values [17] positions: [92] } row[93] ={ values [4,9,-2,17] positions: [80,85,87,93] } row[94] ={ values [11] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8,17] positions: [20,22,41,51,72,84,95] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8,17] positions: [3,8,13,27,34,41,68,69,70,96] } row[97] ={ values [-10,-10,7,-9,-3,-10,3,17] positions: [17,20,34,35,41,66,85,97] } row[98] ={ values [9,-2,-2,17] positions: [36,59,74,98] } row[99] ={ values [-2,17] positions: [43,99] } row[100] ={ values [-2,5,-6,-7,4,-6,9,17] positions: [13,35,47,53,58,68,82,100] } After subtracting 17 again it is now: row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } scalar addition OK A = 5x5 zero smat: row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } After adding 17 to A it is now: row[1] ={ values [17] positions: [1] } row[2] ={ values [17] positions: [2] } row[3] ={ values [17] positions: [3] } row[4] ={ values [17] positions: [4] } row[5] ={ values [17] positions: [5] } After subtracting 17 again it is now: row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } scalar addition OK test multiplication of smat by matrix enter smat: first row, col and then the rows now enter matrix: first row, col and then the entries the smat is (as a matrix) [[0,-10,-4], [0,6,0], [5,-7,6]] the matrix is [[1,2,3,4], [0,5,6,0], [7,8,9,10]] the product matrix is: [[-28,-82,-96,-40], [0,30,36,0], [47,23,27,80]] Correct Testing transpose function A=(A^t)^t ? yes! enter new value of t test of kernel function enter size of matrix for elimination (row,col) Do you want to input the matrix for elimination or do you want a matrix with random entries? (1 for random and zero otherwise want to determine the rank using matrix? (1 = yes; 0 = no )How many maximum number of non-zero entries per row? enter seed for random number generator calculating matrix, done rank using echmodp : 95 number of non-zero entries: 525 rank is:95 number of non-zero entries: 427 kernel correct enter new value of t eclib-20250122/tests/out_ntl/smattest3.out000066400000000000000000004350631474421343600203600ustar00rootroot00000000000000enter 0 to exit enter 1 to do all tests enter 2 to operations enter 3 to special speed test enter> enter 4 to elimination test enter> enter 5 to kernel test enter> enter 6 to multiply smat by smat enter> enter 7 to find eigenspaces enter> Test run of sparse matrix package. enter # of rows: enter # of colums: Unitialized new smat sm = row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } row[6] ={ values [] positions: [] } row[7] ={ values [] positions: [] } row[8] ={ values [] positions: [] } row[9] ={ values [] positions: [] } row[10] ={ values [] positions: [] } row[11] ={ values [] positions: [] } row[12] ={ values [] positions: [] } row[13] ={ values [] positions: [] } row[14] ={ values [] positions: [] } row[15] ={ values [] positions: [] } row[16] ={ values [] positions: [] } row[17] ={ values [] positions: [] } row[18] ={ values [] positions: [] } row[19] ={ values [] positions: [] } row[20] ={ values [] positions: [] } row[21] ={ values [] positions: [] } row[22] ={ values [] positions: [] } row[23] ={ values [] positions: [] } row[24] ={ values [] positions: [] } row[25] ={ values [] positions: [] } row[26] ={ values [] positions: [] } row[27] ={ values [] positions: [] } row[28] ={ values [] positions: [] } row[29] ={ values [] positions: [] } row[30] ={ values [] positions: [] } row[31] ={ values [] positions: [] } row[32] ={ values [] positions: [] } row[33] ={ values [] positions: [] } row[34] ={ values [] positions: [] } row[35] ={ values [] positions: [] } row[36] ={ values [] positions: [] } row[37] ={ values [] positions: [] } row[38] ={ values [] positions: [] } row[39] ={ values [] positions: [] } row[40] ={ values [] positions: [] } row[41] ={ values [] positions: [] } row[42] ={ values [] positions: [] } row[43] ={ values [] positions: [] } row[44] ={ values [] positions: [] } row[45] ={ values [] positions: [] } row[46] ={ values [] positions: [] } row[47] ={ values [] positions: [] } row[48] ={ values [] positions: [] } row[49] ={ values [] positions: [] } row[50] ={ values [] positions: [] } row[51] ={ values [] positions: [] } row[52] ={ values [] positions: [] } row[53] ={ values [] positions: [] } row[54] ={ values [] positions: [] } row[55] ={ values [] positions: [] } row[56] ={ values [] positions: [] } row[57] ={ values [] positions: [] } row[58] ={ values [] positions: [] } row[59] ={ values [] positions: [] } row[60] ={ values [] positions: [] } row[61] ={ values [] positions: [] } row[62] ={ values [] positions: [] } row[63] ={ values [] positions: [] } row[64] ={ values [] positions: [] } row[65] ={ values [] positions: [] } row[66] ={ values [] positions: [] } row[67] ={ values [] positions: [] } row[68] ={ values [] positions: [] } row[69] ={ values [] positions: [] } row[70] ={ values [] positions: [] } row[71] ={ values [] positions: [] } row[72] ={ values [] positions: [] } row[73] ={ values [] positions: [] } row[74] ={ values [] positions: [] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [] positions: [] } row[78] ={ values [] positions: [] } row[79] ={ values [] positions: [] } row[80] ={ values [] positions: [] } row[81] ={ values [] positions: [] } row[82] ={ values [] positions: [] } row[83] ={ values [] positions: [] } row[84] ={ values [] positions: [] } row[85] ={ values [] positions: [] } row[86] ={ values [] positions: [] } row[87] ={ values [] positions: [] } row[88] ={ values [] positions: [] } row[89] ={ values [] positions: [] } row[90] ={ values [] positions: [] } row[91] ={ values [] positions: [] } row[92] ={ values [] positions: [] } row[93] ={ values [] positions: [] } row[94] ={ values [] positions: [] } row[95] ={ values [] positions: [] } row[96] ={ values [] positions: [] } row[97] ={ values [] positions: [] } row[98] ={ values [] positions: [] } row[99] ={ values [] positions: [] } row[100] ={ values [] positions: [] } Enter any number Enter size of a square matrix A: Enter entries of A: A = [[1,2], [3,4]] smat from matrix A = row[1] ={ values [1,2] positions: [1,2] } row[2] ={ values [3,4] positions: [1,2] } Enter any number Copy of smat = row[1] ={ values [1,2] positions: [1,2] } row[2] ={ values [3,4] positions: [1,2] } Enter any number Copy using assignment= row[1] ={ values [1,2] positions: [1,2] } row[2] ={ values [3,4] positions: [1,2] } Enter any number enter number of rows of smat for conversion Now enter number of columns smat = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } smat as a matrix = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,1,0,0,0,0,0,0,-9,0,6,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,9,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,9,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,6,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-3,0,0,0,0,0,1,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2], [0,5,0,-10,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,-8,0,0,0,0,0,0,0,0,0,-5,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,1,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0], [0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0], [0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,6,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-3,0], [0,0,0,0,0,0,9,0,7,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,4,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,8,-7,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0], [0,0,0,0,0,0,0,0,0,0,9,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,-10,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,-1,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,8,0,-4,0,0,0,0,0,0,0,0,0,-9,0,-6,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,-8,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,4,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,-6,0,0,0,0,0,0,0,1,0,0,0,0,0,0,-5,0,0,5,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,-2,0,-4,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,-9,0,-7,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,9,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,-7,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,5,0,9,0,0,0,3,0,9,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,0,0,0,4,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0], [0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,6,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0], [0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,-7,0,0,0,0,0,0,-8,0,0,0,3,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,5,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,6,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,5,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,6,0,0,0,0,0,0,0,0,0,0,0,0,0,-9,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,9,0,0,0,0,0,0,0,0,0,0,3,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,-10,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,9,0,0,0,0,0,9,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,7,0,0,0,-5,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,2,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,-5,0,-6,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,9,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,-9,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,-8,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0], [0,0,0,0,0,0,0,0,-2,0,0,-9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,7,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,-2,8,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,-4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,-3,0,-7,0], [0,0,0,0,0,0,0,0,9,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,9,0,0,-5,0,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0], [0,0,-1,0,0,0,0,0,0,-9,1,0,0,0,0,0,0,0,0,-2,0,-2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,9,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,0,0,0,0,-6,0,0,0,0,-7,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,-5,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,-5,-8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,7,-9,0,0,0,0,0,-3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,-7,0,0,0,0,4,0,0,0,0,0,0,0,0,0,-6,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] Enter any number Enter position: (row,col)T(50 , 50) = 0 testing set_row enter new row : which row ? (starting from zero) number of non-zero elements ? values ? positions ? new matrix : row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [1,2,3] positions: [10,20,30] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } testing operations Enter size of smat A row,col: Enter size of smat B: row,col: matrix A row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } matrix B row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number C = A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number B==A?1 B!=A?0 C==A?1 C!=A?0 Enter any number after B+=A, A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-20,-8] positions: [40,94] } row[2] ={ values [12,18] positions: [38,56] } row[3] ={ values [10,12,-2,-14,-20,2,-18,12] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [18,2,-2,6,-14] positions: [9,14,37,46,86] } row[5] ={ values [-10,14,-4,4,-8,18] positions: [24,25,40,66,70,83] } row[6] ={ values [-14,12,18,-18] positions: [39,58,65,98] } row[7] ={ values [6,14,12,-12,-4] positions: [22,26,48,84,85] } row[8] ={ values [18,18,4,-20,12] positions: [54,60,61,91,92] } row[9] ={ values [12,-16,10,4,18] positions: [21,35,52,73,96] } row[10] ={ values [2,16,-2,-6,2,12,2,4] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [10,-20,-6,2,6,-8,-16,-10] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [10,16] positions: [56,91] } row[13] ={ values [16,2,18,8,-6,10] positions: [7,17,19,41,82,88] } row[14] ={ values [-8,6] positions: [69,97] } row[15] ={ values [-18,-14] positions: [2,66] } row[16] ={ values [18,14,12,-16] positions: [44,60,75,94] } row[17] ={ values [-6,18,12,-8,-8,-10,-12] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-2,-6] positions: [48,67] } row[19] ={ values [10,-2,-6] positions: [30,97,99] } row[20] ={ values [18,14,-10,10,18,8,-12,4] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [18] positions: [73] } row[22] ={ values [16,-6] positions: [12,72] } row[23] ={ values [2,-12,8] positions: [33,61,97] } row[24] ={ values [-2,16,-14,-12,-4,-20,6] positions: [37,42,43,54,82,84,97] } row[25] ={ values [18,-6,16,-16,-10,18,-12,-20,14] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-2,-18,-8,-6,-10,2] positions: [9,11,25,28,79,94] } row[27] ={ values [-18,6,-2,16,-16] positions: [10,39,47,75,95] } row[28] ={ values [-10] positions: [74] } row[29] ={ values [-16,-2,10,-4] positions: [7,20,74,77] } row[30] ={ values [4,10] positions: [40,61] } row[31] ={ values [8] positions: [65] } row[32] ={ values [12] positions: [32] } row[33] ={ values [-12,16] positions: [11,92] } row[34] ={ values [10,2,2,18,16,-8,-18,-12] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [18,-18,14,6,16] positions: [23,51,64,80,84] } row[36] ={ values [-4,6,4] positions: [14,25,70] } row[37] ={ values [-12,6,-2,-20,-8] positions: [21,29,76,83,97] } row[38] ={ values [-16,-6,-12] positions: [25,42,69] } row[39] ={ values [10,16,-14,-20] positions: [48,74,83,91] } row[40] ={ values [-16,-8,-6,18,-18] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-8,-6] positions: [1,37] } row[43] ={ values [-14,-14,2,18,8] positions: [20,51,78,91,94] } row[44] ={ values [12] positions: [69] } row[45] ={ values [-8,-4,-12,2,-10,10,-12,2] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-16,16] positions: [25,44] } row[47] ={ values [-4,-8,-10,12,6,4,-18,-14,8] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-4,18,18,8] positions: [33,38,40,71] } row[49] ={ values [18] positions: [35] } row[50] ={ values [-14,-12,-16,10,18,6,18,-4,-4] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [8,14,-12,-18,8,-4,8] positions: [15,17,45,61,72,75,96] } row[53] ={ values [4,10] positions: [38,58] } row[54] ={ values [14,-4] positions: [26,94] } row[55] ={ values [-16,18,4,-4] positions: [2,36,60,98] } row[56] ={ values [-8] positions: [19] } row[57] ={ values [14,14,8,-16,18,-2,12,18] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-6,18,12,-14,-16,6,4,10,-12] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-16] positions: [95] } row[60] ={ values [2,-20,12,16,10,12,-20,-10] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [6,10] positions: [10,17] } row[62] ={ values [10,-8,-16,12,-18,-16,6,-16] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [18,6,-16,-8,-20,-20,-20] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-6,-2,18,18] positions: [51,86,88,94] } row[65] ={ values [4,8] positions: [79,92] } row[66] ={ values [14,-10,-8,16] positions: [9,13,19,37] } row[67] ={ values [-6,8,-2,-20,-2] positions: [27,55,66,80,97] } row[68] ={ values [-4,-12] positions: [33,70] } row[69] ={ values [-20] positions: [81] } row[70] ={ values [-2,-10,-4,2] positions: [34,45,53,89] } row[71] ={ values [12,4,-2,12] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-14,-14] positions: [42,72] } row[74] ={ values [-14,-2,-4,14,-20,-10,-12,-6] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [2] positions: [18] } row[78] ={ values [-14,-20,-8,4,18,18] positions: [22,43,51,72,75,83] } row[79] ={ values [-10] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-4,10,4,-18] positions: [51,70,86,87] } row[82] ={ values [4,-16,2] positions: [32,36,41] } row[83] ={ values [16,-16,18,-14,-2,-14,-12] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-4,-18,16,14,-10,14,-4,16] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [4,-14,-8,2,-12,16,-6,-14] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [18,-2,-10,-6] positions: [9,13,54,80] } row[87] ={ values [2,-14,-14] positions: [14,48,83] } row[88] ={ values [-12,2,18,18,-10,-10,-2,18] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-2,-18,2,-4,-4,4,8] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-14,4,12,4] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [8,18,-4] positions: [80,85,87] } row[94] ={ values [-12] positions: [94] } row[95] ={ values [10,-14,-12,-4,10,-16] positions: [20,22,41,51,72,84] } row[96] ={ values [2,-12,-14,-20,-10,10,6,-10,-16] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-20,-20,14,-18,-6,-20,6] positions: [17,20,34,35,41,66,85] } row[98] ={ values [18,-4,-4] positions: [36,59,74] } row[99] ={ values [-4] positions: [43] } row[100] ={ values [-4,10,-12,-14,8,-12,18] positions: [13,35,47,53,58,68,82] } Enter any number after B-=A, A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number after B*=2, B = row[1] ={ values [-20,-8] positions: [40,94] } row[2] ={ values [12,18] positions: [38,56] } row[3] ={ values [10,12,-2,-14,-20,2,-18,12] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [18,2,-2,6,-14] positions: [9,14,37,46,86] } row[5] ={ values [-10,14,-4,4,-8,18] positions: [24,25,40,66,70,83] } row[6] ={ values [-14,12,18,-18] positions: [39,58,65,98] } row[7] ={ values [6,14,12,-12,-4] positions: [22,26,48,84,85] } row[8] ={ values [18,18,4,-20,12] positions: [54,60,61,91,92] } row[9] ={ values [12,-16,10,4,18] positions: [21,35,52,73,96] } row[10] ={ values [2,16,-2,-6,2,12,2,4] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [10,-20,-6,2,6,-8,-16,-10] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [10,16] positions: [56,91] } row[13] ={ values [16,2,18,8,-6,10] positions: [7,17,19,41,82,88] } row[14] ={ values [-8,6] positions: [69,97] } row[15] ={ values [-18,-14] positions: [2,66] } row[16] ={ values [18,14,12,-16] positions: [44,60,75,94] } row[17] ={ values [-6,18,12,-8,-8,-10,-12] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-2,-6] positions: [48,67] } row[19] ={ values [10,-2,-6] positions: [30,97,99] } row[20] ={ values [18,14,-10,10,18,8,-12,4] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [18] positions: [73] } row[22] ={ values [16,-6] positions: [12,72] } row[23] ={ values [2,-12,8] positions: [33,61,97] } row[24] ={ values [-2,16,-14,-12,-4,-20,6] positions: [37,42,43,54,82,84,97] } row[25] ={ values [18,-6,16,-16,-10,18,-12,-20,14] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-2,-18,-8,-6,-10,2] positions: [9,11,25,28,79,94] } row[27] ={ values [-18,6,-2,16,-16] positions: [10,39,47,75,95] } row[28] ={ values [-10] positions: [74] } row[29] ={ values [-16,-2,10,-4] positions: [7,20,74,77] } row[30] ={ values [4,10] positions: [40,61] } row[31] ={ values [8] positions: [65] } row[32] ={ values [12] positions: [32] } row[33] ={ values [-12,16] positions: [11,92] } row[34] ={ values [10,2,2,18,16,-8,-18,-12] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [18,-18,14,6,16] positions: [23,51,64,80,84] } row[36] ={ values [-4,6,4] positions: [14,25,70] } row[37] ={ values [-12,6,-2,-20,-8] positions: [21,29,76,83,97] } row[38] ={ values [-16,-6,-12] positions: [25,42,69] } row[39] ={ values [10,16,-14,-20] positions: [48,74,83,91] } row[40] ={ values [-16,-8,-6,18,-18] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-8,-6] positions: [1,37] } row[43] ={ values [-14,-14,2,18,8] positions: [20,51,78,91,94] } row[44] ={ values [12] positions: [69] } row[45] ={ values [-8,-4,-12,2,-10,10,-12,2] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-16,16] positions: [25,44] } row[47] ={ values [-4,-8,-10,12,6,4,-18,-14,8] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-4,18,18,8] positions: [33,38,40,71] } row[49] ={ values [18] positions: [35] } row[50] ={ values [-14,-12,-16,10,18,6,18,-4,-4] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [8,14,-12,-18,8,-4,8] positions: [15,17,45,61,72,75,96] } row[53] ={ values [4,10] positions: [38,58] } row[54] ={ values [14,-4] positions: [26,94] } row[55] ={ values [-16,18,4,-4] positions: [2,36,60,98] } row[56] ={ values [-8] positions: [19] } row[57] ={ values [14,14,8,-16,18,-2,12,18] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-6,18,12,-14,-16,6,4,10,-12] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-16] positions: [95] } row[60] ={ values [2,-20,12,16,10,12,-20,-10] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [6,10] positions: [10,17] } row[62] ={ values [10,-8,-16,12,-18,-16,6,-16] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [18,6,-16,-8,-20,-20,-20] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-6,-2,18,18] positions: [51,86,88,94] } row[65] ={ values [4,8] positions: [79,92] } row[66] ={ values [14,-10,-8,16] positions: [9,13,19,37] } row[67] ={ values [-6,8,-2,-20,-2] positions: [27,55,66,80,97] } row[68] ={ values [-4,-12] positions: [33,70] } row[69] ={ values [-20] positions: [81] } row[70] ={ values [-2,-10,-4,2] positions: [34,45,53,89] } row[71] ={ values [12,4,-2,12] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-14,-14] positions: [42,72] } row[74] ={ values [-14,-2,-4,14,-20,-10,-12,-6] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [2] positions: [18] } row[78] ={ values [-14,-20,-8,4,18,18] positions: [22,43,51,72,75,83] } row[79] ={ values [-10] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-4,10,4,-18] positions: [51,70,86,87] } row[82] ={ values [4,-16,2] positions: [32,36,41] } row[83] ={ values [16,-16,18,-14,-2,-14,-12] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-4,-18,16,14,-10,14,-4,16] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [4,-14,-8,2,-12,16,-6,-14] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [18,-2,-10,-6] positions: [9,13,54,80] } row[87] ={ values [2,-14,-14] positions: [14,48,83] } row[88] ={ values [-12,2,18,18,-10,-10,-2,18] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-2,-18,2,-4,-4,4,8] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-14,4,12,4] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [8,18,-4] positions: [80,85,87] } row[94] ={ values [-12] positions: [94] } row[95] ={ values [10,-14,-12,-4,10,-16] positions: [20,22,41,51,72,84] } row[96] ={ values [2,-12,-14,-20,-10,10,6,-10,-16] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-20,-20,14,-18,-6,-20,6] positions: [17,20,34,35,41,66,85] } row[98] ={ values [18,-4,-4] positions: [36,59,74] } row[99] ={ values [-4] positions: [43] } row[100] ={ values [-4,10,-12,-14,8,-12,18] positions: [13,35,47,53,58,68,82] } Enter any number after B/=2, B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number A+B=row[1] ={ values [-20,-8] positions: [40,94] } row[2] ={ values [12,18] positions: [38,56] } row[3] ={ values [10,12,-2,-14,-20,2,-18,12] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [18,2,-2,6,-14] positions: [9,14,37,46,86] } row[5] ={ values [-10,14,-4,4,-8,18] positions: [24,25,40,66,70,83] } row[6] ={ values [-14,12,18,-18] positions: [39,58,65,98] } row[7] ={ values [6,14,12,-12,-4] positions: [22,26,48,84,85] } row[8] ={ values [18,18,4,-20,12] positions: [54,60,61,91,92] } row[9] ={ values [12,-16,10,4,18] positions: [21,35,52,73,96] } row[10] ={ values [2,16,-2,-6,2,12,2,4] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [10,-20,-6,2,6,-8,-16,-10] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [10,16] positions: [56,91] } row[13] ={ values [16,2,18,8,-6,10] positions: [7,17,19,41,82,88] } row[14] ={ values [-8,6] positions: [69,97] } row[15] ={ values [-18,-14] positions: [2,66] } row[16] ={ values [18,14,12,-16] positions: [44,60,75,94] } row[17] ={ values [-6,18,12,-8,-8,-10,-12] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-2,-6] positions: [48,67] } row[19] ={ values [10,-2,-6] positions: [30,97,99] } row[20] ={ values [18,14,-10,10,18,8,-12,4] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [18] positions: [73] } row[22] ={ values [16,-6] positions: [12,72] } row[23] ={ values [2,-12,8] positions: [33,61,97] } row[24] ={ values [-2,16,-14,-12,-4,-20,6] positions: [37,42,43,54,82,84,97] } row[25] ={ values [18,-6,16,-16,-10,18,-12,-20,14] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-2,-18,-8,-6,-10,2] positions: [9,11,25,28,79,94] } row[27] ={ values [-18,6,-2,16,-16] positions: [10,39,47,75,95] } row[28] ={ values [-10] positions: [74] } row[29] ={ values [-16,-2,10,-4] positions: [7,20,74,77] } row[30] ={ values [4,10] positions: [40,61] } row[31] ={ values [8] positions: [65] } row[32] ={ values [12] positions: [32] } row[33] ={ values [-12,16] positions: [11,92] } row[34] ={ values [10,2,2,18,16,-8,-18,-12] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [18,-18,14,6,16] positions: [23,51,64,80,84] } row[36] ={ values [-4,6,4] positions: [14,25,70] } row[37] ={ values [-12,6,-2,-20,-8] positions: [21,29,76,83,97] } row[38] ={ values [-16,-6,-12] positions: [25,42,69] } row[39] ={ values [10,16,-14,-20] positions: [48,74,83,91] } row[40] ={ values [-16,-8,-6,18,-18] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-8,-6] positions: [1,37] } row[43] ={ values [-14,-14,2,18,8] positions: [20,51,78,91,94] } row[44] ={ values [12] positions: [69] } row[45] ={ values [-8,-4,-12,2,-10,10,-12,2] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-16,16] positions: [25,44] } row[47] ={ values [-4,-8,-10,12,6,4,-18,-14,8] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-4,18,18,8] positions: [33,38,40,71] } row[49] ={ values [18] positions: [35] } row[50] ={ values [-14,-12,-16,10,18,6,18,-4,-4] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [8,14,-12,-18,8,-4,8] positions: [15,17,45,61,72,75,96] } row[53] ={ values [4,10] positions: [38,58] } row[54] ={ values [14,-4] positions: [26,94] } row[55] ={ values [-16,18,4,-4] positions: [2,36,60,98] } row[56] ={ values [-8] positions: [19] } row[57] ={ values [14,14,8,-16,18,-2,12,18] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-6,18,12,-14,-16,6,4,10,-12] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-16] positions: [95] } row[60] ={ values [2,-20,12,16,10,12,-20,-10] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [6,10] positions: [10,17] } row[62] ={ values [10,-8,-16,12,-18,-16,6,-16] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [18,6,-16,-8,-20,-20,-20] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-6,-2,18,18] positions: [51,86,88,94] } row[65] ={ values [4,8] positions: [79,92] } row[66] ={ values [14,-10,-8,16] positions: [9,13,19,37] } row[67] ={ values [-6,8,-2,-20,-2] positions: [27,55,66,80,97] } row[68] ={ values [-4,-12] positions: [33,70] } row[69] ={ values [-20] positions: [81] } row[70] ={ values [-2,-10,-4,2] positions: [34,45,53,89] } row[71] ={ values [12,4,-2,12] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-14,-14] positions: [42,72] } row[74] ={ values [-14,-2,-4,14,-20,-10,-12,-6] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [2] positions: [18] } row[78] ={ values [-14,-20,-8,4,18,18] positions: [22,43,51,72,75,83] } row[79] ={ values [-10] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-4,10,4,-18] positions: [51,70,86,87] } row[82] ={ values [4,-16,2] positions: [32,36,41] } row[83] ={ values [16,-16,18,-14,-2,-14,-12] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-4,-18,16,14,-10,14,-4,16] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [4,-14,-8,2,-12,16,-6,-14] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [18,-2,-10,-6] positions: [9,13,54,80] } row[87] ={ values [2,-14,-14] positions: [14,48,83] } row[88] ={ values [-12,2,18,18,-10,-10,-2,18] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-2,-18,2,-4,-4,4,8] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-14,4,12,4] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [8,18,-4] positions: [80,85,87] } row[94] ={ values [-12] positions: [94] } row[95] ={ values [10,-14,-12,-4,10,-16] positions: [20,22,41,51,72,84] } row[96] ={ values [2,-12,-14,-20,-10,10,6,-10,-16] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-20,-20,14,-18,-6,-20,6] positions: [17,20,34,35,41,66,85] } row[98] ={ values [18,-4,-4] positions: [36,59,74] } row[99] ={ values [-4] positions: [43] } row[100] ={ values [-4,10,-12,-14,8,-12,18] positions: [13,35,47,53,58,68,82] } Now A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } Enter any number A-B=row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } row[6] ={ values [] positions: [] } row[7] ={ values [] positions: [] } row[8] ={ values [] positions: [] } row[9] ={ values [] positions: [] } row[10] ={ values [] positions: [] } row[11] ={ values [] positions: [] } row[12] ={ values [] positions: [] } row[13] ={ values [] positions: [] } row[14] ={ values [] positions: [] } row[15] ={ values [] positions: [] } row[16] ={ values [] positions: [] } row[17] ={ values [] positions: [] } row[18] ={ values [] positions: [] } row[19] ={ values [] positions: [] } row[20] ={ values [] positions: [] } row[21] ={ values [] positions: [] } row[22] ={ values [] positions: [] } row[23] ={ values [] positions: [] } row[24] ={ values [] positions: [] } row[25] ={ values [] positions: [] } row[26] ={ values [] positions: [] } row[27] ={ values [] positions: [] } row[28] ={ values [] positions: [] } row[29] ={ values [] positions: [] } row[30] ={ values [] positions: [] } row[31] ={ values [] positions: [] } row[32] ={ values [] positions: [] } row[33] ={ values [] positions: [] } row[34] ={ values [] positions: [] } row[35] ={ values [] positions: [] } row[36] ={ values [] positions: [] } row[37] ={ values [] positions: [] } row[38] ={ values [] positions: [] } row[39] ={ values [] positions: [] } row[40] ={ values [] positions: [] } row[41] ={ values [] positions: [] } row[42] ={ values [] positions: [] } row[43] ={ values [] positions: [] } row[44] ={ values [] positions: [] } row[45] ={ values [] positions: [] } row[46] ={ values [] positions: [] } row[47] ={ values [] positions: [] } row[48] ={ values [] positions: [] } row[49] ={ values [] positions: [] } row[50] ={ values [] positions: [] } row[51] ={ values [] positions: [] } row[52] ={ values [] positions: [] } row[53] ={ values [] positions: [] } row[54] ={ values [] positions: [] } row[55] ={ values [] positions: [] } row[56] ={ values [] positions: [] } row[57] ={ values [] positions: [] } row[58] ={ values [] positions: [] } row[59] ={ values [] positions: [] } row[60] ={ values [] positions: [] } row[61] ={ values [] positions: [] } row[62] ={ values [] positions: [] } row[63] ={ values [] positions: [] } row[64] ={ values [] positions: [] } row[65] ={ values [] positions: [] } row[66] ={ values [] positions: [] } row[67] ={ values [] positions: [] } row[68] ={ values [] positions: [] } row[69] ={ values [] positions: [] } row[70] ={ values [] positions: [] } row[71] ={ values [] positions: [] } row[72] ={ values [] positions: [] } row[73] ={ values [] positions: [] } row[74] ={ values [] positions: [] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [] positions: [] } row[78] ={ values [] positions: [] } row[79] ={ values [] positions: [] } row[80] ={ values [] positions: [] } row[81] ={ values [] positions: [] } row[82] ={ values [] positions: [] } row[83] ={ values [] positions: [] } row[84] ={ values [] positions: [] } row[85] ={ values [] positions: [] } row[86] ={ values [] positions: [] } row[87] ={ values [] positions: [] } row[88] ={ values [] positions: [] } row[89] ={ values [] positions: [] } row[90] ={ values [] positions: [] } row[91] ={ values [] positions: [] } row[92] ={ values [] positions: [] } row[93] ={ values [] positions: [] } row[94] ={ values [] positions: [] } row[95] ={ values [] positions: [] } row[96] ={ values [] positions: [] } row[97] ={ values [] positions: [] } row[98] ={ values [] positions: [] } row[99] ={ values [] positions: [] } row[100] ={ values [] positions: [] } Now A = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } and B = row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } test addition of scalar to smat After adding 17 to A it is now: row[1] ={ values [17,-10,-4] positions: [1,40,94] } row[2] ={ values [17,6,9] positions: [2,38,56] } row[3] ={ values [17,5,6,-1,-7,-10,1,-9,6] positions: [3,19,37,45,54,82,84,91,93] } row[4] ={ values [17,9,1,-1,3,-7] positions: [4,9,14,37,46,86] } row[5] ={ values [17,-5,7,-2,2,-4,9] positions: [5,24,25,40,66,70,83] } row[6] ={ values [17,-7,6,9,-9] positions: [6,39,58,65,98] } row[7] ={ values [17,3,7,6,-6,-2] positions: [7,22,26,48,84,85] } row[8] ={ values [17,9,9,2,-10,6] positions: [8,54,60,61,91,92] } row[9] ={ values [17,6,-8,5,2,9] positions: [9,21,35,52,73,96] } row[10] ={ values [17,1,8,-1,-3,1,6,1,2] positions: [10,13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,17,1,3,-4,-8,-5] positions: [2,4,6,11,43,61,88,89,99] } row[12] ={ values [17,5,8] positions: [12,56,91] } row[13] ={ values [8,17,1,9,4,-3,5] positions: [7,13,17,19,41,82,88] } row[14] ={ values [17,-4,3] positions: [14,69,97] } row[15] ={ values [-9,17,-7] positions: [2,15,66] } row[16] ={ values [17,9,7,6,-8] positions: [16,44,60,75,94] } row[17] ={ values [-3,17,9,6,-4,-4,-5,-6] positions: [7,17,23,26,34,50,68,94] } row[18] ={ values [17,-1,-3] positions: [18,48,67] } row[19] ={ values [17,5,-1,-3] positions: [19,30,97,99] } row[20] ={ values [9,7,-5,17,5,9,4,-6,2] positions: [7,9,11,20,24,34,43,46,74] } row[21] ={ values [17,9] positions: [21,73] } row[22] ={ values [8,17,-3] positions: [12,22,72] } row[23] ={ values [17,1,-6,4] positions: [23,33,61,97] } row[24] ={ values [17,-1,8,-7,-6,-2,-10,3] positions: [24,37,42,43,54,82,84,97] } row[25] ={ values [9,-3,17,8,-8,-5,9,-6,-10,7] positions: [11,12,25,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,17,-3,-5,1] positions: [9,11,25,26,28,79,94] } row[27] ={ values [-9,17,3,-1,8,-8] positions: [10,27,39,47,75,95] } row[28] ={ values [17,-5] positions: [28,74] } row[29] ={ values [-8,-1,17,5,-2] positions: [7,20,29,74,77] } row[30] ={ values [17,2,5] positions: [30,40,61] } row[31] ={ values [17,4] positions: [31,65] } row[32] ={ values [23] positions: [32] } row[33] ={ values [-6,17,8] positions: [11,33,92] } row[34] ={ values [5,1,1,17,9,8,-4,-9,-6] positions: [12,31,33,34,76,79,81,91,93] } row[35] ={ values [9,17,-9,7,3,8] positions: [23,35,51,64,80,84] } row[36] ={ values [-2,3,17,2] positions: [14,25,36,70] } row[37] ={ values [-6,3,17,-1,-10,-4] positions: [21,29,37,76,83,97] } row[38] ={ values [-8,17,-3,-6] positions: [25,38,42,69] } row[39] ={ values [17,5,8,-7,-10] positions: [39,48,74,83,91] } row[40] ={ values [-8,-4,-3,17,9,-9] positions: [6,11,25,40,54,59] } row[41] ={ values [17] positions: [41] } row[42] ={ values [-4,-3,17] positions: [1,37,42] } row[43] ={ values [-7,17,-7,1,9,4] positions: [20,43,51,78,91,94] } row[44] ={ values [17,6] positions: [44,69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,17,1] positions: [6,20,21,29,36,39,43,45,59] } row[46] ={ values [-8,8,17] positions: [25,44,46] } row[47] ={ values [-2,-4,-5,6,17,3,2,-9,-7,4] positions: [5,7,9,37,47,50,55,61,63,71] } row[48] ={ values [-2,9,9,17,4] positions: [33,38,40,48,71] } row[49] ={ values [9,17] positions: [35,49] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,17,-2] positions: [5,11,28,32,34,38,40,45,50,80] } row[51] ={ values [17] positions: [51] } row[52] ={ values [4,7,-6,17,-9,4,-2,4] positions: [15,17,45,52,61,72,75,96] } row[53] ={ values [2,17,5] positions: [38,53,58] } row[54] ={ values [7,17,-2] positions: [26,54,94] } row[55] ={ values [-8,9,17,2,-2] positions: [2,36,55,60,98] } row[56] ={ values [-4,17] positions: [19,56] } row[57] ={ values [7,7,4,-8,17,9,-1,6,9] positions: [6,18,32,39,57,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,17,5,-6] positions: [2,16,26,32,39,43,54,58,66,67] } row[59] ={ values [17,-8] positions: [59,95] } row[60] ={ values [1,-10,6,8,17,5,6,-10,-5] positions: [8,17,26,37,60,62,72,75,92] } row[61] ={ values [3,5,17] positions: [10,17,61] } row[62] ={ values [5,-4,-8,6,-9,-8,17,3,-8] positions: [6,14,34,35,49,57,62,66,84] } row[63] ={ values [9,3,-8,13,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,17,-1,9,9] positions: [51,64,86,88,94] } row[65] ={ values [17,2,4] positions: [65,79,92] } row[66] ={ values [7,-5,-4,8,17] positions: [9,13,19,37,66] } row[67] ={ values [-3,4,-1,17,-10,-1] positions: [27,55,66,67,80,97] } row[68] ={ values [-2,17,-6] positions: [33,68,70] } row[69] ={ values [17,-10] positions: [69,81] } row[70] ={ values [-1,-5,-2,17,1] positions: [34,45,53,70,89] } row[71] ={ values [6,2,-1,17,6] positions: [61,64,70,71,88] } row[72] ={ values [17] positions: [72] } row[73] ={ values [-7,-7,17] positions: [42,72,73] } row[74] ={ values [-7,-1,-2,7,7,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [17] positions: [75] } row[76] ={ values [17] positions: [76] } row[77] ={ values [1,17] positions: [18,77] } row[78] ={ values [-7,-10,-4,2,9,17,9] positions: [22,43,51,72,75,78,83] } row[79] ={ values [-5,17] positions: [8,79] } row[80] ={ values [17] positions: [80] } row[81] ={ values [-2,5,17,2,-9] positions: [51,70,81,86,87] } row[82] ={ values [2,-8,1,17] positions: [32,36,41,82] } row[83] ={ values [8,-8,9,-7,-1,-7,17,-6] positions: [15,27,32,48,60,65,83,97] } row[84] ={ values [-2,-9,8,7,-5,17,7,-2,8] positions: [9,12,34,35,38,84,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,17,8,-3,-7] positions: [22,31,39,59,74,85,95,97,99] } row[86] ={ values [9,-1,-5,-3,17] positions: [9,13,54,80,86] } row[87] ={ values [1,-7,-7,17] positions: [14,48,83,87] } row[88] ={ values [-6,1,9,9,-5,-5,-1,17,9] positions: [6,40,47,59,62,73,82,88,91] } row[89] ={ values [-1,-9,1,-2,-2,2,21] positions: [3,10,11,20,22,30,89] } row[90] ={ values [17] positions: [90] } row[91] ={ values [-7,2,6,17,2] positions: [30,44,51,91,99] } row[92] ={ values [17] positions: [92] } row[93] ={ values [4,9,-2,17] positions: [80,85,87,93] } row[94] ={ values [11] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8,17] positions: [20,22,41,51,72,84,95] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8,17] positions: [3,8,13,27,34,41,68,69,70,96] } row[97] ={ values [-10,-10,7,-9,-3,-10,3,17] positions: [17,20,34,35,41,66,85,97] } row[98] ={ values [9,-2,-2,17] positions: [36,59,74,98] } row[99] ={ values [-2,17] positions: [43,99] } row[100] ={ values [-2,5,-6,-7,4,-6,9,17] positions: [13,35,47,53,58,68,82,100] } After subtracting 17 again it is now: row[1] ={ values [-10,-4] positions: [40,94] } row[2] ={ values [6,9] positions: [38,56] } row[3] ={ values [5,6,-1,-7,-10,1,-9,6] positions: [19,37,45,54,82,84,91,93] } row[4] ={ values [9,1,-1,3,-7] positions: [9,14,37,46,86] } row[5] ={ values [-5,7,-2,2,-4,9] positions: [24,25,40,66,70,83] } row[6] ={ values [-7,6,9,-9] positions: [39,58,65,98] } row[7] ={ values [3,7,6,-6,-2] positions: [22,26,48,84,85] } row[8] ={ values [9,9,2,-10,6] positions: [54,60,61,91,92] } row[9] ={ values [6,-8,5,2,9] positions: [21,35,52,73,96] } row[10] ={ values [1,8,-1,-3,1,6,1,2] positions: [13,28,68,69,75,78,98,100] } row[11] ={ values [5,-10,-3,1,3,-4,-8,-5] positions: [2,4,6,43,61,88,89,99] } row[12] ={ values [5,8] positions: [56,91] } row[13] ={ values [8,1,9,4,-3,5] positions: [7,17,19,41,82,88] } row[14] ={ values [-4,3] positions: [69,97] } row[15] ={ values [-9,-7] positions: [2,66] } row[16] ={ values [9,7,6,-8] positions: [44,60,75,94] } row[17] ={ values [-3,9,6,-4,-4,-5,-6] positions: [7,23,26,34,50,68,94] } row[18] ={ values [-1,-3] positions: [48,67] } row[19] ={ values [5,-1,-3] positions: [30,97,99] } row[20] ={ values [9,7,-5,5,9,4,-6,2] positions: [7,9,11,24,34,43,46,74] } row[21] ={ values [9] positions: [73] } row[22] ={ values [8,-3] positions: [12,72] } row[23] ={ values [1,-6,4] positions: [33,61,97] } row[24] ={ values [-1,8,-7,-6,-2,-10,3] positions: [37,42,43,54,82,84,97] } row[25] ={ values [9,-3,8,-8,-5,9,-6,-10,7] positions: [11,12,33,46,49,65,75,81,88] } row[26] ={ values [-1,-9,-4,-3,-5,1] positions: [9,11,25,28,79,94] } row[27] ={ values [-9,3,-1,8,-8] positions: [10,39,47,75,95] } row[28] ={ values [-5] positions: [74] } row[29] ={ values [-8,-1,5,-2] positions: [7,20,74,77] } row[30] ={ values [2,5] positions: [40,61] } row[31] ={ values [4] positions: [65] } row[32] ={ values [6] positions: [32] } row[33] ={ values [-6,8] positions: [11,92] } row[34] ={ values [5,1,1,9,8,-4,-9,-6] positions: [12,31,33,76,79,81,91,93] } row[35] ={ values [9,-9,7,3,8] positions: [23,51,64,80,84] } row[36] ={ values [-2,3,2] positions: [14,25,70] } row[37] ={ values [-6,3,-1,-10,-4] positions: [21,29,76,83,97] } row[38] ={ values [-8,-3,-6] positions: [25,42,69] } row[39] ={ values [5,8,-7,-10] positions: [48,74,83,91] } row[40] ={ values [-8,-4,-3,9,-9] positions: [6,11,25,54,59] } row[41] ={ values [] positions: [] } row[42] ={ values [-4,-3] positions: [1,37] } row[43] ={ values [-7,-7,1,9,4] positions: [20,51,78,91,94] } row[44] ={ values [6] positions: [69] } row[45] ={ values [-4,-2,-6,1,-5,5,-6,1] positions: [6,20,21,29,36,39,43,59] } row[46] ={ values [-8,8] positions: [25,44] } row[47] ={ values [-2,-4,-5,6,3,2,-9,-7,4] positions: [5,7,9,37,50,55,61,63,71] } row[48] ={ values [-2,9,9,4] positions: [33,38,40,71] } row[49] ={ values [9] positions: [35] } row[50] ={ values [-7,-6,-8,5,9,3,9,-2,-2] positions: [5,11,28,32,34,38,40,45,80] } row[51] ={ values [] positions: [] } row[52] ={ values [4,7,-6,-9,4,-2,4] positions: [15,17,45,61,72,75,96] } row[53] ={ values [2,5] positions: [38,58] } row[54] ={ values [7,-2] positions: [26,94] } row[55] ={ values [-8,9,2,-2] positions: [2,36,60,98] } row[56] ={ values [-4] positions: [19] } row[57] ={ values [7,7,4,-8,9,-1,6,9] positions: [6,18,32,39,59,78,83,91] } row[58] ={ values [-3,9,6,-7,-8,3,2,5,-6] positions: [2,16,26,32,39,43,54,66,67] } row[59] ={ values [-8] positions: [95] } row[60] ={ values [1,-10,6,8,5,6,-10,-5] positions: [8,17,26,37,62,72,75,92] } row[61] ={ values [3,5] positions: [10,17] } row[62] ={ values [5,-4,-8,6,-9,-8,3,-8] positions: [6,14,34,35,49,57,66,84] } row[63] ={ values [9,3,-8,-4,-10,-10,-10] positions: [3,14,15,63,80,84,94] } row[64] ={ values [-3,-1,9,9] positions: [51,86,88,94] } row[65] ={ values [2,4] positions: [79,92] } row[66] ={ values [7,-5,-4,8] positions: [9,13,19,37] } row[67] ={ values [-3,4,-1,-10,-1] positions: [27,55,66,80,97] } row[68] ={ values [-2,-6] positions: [33,70] } row[69] ={ values [-10] positions: [81] } row[70] ={ values [-1,-5,-2,1] positions: [34,45,53,89] } row[71] ={ values [6,2,-1,6] positions: [61,64,70,88] } row[72] ={ values [] positions: [] } row[73] ={ values [-7,-7] positions: [42,72] } row[74] ={ values [-7,-1,-2,7,-10,-5,-6,-3] positions: [7,31,56,59,74,78,80,92] } row[75] ={ values [] positions: [] } row[76] ={ values [] positions: [] } row[77] ={ values [1] positions: [18] } row[78] ={ values [-7,-10,-4,2,9,9] positions: [22,43,51,72,75,83] } row[79] ={ values [-5] positions: [8] } row[80] ={ values [] positions: [] } row[81] ={ values [-2,5,2,-9] positions: [51,70,86,87] } row[82] ={ values [2,-8,1] positions: [32,36,41] } row[83] ={ values [8,-8,9,-7,-1,-7,-6] positions: [15,27,32,48,60,65,97] } row[84] ={ values [-2,-9,8,7,-5,7,-2,8] positions: [9,12,34,35,38,93,96,97] } row[85] ={ values [2,-7,-4,1,-6,8,-3,-7] positions: [22,31,39,59,74,95,97,99] } row[86] ={ values [9,-1,-5,-3] positions: [9,13,54,80] } row[87] ={ values [1,-7,-7] positions: [14,48,83] } row[88] ={ values [-6,1,9,9,-5,-5,-1,9] positions: [6,40,47,59,62,73,82,91] } row[89] ={ values [-1,-9,1,-2,-2,2,4] positions: [3,10,11,20,22,30,89] } row[90] ={ values [] positions: [] } row[91] ={ values [-7,2,6,2] positions: [30,44,51,99] } row[92] ={ values [] positions: [] } row[93] ={ values [4,9,-2] positions: [80,85,87] } row[94] ={ values [-6] positions: [94] } row[95] ={ values [5,-7,-6,-2,5,-8] positions: [20,22,41,51,72,84] } row[96] ={ values [1,-6,-7,-10,-5,5,3,-5,-8] positions: [3,8,13,27,34,41,68,69,70] } row[97] ={ values [-10,-10,7,-9,-3,-10,3] positions: [17,20,34,35,41,66,85] } row[98] ={ values [9,-2,-2] positions: [36,59,74] } row[99] ={ values [-2] positions: [43] } row[100] ={ values [-2,5,-6,-7,4,-6,9] positions: [13,35,47,53,58,68,82] } scalar addition OK A = 5x5 zero smat: row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } After adding 17 to A it is now: row[1] ={ values [17] positions: [1] } row[2] ={ values [17] positions: [2] } row[3] ={ values [17] positions: [3] } row[4] ={ values [17] positions: [4] } row[5] ={ values [17] positions: [5] } After subtracting 17 again it is now: row[1] ={ values [] positions: [] } row[2] ={ values [] positions: [] } row[3] ={ values [] positions: [] } row[4] ={ values [] positions: [] } row[5] ={ values [] positions: [] } scalar addition OK test multiplication of smat by matrix enter smat: first row, col and then the rows now enter matrix: first row, col and then the entries the smat is (as a matrix) [[0,-10,-4], [0,6,0], [5,-7,6]] the matrix is [[1,2,3,4], [0,5,6,0], [7,8,9,10]] the product matrix is: [[-28,-82,-96,-40], [0,30,36,0], [47,23,27,80]] Correct Testing transpose function A=(A^t)^t ? yes! enter new value of t test of kernel function enter size of matrix for elimination (row,col) Do you want to input the matrix for elimination or do you want a matrix with random entries? (1 for random and zero otherwise want to determine the rank using matrix? (1 = yes; 0 = no )How many maximum number of non-zero entries per row? enter seed for random number generator calculating matrix, done rank using echmodp : 95 number of non-zero entries: 525 rank is:95 number of non-zero entries: 427 kernel correct enter new value of t eclib-20250122/tests/out_ntl/space1.out000066400000000000000000000006121474421343600175710ustar00rootroot00000000000000 Subspace package test program Enter size of square matrix M: Enter entries of M: M = [[1,2,3], [4,5,6], [7,8,9]] Trace(M) = 15 Enter number of times to repeat kernel tests: kernel(m) has basis [[1], [-2], [1]] pivots: [3] denom: 1 Now compute kernel mod p, p = 1073741789 kernel(m) has basis [[1], [-2], [1]] pivots: [3] !!! Agrees with old version !!! Enter size of square matrix M: eclib-20250122/tests/out_ntl/space2.out000066400000000000000000000006121474421343600175720ustar00rootroot00000000000000 Subspace package test program Enter size of square matrix M: Enter entries of M: M = [[1,2,3], [4,5,6], [7,8,9]] Trace(M) = 15 Enter number of times to repeat kernel tests: kernel(m) has basis [[1], [-2], [1]] pivots: [3] denom: 1 Now compute kernel mod p, p = 1073741789 kernel(m) has basis [[1], [-2], [1]] pivots: [3] !!! Agrees with old version !!! Enter size of square matrix M: eclib-20250122/tests/out_ntl/space3.out000066400000000000000000000006121474421343600175730ustar00rootroot00000000000000 Subspace package test program Enter size of square matrix M: Enter entries of M: M = [[1,2,3], [4,5,6], [7,8,9]] Trace(M) = 15 Enter number of times to repeat kernel tests: kernel(m) has basis [[1], [-2], [1]] pivots: [3] denom: 1 Now compute kernel mod p, p = 1073741789 kernel(m) has basis [[1], [-2], [1]] pivots: [3] !!! Agrees with old version !!! Enter size of square matrix M: eclib-20250122/tests/out_ntl/svectest1.out000066400000000000000000000015201474421343600203350ustar00rootroot00000000000000Test run of sparse vector package. Enter n : Uninitialized new vec v = [] Copy of v = [] Enter new entries of v: Dimension = Number of entries = Position: Entry: Position: Entry: Position: Entry: Now v = [(1:2),(3:4),(5:6)] w = [] After w=v, Now v = [(1:2),(3:4),(5:6)] Now w = [(1:2),(3:4),(5:6)] w==v: 1 w!=v: 0 v+w = [(1:4),(3:8),(5:12)] v-w = [] Enter i : After w*=2, w = [(1:4),(3:8),(5:12)] 3*v = [(1:6),(3:12),(5:18)] Now v = [(1:2),(3:4),(5:6)] v+w = [(1:6),(3:12),(5:18)] Now v = [(1:2),(3:4),(5:6)] v-w = [(1:-2),(3:-4),(5:-6)] Now v = [(1:2),(3:4),(5:6)] w/2 = [(1:2),(3:4),(5:6)] Now w = [(1:4),(3:8),(5:12)] -v = [(1:-2),(3:-4),(5:-6)] +v = [(1:2),(3:4),(5:6)] +w = [(1:4),(3:8),(5:12)] 2*v-w = [] Resetting w[1] to 99: w = [(1:99),(3:8),(5:12)] After w-=2*v, w = [(1:95)] v as an ordinary vector = [2,0,4,0,6,0,0,0,0,0] eclib-20250122/tests/out_ntl/svectest2.out000066400000000000000000000015201474421343600203360ustar00rootroot00000000000000Test run of sparse vector package. Enter n : Uninitialized new vec v = [] Copy of v = [] Enter new entries of v: Dimension = Number of entries = Position: Entry: Position: Entry: Position: Entry: Now v = [(1:2),(3:4),(5:6)] w = [] After w=v, Now v = [(1:2),(3:4),(5:6)] Now w = [(1:2),(3:4),(5:6)] w==v: 1 w!=v: 0 v+w = [(1:4),(3:8),(5:12)] v-w = [] Enter i : After w*=2, w = [(1:4),(3:8),(5:12)] 3*v = [(1:6),(3:12),(5:18)] Now v = [(1:2),(3:4),(5:6)] v+w = [(1:6),(3:12),(5:18)] Now v = [(1:2),(3:4),(5:6)] v-w = [(1:-2),(3:-4),(5:-6)] Now v = [(1:2),(3:4),(5:6)] w/2 = [(1:2),(3:4),(5:6)] Now w = [(1:4),(3:8),(5:12)] -v = [(1:-2),(3:-4),(5:-6)] +v = [(1:2),(3:4),(5:6)] +w = [(1:4),(3:8),(5:12)] 2*v-w = [] Resetting w[1] to 99: w = [(1:99),(3:8),(5:12)] After w-=2*v, w = [(1:95)] v as an ordinary vector = [2,0,4,0,6,0,0,0,0,0] eclib-20250122/tests/out_ntl/svectest3.out000066400000000000000000000015201474421343600203370ustar00rootroot00000000000000Test run of sparse vector package. Enter n : Uninitialized new vec v = [] Copy of v = [] Enter new entries of v: Dimension = Number of entries = Position: Entry: Position: Entry: Position: Entry: Now v = [(1:2),(3:4),(5:6)] w = [] After w=v, Now v = [(1:2),(3:4),(5:6)] Now w = [(1:2),(3:4),(5:6)] w==v: 1 w!=v: 0 v+w = [(1:4),(3:8),(5:12)] v-w = [] Enter i : After w*=2, w = [(1:4),(3:8),(5:12)] 3*v = [(1:6),(3:12),(5:18)] Now v = [(1:2),(3:4),(5:6)] v+w = [(1:6),(3:12),(5:18)] Now v = [(1:2),(3:4),(5:6)] v-w = [(1:-2),(3:-4),(5:-6)] Now v = [(1:2),(3:4),(5:6)] w/2 = [(1:2),(3:4),(5:6)] Now w = [(1:4),(3:8),(5:12)] -v = [(1:-2),(3:-4),(5:-6)] +v = [(1:2),(3:4),(5:6)] +w = [(1:4),(3:8),(5:12)] 2*v-w = [] Resetting w[1] to 99: w = [(1:99),(3:8),(5:12)] After w-=2*v, w = [(1:95)] v as an ordinary vector = [2,0,4,0,6,0,0,0,0,0] eclib-20250122/tests/out_ntl/tate.out000066400000000000000000001211271474421343600173570ustar00rootroot00000000000000-------------------------------------------------------------------------------- Integral model: [0,-1,1,-10,-20] Curve [0,-1,1,-10,-20] (reduced minimal model) b2 = -4 b4 = -20 b6 = -79 b8 = -21 c4 = 496 c6 = 20008 disc = -161051 (bad primes: [ 11 ]; # real components = 1) #torsion not yet computed Conductor = 11 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 11 5 1 5 I5 5 -1 -------------------------------------------------------------------------------- Integral model: [1,0,1,4,-6] Curve [1,0,1,4,-6] (reduced minimal model) b2 = 1 b4 = 9 b6 = -23 b8 = -26 c4 = -215 c6 = 5291 disc = -21952 (bad primes: [ 2 7 ]; # real components = 1) #torsion not yet computed Conductor = 14 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 6 1 6 I6 2 1 7 3 1 3 I3 3 -1 -------------------------------------------------------------------------------- Integral model: [1,1,1,-10,-10] Curve [1,1,1,-10,-10] (reduced minimal model) b2 = 5 b4 = -19 b6 = -39 b8 = -139 c4 = 481 c6 = 4879 disc = 50625 (bad primes: [ 3 5 ]; # real components = 2) #torsion not yet computed Conductor = 15 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 4 1 4 I4 2 1 5 4 1 4 I4 4 -1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,-1,-14] Curve [1,-1,1,-1,-14] (reduced minimal model) b2 = -3 b4 = -1 b6 = -55 b8 = 41 c4 = 33 c6 = 12015 disc = -83521 (bad primes: [ 17 ]; # real components = 1) #torsion not yet computed Conductor = 17 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 17 4 1 4 I4 4 -1 -------------------------------------------------------------------------------- Integral model: [0,1,1,-9,-15] Curve [0,1,1,-9,-15] (reduced minimal model) b2 = 4 b4 = -18 b6 = -59 b8 = -140 c4 = 448 c6 = 10088 disc = -6859 (bad primes: [ 19 ]; # real components = 1) #torsion not yet computed Conductor = 19 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 19 3 1 3 I3 3 -1 -------------------------------------------------------------------------------- Integral model: [0,1,0,4,4] Curve [0,1,0,4,4] (reduced minimal model) b2 = 4 b4 = 8 b6 = 16 b8 = 0 c4 = -176 c6 = -2368 disc = -6400 (bad primes: [ 2 5 ]; # real components = 1) #torsion not yet computed Conductor = 20 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 2 0 IV* 3 -1 5 2 1 2 I2 2 1 -------------------------------------------------------------------------------- Integral model: [1,0,0,-4,-1] Curve [1,0,0,-4,-1] (reduced minimal model) b2 = 1 b4 = -8 b6 = -4 b8 = -17 c4 = 193 c6 = 575 disc = 3969 (bad primes: [ 3 7 ]; # real components = 2) #torsion not yet computed Conductor = 21 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 4 1 4 I4 4 -1 7 2 1 2 I2 2 1 -------------------------------------------------------------------------------- Integral model: [0,-1,0,-4,4] Curve [0,-1,0,-4,4] (reduced minimal model) b2 = -4 b4 = -8 b6 = 16 b8 = -32 c4 = 208 c6 = -2240 disc = 2304 (bad primes: [ 2 3 ]; # real components = 2) #torsion not yet computed Conductor = 24 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 3 0 I*1 4 -1 3 2 1 2 I2 2 1 -------------------------------------------------------------------------------- Integral model: [1,0,1,-5,-8] Curve [1,0,1,-5,-8] (reduced minimal model) b2 = 1 b4 = -9 b6 = -31 b8 = -28 c4 = 217 c6 = 6371 disc = -17576 (bad primes: [ 2 13 ]; # real components = 1) #torsion not yet computed Conductor = 26 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 3 1 3 I3 1 1 13 3 1 3 I3 3 -1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,-3,3] Curve [1,-1,1,-3,3] (reduced minimal model) b2 = -3 b4 = -5 b6 = 13 b8 = -16 c4 = 129 c6 = -2241 disc = -1664 (bad primes: [ 2 13 ]; # real components = 1) #torsion not yet computed Conductor = 26 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 7 1 7 I7 7 -1 13 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,0,1,0,-7] Curve [0,0,1,0,-7] (reduced minimal model) b2 = 0 b4 = 0 b6 = -27 b8 = 0 c4 = 0 c6 = 5832 disc = -19683 (bad primes: [ 3 ]; # real components = 1) #torsion not yet computed Conductor = 27 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 9 3 0 IV* 3 -1 -------------------------------------------------------------------------------- Integral model: [1,0,1,1,2] Curve [1,0,1,1,2] (reduced minimal model) b2 = 1 b4 = 3 b6 = 9 b8 = 0 c4 = -71 c6 = -1837 disc = -2160 (bad primes: [ 2 3 5 ]; # real components = 1) #torsion not yet computed Conductor = 30 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 1 4 I4 2 1 3 3 1 3 I3 3 -1 5 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,0,0,4,0] Curve [0,0,0,4,0] (reduced minimal model) b2 = 0 b4 = 8 b6 = 0 b8 = -16 c4 = -192 c6 = 0 disc = -4096 (bad primes: [ 2 ]; # real components = 1) #torsion not yet computed Conductor = 32 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 12 5 0 I*3 4 -1 -------------------------------------------------------------------------------- Integral model: [1,1,0,-11,0] Curve [1,1,0,-11,0] (reduced minimal model) b2 = 5 b4 = -22 b6 = 0 b8 = -121 c4 = 553 c6 = -4085 disc = 88209 (bad primes: [ 3 11 ]; # real components = 2) #torsion not yet computed Conductor = 33 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 6 1 6 I6 2 1 11 2 1 2 I2 2 -1 -------------------------------------------------------------------------------- Integral model: [1,0,0,-3,1] Curve [1,0,0,-3,1] (reduced minimal model) b2 = 1 b4 = -6 b6 = 4 b8 = -8 c4 = 145 c6 = -1081 disc = 1088 (bad primes: [ 2 17 ]; # real components = 2) #torsion not yet computed Conductor = 34 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 6 1 6 I6 6 -1 17 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,1,1,9,1] Curve [0,1,1,9,1] (reduced minimal model) b2 = 4 b4 = 18 b6 = 5 b8 = -76 c4 = -416 c6 = 1448 disc = -42875 (bad primes: [ 5 7 ]; # real components = 1) #torsion not yet computed Conductor = 35 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 5 3 1 3 I3 1 1 7 3 1 3 I3 3 -1 -------------------------------------------------------------------------------- Integral model: [0,0,0,0,1] Curve [0,0,0,0,1] (reduced minimal model) b2 = 0 b4 = 0 b6 = 4 b8 = 0 c4 = 0 c6 = -864 disc = -432 (bad primes: [ 2 3 ]; # real components = 1) #torsion not yet computed Conductor = 36 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 2 0 IV 3 -1 3 3 2 0 III 2 1 -------------------------------------------------------------------------------- Integral model: [0,0,1,-1,0] Curve [0,0,1,-1,0] (reduced minimal model) b2 = 0 b4 = -2 b6 = 1 b8 = -1 c4 = 48 c6 = -216 disc = 37 (bad primes: [ 37 ]; # real components = 2) #torsion not yet computed Conductor = 37 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 37 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,1,1,-23,-50] Curve [0,1,1,-23,-50] (reduced minimal model) b2 = 4 b4 = -46 b6 = -199 b8 = -728 c4 = 1120 c6 = 36296 disc = 50653 (bad primes: [ 37 ]; # real components = 2) #torsion not yet computed Conductor = 37 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 37 3 1 3 I3 3 -1 -------------------------------------------------------------------------------- Integral model: [1,0,1,9,90] Curve [1,0,1,9,90] (reduced minimal model) b2 = 1 b4 = 19 b6 = 361 b8 = 0 c4 = -455 c6 = -77293 disc = -3511808 (bad primes: [ 2 19 ]; # real components = 1) #torsion not yet computed Conductor = 38 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 9 1 9 I9 1 1 19 3 1 3 I3 3 -1 -------------------------------------------------------------------------------- Integral model: [1,1,1,0,1] Curve [1,1,1,0,1] (reduced minimal model) b2 = 5 b4 = 1 b6 = 5 b8 = 6 c4 = 1 c6 = -1025 disc = -608 (bad primes: [ 2 19 ]; # real components = 1) #torsion not yet computed Conductor = 38 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 5 1 5 I5 5 -1 19 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,1,0,-4,-5] Curve [1,1,0,-4,-5] (reduced minimal model) b2 = 5 b4 = -8 b6 = -20 b8 = -41 c4 = 217 c6 = 2755 disc = 1521 (bad primes: [ 3 13 ]; # real components = 2) #torsion not yet computed Conductor = 39 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 2 1 2 I2 2 1 13 2 1 2 I2 2 -1 -------------------------------------------------------------------------------- Integral model: [0,0,0,-7,-6] Curve [0,0,0,-7,-6] (reduced minimal model) b2 = 0 b4 = -14 b6 = -24 b8 = -49 c4 = 336 c6 = 5184 disc = 6400 (bad primes: [ 2 5 ]; # real components = 2) #torsion not yet computed Conductor = 40 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 3 0 I*1 2 1 5 2 1 2 I2 2 -1 -------------------------------------------------------------------------------- Integral model: [1,1,1,-4,5] Curve [1,1,1,-4,5] (reduced minimal model) b2 = 5 b4 = -7 b6 = 21 b8 = 14 c4 = 193 c6 = -5921 disc = -16128 (bad primes: [ 2 3 7 ]; # real components = 1) #torsion not yet computed Conductor = 42 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 1 8 I8 8 -1 3 2 1 2 I2 2 1 7 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,1,1,0,0] Curve [0,1,1,0,0] (reduced minimal model) b2 = 4 b4 = 0 b6 = 1 b8 = 1 c4 = 16 c6 = -280 disc = -43 (bad primes: [ 43 ]; # real components = 1) #torsion not yet computed Conductor = 43 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 43 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,1,0,3,-1] Curve [0,1,0,3,-1] (reduced minimal model) b2 = 4 b4 = 6 b6 = -4 b8 = -13 c4 = -128 c6 = 1664 disc = -2816 (bad primes: [ 2 11 ]; # real components = 1) #torsion not yet computed Conductor = 44 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 2 0 IV* 3 -1 11 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,-1,0,0,-5] Curve [1,-1,0,0,-5] (reduced minimal model) b2 = -3 b4 = 0 b6 = -20 b8 = 15 c4 = 9 c6 = 4347 disc = -10935 (bad primes: [ 3 5 ]; # real components = 1) #torsion not yet computed Conductor = 45 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 7 2 1 I*1 2 -1 5 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,-1,0,-10,-12] Curve [1,-1,0,-10,-12] (reduced minimal model) b2 = -3 b4 = -20 b6 = -48 b8 = -64 c4 = 489 c6 = 12555 disc = -23552 (bad primes: [ 2 23 ]; # real components = 1) #torsion not yet computed Conductor = 46 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 10 1 10 I10 2 1 23 1 1 1 I1 1 -1 -------------------------------------------------------------------------------- Integral model: [0,1,0,-4,-4] Curve [0,1,0,-4,-4] (reduced minimal model) b2 = 4 b4 = -8 b6 = -16 b8 = -32 c4 = 208 c6 = 2240 disc = 2304 (bad primes: [ 2 3 ]; # real components = 2) #torsion not yet computed Conductor = 48 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 4 0 I*0 2 1 3 2 1 2 I2 2 -1 -------------------------------------------------------------------------------- Integral model: [1,-1,0,-2,-1] Curve [1,-1,0,-2,-1] (reduced minimal model) b2 = -3 b4 = -4 b6 = -4 b8 = -1 c4 = 105 c6 = 1323 disc = -343 (bad primes: [ 7 ]; # real components = 1) #torsion not yet computed Conductor = 49 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 7 3 2 0 III 2 -1 -------------------------------------------------------------------------------- Integral model: [1,0,1,-1,-2] Curve [1,0,1,-1,-2] (reduced minimal model) b2 = 1 b4 = -1 b6 = -7 b8 = -2 c4 = 25 c6 = 1475 disc = -1250 (bad primes: [ 2 5 ]; # real components = 1) #torsion not yet computed Conductor = 50 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 1 1 1 I1 1 1 5 4 2 0 IV 3 -1 -------------------------------------------------------------------------------- Integral model: [1,1,1,-3,1] Curve [1,1,1,-3,1] (reduced minimal model) b2 = 5 b4 = -5 b6 = 5 b8 = 0 c4 = 145 c6 = -2105 disc = -800 (bad primes: [ 2 5 ]; # real components = 1) #torsion not yet computed Conductor = 50 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 5 1 5 I5 5 -1 5 2 2 0 II 1 1 -------------------------------------------------------------------------------- Integral model: [0,1,1,1,-1] Curve [0,1,1,1,-1] (reduced minimal model) b2 = 4 b4 = 2 b6 = -3 b8 = -4 c4 = -32 c6 = 872 disc = -459 (bad primes: [ 3 17 ]; # real components = 1) #torsion not yet computed Conductor = 51 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 3 1 3 I3 3 -1 17 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,0,0,1,-10] Curve [0,0,0,1,-10] (reduced minimal model) b2 = 0 b4 = 2 b6 = -40 b8 = -1 c4 = -48 c6 = 8640 disc = -43264 (bad primes: [ 2 13 ]; # real components = 1) #torsion not yet computed Conductor = 52 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 2 0 IV* 1 -1 13 2 1 2 I2 2 1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,0,0] Curve [1,-1,1,0,0] (reduced minimal model) b2 = -3 b4 = 1 b6 = 1 b8 = -1 c4 = -15 c6 = -297 disc = -53 (bad primes: [ 53 ]; # real components = 1) #torsion not yet computed Conductor = 53 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 53 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,-1,0,12,8] Curve [1,-1,0,12,8] (reduced minimal model) b2 = -3 b4 = 24 b6 = 32 b8 = -168 c4 = -567 c6 = -9477 disc = -157464 (bad primes: [ 2 3 ]; # real components = 1) #torsion not yet computed Conductor = 54 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 3 1 3 I3 1 1 3 9 3 0 IV* 3 -1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,1,-1] Curve [1,-1,1,1,-1] (reduced minimal model) b2 = -3 b4 = 3 b6 = -3 b8 = 0 c4 = -63 c6 = 351 disc = -216 (bad primes: [ 2 3 ]; # real components = 1) #torsion not yet computed Conductor = 54 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 3 1 3 I3 3 -1 3 3 3 0 II 1 1 -------------------------------------------------------------------------------- Integral model: [1,-1,0,-4,3] Curve [1,-1,0,-4,3] (reduced minimal model) b2 = -3 b4 = -8 b6 = 12 b8 = -25 c4 = 201 c6 = -1701 disc = 3025 (bad primes: [ 5 11 ]; # real components = 2) #torsion not yet computed Conductor = 55 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 5 2 1 2 I2 2 -1 11 2 1 2 I2 2 1 -------------------------------------------------------------------------------- Integral model: [0,-1,0,0,-4] Curve [0,-1,0,0,-4] (reduced minimal model) b2 = -4 b4 = 0 b6 = -16 b8 = 16 c4 = 16 c6 = 3520 disc = -7168 (bad primes: [ 2 7 ]; # real components = 1) #torsion not yet computed Conductor = 56 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 10 3 0 III* 2 1 7 1 1 1 I1 1 -1 -------------------------------------------------------------------------------- Integral model: [0,0,0,1,2] Curve [0,0,0,1,2] (reduced minimal model) b2 = 0 b4 = 2 b6 = 8 b8 = -1 c4 = -48 c6 = -1728 disc = -1792 (bad primes: [ 2 7 ]; # real components = 1) #torsion not yet computed Conductor = 56 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 3 0 I*1 4 -1 7 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,-1,1,-2,2] Curve [0,-1,1,-2,2] (reduced minimal model) b2 = -4 b4 = -4 b6 = 9 b8 = -13 c4 = 112 c6 = -1304 disc = -171 (bad primes: [ 3 19 ]; # real components = 1) #torsion not yet computed Conductor = 57 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 2 1 2 I2 2 1 19 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,0,1,-7,5] Curve [1,0,1,-7,5] (reduced minimal model) b2 = 1 b4 = -13 b6 = 21 b8 = -37 c4 = 313 c6 = -5005 disc = 3249 (bad primes: [ 3 19 ]; # real components = 2) #torsion not yet computed Conductor = 57 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 2 1 2 I2 2 -1 19 2 1 2 I2 2 1 -------------------------------------------------------------------------------- Integral model: [0,1,1,20,-32] Curve [0,1,1,20,-32] (reduced minimal model) b2 = 4 b4 = 40 b6 = -127 b8 = -527 c4 = -944 c6 = 33128 disc = -1121931 (bad primes: [ 3 19 ]; # real components = 1) #torsion not yet computed Conductor = 57 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 10 1 10 I10 10 -1 19 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,-1,0,-1,1] Curve [1,-1,0,-1,1] (reduced minimal model) b2 = -3 b4 = -2 b6 = 4 b8 = -4 c4 = 57 c6 = -621 disc = -116 (bad primes: [ 2 29 ]; # real components = 1) #torsion not yet computed Conductor = 58 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 2 1 2 I2 2 1 29 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,1,1,5,9] Curve [1,1,1,5,9] (reduced minimal model) b2 = 5 b4 = 11 b6 = 37 b8 = 16 c4 = -239 c6 = -6137 disc = -29696 (bad primes: [ 2 29 ]; # real components = 1) #torsion not yet computed Conductor = 58 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 10 1 10 I10 10 -1 29 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,0,0,-2,1] Curve [1,0,0,-2,1] (reduced minimal model) b2 = 1 b4 = -4 b6 = 4 b8 = -3 c4 = 97 c6 = -1009 disc = -61 (bad primes: [ 61 ]; # real components = 1) #torsion not yet computed Conductor = 61 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 61 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,-1,1] Curve [1,-1,1,-1,1] (reduced minimal model) b2 = -3 b4 = -1 b6 = 5 b8 = -4 c4 = 33 c6 = -945 disc = -496 (bad primes: [ 2 31 ]; # real components = 1) #torsion not yet computed Conductor = 62 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 1 4 I4 4 -1 31 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,-1,0,9,0] Curve [1,-1,0,9,0] (reduced minimal model) b2 = -3 b4 = 18 b6 = 0 b8 = -81 c4 = -423 c6 = -1917 disc = -45927 (bad primes: [ 3 7 ]; # real components = 1) #torsion not yet computed Conductor = 63 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 8 2 2 I*2 2 -1 7 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,0,0,-4,0] Curve [0,0,0,-4,0] (reduced minimal model) b2 = 0 b4 = -8 b6 = 0 b8 = -16 c4 = 192 c6 = 0 disc = 4096 (bad primes: [ 2 ]; # real components = 2) #torsion not yet computed Conductor = 64 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 12 6 0 I*2 4 -1 -------------------------------------------------------------------------------- Integral model: [1,0,0,-1,0] Curve [1,0,0,-1,0] (reduced minimal model) b2 = 1 b4 = -2 b6 = 0 b8 = -1 c4 = 49 c6 = -73 disc = 65 (bad primes: [ 5 13 ]; # real components = 2) #torsion not yet computed Conductor = 65 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 5 1 1 1 I1 1 1 13 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,0,1,-6,4] Curve [1,0,1,-6,4] (reduced minimal model) b2 = 1 b4 = -11 b6 = 17 b8 = -26 c4 = 265 c6 = -4069 disc = 1188 (bad primes: [ 2 3 11 ]; # real components = 2) #torsion not yet computed Conductor = 66 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 2 1 2 I2 2 1 3 3 1 3 I3 3 -1 11 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,1,1,-2,-1] Curve [1,1,1,-2,-1] (reduced minimal model) b2 = 5 b4 = -3 b6 = -3 b8 = -6 c4 = 97 c6 = -17 disc = 528 (bad primes: [ 2 3 11 ]; # real components = 2) #torsion not yet computed Conductor = 66 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 1 4 I4 4 -1 3 1 1 1 I1 1 1 11 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,0,0,-45,81] Curve [1,0,0,-45,81] (reduced minimal model) b2 = 1 b4 = -90 b6 = 324 b8 = -1944 c4 = 2161 c6 = -73225 disc = 2737152 (bad primes: [ 2 3 11 ]; # real components = 2) #torsion not yet computed Conductor = 66 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 10 1 10 I10 10 -1 3 5 1 5 I5 5 -1 11 1 1 1 I1 1 -1 -------------------------------------------------------------------------------- Integral model: [0,1,1,-12,-21] Curve [0,1,1,-12,-21] (reduced minimal model) b2 = 4 b4 = -24 b6 = -83 b8 = -227 c4 = 592 c6 = 14408 disc = -67 (bad primes: [ 67 ]; # real components = 1) #torsion not yet computed Conductor = 67 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 67 1 1 1 I1 1 -1 -------------------------------------------------------------------------------- Integral model: [1,0,1,-1,-1] Curve [1,0,1,-1,-1] (reduced minimal model) b2 = 1 b4 = -1 b6 = -3 b8 = -1 c4 = 25 c6 = 611 disc = -207 (bad primes: [ 3 23 ]; # real components = 1) #torsion not yet computed Conductor = 69 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 2 1 2 I2 2 -1 23 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,2,-3] Curve [1,-1,1,2,-3] (reduced minimal model) b2 = -3 b4 = 5 b6 = -11 b8 = 2 c4 = -111 c6 = 1863 disc = -2800 (bad primes: [ 2 5 7 ]; # real components = 1) #torsion not yet computed Conductor = 70 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 1 4 I4 4 -1 5 2 1 2 I2 2 1 7 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,0,0,6,-7] Curve [0,0,0,6,-7] (reduced minimal model) b2 = 0 b4 = 12 b6 = -28 b8 = -36 c4 = -288 c6 = 6048 disc = -34992 (bad primes: [ 2 3 ]; # real components = 1) #torsion not yet computed Conductor = 72 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 3 0 III 2 1 3 7 2 1 I*1 4 -1 -------------------------------------------------------------------------------- Integral model: [1,-1,0,4,-3] Curve [1,-1,0,4,-3] (reduced minimal model) b2 = -3 b4 = 8 b6 = -12 b8 = -7 c4 = -183 c6 = 1755 disc = -5329 (bad primes: [ 73 ]; # real components = 1) #torsion not yet computed Conductor = 73 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 73 2 1 2 I2 2 -1 -------------------------------------------------------------------------------- Integral model: [0,-1,1,-8,-7] Curve [0,-1,1,-8,-7] (reduced minimal model) b2 = -4 b4 = -16 b6 = -27 b8 = -37 c4 = 400 c6 = 8200 disc = -1875 (bad primes: [ 3 5 ]; # real components = 1) #torsion not yet computed Conductor = 75 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 1 1 1 I1 1 1 5 4 2 0 IV 1 -1 -------------------------------------------------------------------------------- Integral model: [1,0,1,-1,23] Curve [1,0,1,-1,23] (reduced minimal model) b2 = 1 b4 = -1 b6 = 93 b8 = 23 c4 = 25 c6 = -20125 disc = -234375 (bad primes: [ 3 5 ]; # real components = 1) #torsion not yet computed Conductor = 75 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 1 1 1 I1 1 -1 5 7 2 1 I*1 2 1 -------------------------------------------------------------------------------- Integral model: [0,1,1,2,4] Curve [0,1,1,2,4] (reduced minimal model) b2 = 4 b4 = 4 b6 = 17 b8 = 13 c4 = -80 c6 = -3160 disc = -6075 (bad primes: [ 3 5 ]; # real components = 1) #torsion not yet computed Conductor = 75 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 5 1 5 I5 5 -1 5 2 2 0 II 1 1 -------------------------------------------------------------------------------- Integral model: [0,-1,0,-21,-31] Curve [0,-1,0,-21,-31] (reduced minimal model) b2 = -4 b4 = -42 b6 = -124 b8 = -317 c4 = 1024 c6 = 32896 disc = -4864 (bad primes: [ 2 19 ]; # real components = 1) #torsion not yet computed Conductor = 76 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 2 0 IV* 1 -1 19 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,0,1,2,0] Curve [0,0,1,2,0] (reduced minimal model) b2 = 0 b4 = 4 b6 = 1 b8 = -4 c4 = -96 c6 = -216 disc = -539 (bad primes: [ 7 11 ]; # real components = 1) #torsion not yet computed Conductor = 77 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 7 2 1 2 I2 2 1 11 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,1,0,4,11] Curve [1,1,0,4,11] (reduced minimal model) b2 = 5 b4 = 8 b6 = 44 b8 = 39 c4 = -167 c6 = -8189 disc = -41503 (bad primes: [ 7 11 ]; # real components = 1) #torsion not yet computed Conductor = 77 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 7 3 1 3 I3 1 1 11 2 1 2 I2 2 -1 -------------------------------------------------------------------------------- Integral model: [0,1,1,-49,600] Curve [0,1,1,-49,600] (reduced minimal model) b2 = 4 b4 = -98 b6 = 2401 b8 = 0 c4 = 2368 c6 = -532792 disc = -156590819 (bad primes: [ 7 11 ]; # real components = 1) #torsion not yet computed Conductor = 77 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 7 6 1 6 I6 6 -1 11 3 1 3 I3 1 1 -------------------------------------------------------------------------------- Integral model: [1,1,0,-19,685] Curve [1,1,0,-19,685] (reduced minimal model) b2 = 5 b4 = -38 b6 = 2740 b8 = 3064 c4 = 937 c6 = -598805 disc = -207028224 (bad primes: [ 2 3 13 ]; # real components = 1) #torsion not yet computed Conductor = 78 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 16 1 16 I16 2 1 3 5 1 5 I5 1 1 13 1 1 1 I1 1 -1 -------------------------------------------------------------------------------- Integral model: [1,1,1,-2,0] Curve [1,1,1,-2,0] (reduced minimal model) b2 = 5 b4 = -3 b6 = 1 b8 = -1 c4 = 97 c6 = -881 disc = 79 (bad primes: [ 79 ]; # real components = 2) #torsion not yet computed Conductor = 79 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 79 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,0,0,-7,6] Curve [0,0,0,-7,6] (reduced minimal model) b2 = 0 b4 = -14 b6 = 24 b8 = -49 c4 = 336 c6 = -5184 disc = 6400 (bad primes: [ 2 5 ]; # real components = 2) #torsion not yet computed Conductor = 80 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 4 0 I*0 2 1 5 2 1 2 I2 2 -1 -------------------------------------------------------------------------------- Integral model: [0,-1,0,4,-4] Curve [0,-1,0,4,-4] (reduced minimal model) b2 = -4 b4 = 8 b6 = -16 b8 = 0 c4 = -176 c6 = 2368 disc = -6400 (bad primes: [ 2 5 ]; # real components = 1) #torsion not yet computed Conductor = 80 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 4 0 I*0 1 -1 5 2 1 2 I2 2 1 -------------------------------------------------------------------------------- Integral model: [1,0,1,-2,0] Curve [1,0,1,-2,0] (reduced minimal model) b2 = 1 b4 = -3 b6 = 1 b8 = -2 c4 = 73 c6 = -325 disc = 164 (bad primes: [ 2 41 ]; # real components = 2) #torsion not yet computed Conductor = 82 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 2 1 2 I2 2 1 41 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,1,1,1,0] Curve [1,1,1,1,0] (reduced minimal model) b2 = 5 b4 = 3 b6 = 1 b8 = -1 c4 = -47 c6 = 199 disc = -83 (bad primes: [ 83 ]; # real components = 1) #torsion not yet computed Conductor = 83 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 83 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,-1,0,-1,-2] Curve [0,-1,0,-1,-2] (reduced minimal model) b2 = -4 b4 = -2 b6 = -8 b8 = 7 c4 = 64 c6 = 2080 disc = -2352 (bad primes: [ 2 3 7 ]; # real components = 1) #torsion not yet computed Conductor = 84 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 2 0 IV 1 -1 3 1 1 1 I1 1 1 7 2 1 2 I2 2 1 -------------------------------------------------------------------------------- Integral model: [0,1,0,7,0] Curve [0,1,0,7,0] (reduced minimal model) b2 = 4 b4 = 14 b6 = 0 b8 = -49 c4 = -320 c6 = 1952 disc = -21168 (bad primes: [ 2 3 7 ]; # real components = 1) #torsion not yet computed Conductor = 84 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 2 0 IV 3 -1 3 3 1 3 I3 3 -1 7 2 1 2 I2 2 -1 -------------------------------------------------------------------------------- Integral model: [1,1,0,-8,-13] Curve [1,1,0,-8,-13] (reduced minimal model) b2 = 5 b4 = -16 b6 = -52 b8 = -129 c4 = 409 c6 = 8227 disc = 425 (bad primes: [ 5 17 ]; # real components = 2) #torsion not yet computed Conductor = 85 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 5 2 1 2 I2 2 1 17 1 1 1 I1 1 -1 -------------------------------------------------------------------------------- Integral model: [0,0,0,-4,4] Curve [0,0,0,-4,4] (reduced minimal model) b2 = 0 b4 = -8 b6 = 16 b8 = -16 c4 = 192 c6 = -3456 disc = -2816 (bad primes: [ 2 11 ]; # real components = 1) #torsion not yet computed Conductor = 88 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 8 3 0 I*1 4 1 11 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,1,1,-1,0] Curve [1,1,1,-1,0] (reduced minimal model) b2 = 5 b4 = -1 b6 = 1 b8 = 1 c4 = 49 c6 = -521 disc = -89 (bad primes: [ 89 ]; # real components = 1) #torsion not yet computed Conductor = 89 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 89 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,1,0,4,5] Curve [1,1,0,4,5] (reduced minimal model) b2 = 5 b4 = 8 b6 = 20 b8 = 9 c4 = -167 c6 = -3005 disc = -7921 (bad primes: [ 89 ]; # real components = 1) #torsion not yet computed Conductor = 89 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 89 2 1 2 I2 2 -1 -------------------------------------------------------------------------------- Integral model: [1,-1,0,6,0] Curve [1,-1,0,6,0] (reduced minimal model) b2 = -3 b4 = 12 b6 = 0 b8 = -36 c4 = -279 c6 = -1269 disc = -13500 (bad primes: [ 2 3 5 ]; # real components = 1) #torsion not yet computed Conductor = 90 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 2 1 2 I2 2 1 3 3 2 0 III 2 1 5 3 1 3 I3 3 -1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,-8,11] Curve [1,-1,1,-8,11] (reduced minimal model) b2 = -3 b4 = -15 b6 = 45 b8 = -90 c4 = 369 c6 = -8073 disc = -8640 (bad primes: [ 2 3 5 ]; # real components = 1) #torsion not yet computed Conductor = 90 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 6 1 6 I6 6 -1 3 3 2 0 III 2 1 5 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,13,-61] Curve [1,-1,1,13,-61] (reduced minimal model) b2 = -3 b4 = 27 b6 = -243 b8 = 0 c4 = -639 c6 = 49599 disc = -1574640 (bad primes: [ 2 3 5 ]; # real components = 1) #torsion not yet computed Conductor = 90 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 1 4 I4 4 -1 3 9 2 3 I*3 4 -1 5 1 1 1 I1 1 -1 -------------------------------------------------------------------------------- Integral model: [0,0,1,1,0] Curve [0,0,1,1,0] (reduced minimal model) b2 = 0 b4 = 2 b6 = 1 b8 = -1 c4 = -48 c6 = -216 disc = -91 (bad primes: [ 7 13 ]; # real components = 1) #torsion not yet computed Conductor = 91 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 7 1 1 1 I1 1 1 13 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,1,1,-7,5] Curve [0,1,1,-7,5] (reduced minimal model) b2 = 4 b4 = -14 b6 = 21 b8 = -28 c4 = 352 c6 = -6616 disc = -91 (bad primes: [ 7 13 ]; # real components = 1) #torsion not yet computed Conductor = 91 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 7 1 1 1 I1 1 -1 13 1 1 1 I1 1 -1 -------------------------------------------------------------------------------- Integral model: [0,1,0,2,1] Curve [0,1,0,2,1] (reduced minimal model) b2 = 4 b4 = 4 b6 = 4 b8 = 0 c4 = -80 c6 = -352 disc = -368 (bad primes: [ 2 23 ]; # real components = 1) #torsion not yet computed Conductor = 92 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 2 0 IV 3 -1 23 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,0,0,-1,1] Curve [0,0,0,-1,1] (reduced minimal model) b2 = 0 b4 = -2 b6 = 4 b8 = -1 c4 = 48 c6 = -864 disc = -368 (bad primes: [ 2 23 ]; # real components = 1) #torsion not yet computed Conductor = 92 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 2 0 IV 3 -1 23 1 1 1 I1 1 -1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,0,-1] Curve [1,-1,1,0,-1] (reduced minimal model) b2 = -3 b4 = 1 b6 = -3 b8 = 2 c4 = -15 c6 = 567 disc = -188 (bad primes: [ 2 47 ]; # real components = 1) #torsion not yet computed Conductor = 94 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 2 1 2 I2 2 -1 47 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,1,0,-2,0] Curve [0,1,0,-2,0] (reduced minimal model) b2 = 4 b4 = -4 b6 = 0 b8 = -4 c4 = 112 c6 = -640 disc = 576 (bad primes: [ 2 3 ]; # real components = 2) #torsion not yet computed Conductor = 96 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 6 5 0 III 2 1 3 2 1 2 I2 2 -1 -------------------------------------------------------------------------------- Integral model: [0,-1,0,-2,0] Curve [0,-1,0,-2,0] (reduced minimal model) b2 = -4 b4 = -4 b6 = 0 b8 = -4 c4 = 112 c6 = 640 disc = 576 (bad primes: [ 2 3 ]; # real components = 2) #torsion not yet computed Conductor = 96 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 6 5 0 III 2 -1 3 2 1 2 I2 2 1 -------------------------------------------------------------------------------- Integral model: [1,1,0,-25,-111] Curve [1,1,0,-25,-111] (reduced minimal model) b2 = 5 b4 = -50 b6 = -444 b8 = -1180 c4 = 1225 c6 = 86779 disc = -3294172 (bad primes: [ 2 7 ]; # real components = 1) #torsion not yet computed Conductor = 98 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 2 1 2 I2 2 1 7 7 2 1 I*1 2 -1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,-2,0] Curve [1,-1,1,-2,0] (reduced minimal model) b2 = -3 b4 = -3 b6 = 1 b8 = -3 c4 = 81 c6 = 135 disc = 297 (bad primes: [ 3 11 ]; # real components = 2) #torsion not yet computed Conductor = 99 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 3 2 0 III 2 1 11 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [1,-1,0,-15,8] Curve [1,-1,0,-15,8] (reduced minimal model) b2 = -3 b4 = -30 b6 = 32 b8 = -249 c4 = 729 c6 = -3645 disc = 216513 (bad primes: [ 3 11 ]; # real components = 2) #torsion not yet computed Conductor = 99 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 9 2 0 III* 2 1 11 1 1 1 I1 1 -1 -------------------------------------------------------------------------------- Integral model: [1,-1,1,-59,186] Curve [1,-1,1,-59,186] (reduced minimal model) b2 = -3 b4 = -117 b6 = 745 b8 = -3981 c4 = 2817 c6 = -148257 disc = 216513 (bad primes: [ 3 11 ]; # real components = 2) #torsion not yet computed Conductor = 99 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 9 2 3 I*3 4 -1 11 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,0,1,-3,-5] Curve [0,0,1,-3,-5] (reduced minimal model) b2 = 0 b4 = -6 b6 = -19 b8 = -9 c4 = 144 c6 = 4104 disc = -8019 (bad primes: [ 3 11 ]; # real components = 1) #torsion not yet computed Conductor = 99 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 3 6 2 0 I*0 1 -1 11 1 1 1 I1 1 1 -------------------------------------------------------------------------------- Integral model: [0,-1,0,-33,62] Curve [0,-1,0,-33,62] (reduced minimal model) b2 = -4 b4 = -66 b6 = 248 b8 = -1337 c4 = 1600 c6 = -44000 disc = 1250000 (bad primes: [ 2 5 ]; # real components = 2) #torsion not yet computed Conductor = 100 Global Root Number = 1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 4 2 0 IV 1 -1 5 7 2 1 I*1 2 1 -------------------------------------------------------------------------------- Integral model: [0,0,0,-36,0] Curve [0,0,0,-36,0] (reduced minimal model) b2 = 0 b4 = -72 b6 = 0 b8 = -1296 c4 = 1728 c6 = 0 disc = 2985984 (bad primes: [ 2 3 ]; # real components = 2) #torsion not yet computed Conductor = 576 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 12 6 0 I*2 4 -1 3 6 2 0 I*0 4 -1 -------------------------------------------------------------------------------- eclib-20250122/tests/out_ntl/tbessel.out000066400000000000000000000001171474421343600200560ustar00rootroot00000000000000Enter x: x = 1.23 K0(x) = 0.305770989597634 K1(x) = 0.414744832850106 Enter x: eclib-20250122/tests/out_ntl/tcon2.out000066400000000000000000000000441474421343600174410ustar00rootroot0000000000000030740 11344956855892619 32088063161 eclib-20250122/tests/out_ntl/tcurve.out000066400000000000000000000026301474421343600177270ustar00rootroot00000000000000 Enter a curve: The curve is [0,0,1,-7,6] A test of invariants: The curve is [0,0,1,-7,6] b2 = 0 b4 = -14 b6 = 25 b8 = -49 c4 = 336 c6 = -5400 disc = 5077 (# real components = 2) #torsion not yet computed The minimal curve is [0,0,1,-7,6] (reduced minimal model) b2 = 0 b4 = -14 b6 = 25 b8 = -49 c4 = 336 c6 = -5400 disc = 5077 (# real components = 2) #torsion not yet computed A test of Tate's algorithm: [0,0,1,-7,6] (reduced minimal model) b2 = 0 b4 = -14 b6 = 25 b8 = -49 c4 = 336 c6 = -5400 disc = 5077 (bad primes: [ 5077 ]; # real components = 2) #torsion not yet computed Conductor = 5077 Full display: [0,0,1,-7,6] (reduced minimal model) b2 = 0 b4 = -14 b6 = 25 b8 = -49 c4 = 336 c6 = -5400 disc = 5077 (bad primes: [ 5077 ]; # real components = 2) #torsion not yet computed Conductor = 5077 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 5077 1 1 1 I1 1 1 Traces of Frobenius: p=2: ap=-2 p=3: ap=-3 p=5: ap=-4 p=7: ap=-4 p=11: ap=-6 p=13: ap=-4 p=17: ap=-4 p=19: ap=-7 p=23: ap=-6 p=29: ap=-6 p=31: ap=-2 p=37: ap=0 p=41: ap=0 p=43: ap=-8 p=47: ap=-9 p=53: ap=-9 p=59: ap=-11 p=61: ap=-2 p=67: ap=-12 p=71: ap=-8 p=73: ap=-14 p=79: ap=9 p=83: ap=-2 p=89: ap=11 p=97: ap=6 Testing construction from a non-integral model: After scaling down by 60, coeffs are [0,0,1/216000,-7/12960000,1/7776000000] Constructed curve is [0,0,1,-7,6] with scale = 60 eclib-20250122/tests/out_ntl/tdivpol.out000066400000000000000000000346021474421343600201040ustar00rootroot00000000000000Curve [0,0,1,-7,6] Division polynomials: Division Poly (2) = [25 -28 0 4] Division Poly (3) = [-49 75 -42 0 3] Division Poly (4) = [61 350 -490 250 -70 0 2] Division Poly (5) = [155774 -406875 380975 -219125 224875 -213150 93525 -10500 -5145 2375 -434 0 5] Division Poly (6) = [-7450597 33433150 -55698846 38175900 2995139 -22858500 16502416 -7083900 3172008 -1401400 336784 0 -17836 4200 -504 0 3] Division Poly (7) = [-18468518451 129897313175 -445857037878 932404235875 -1243400007052 1026876435550 -437452731142 -17749822300 107968849198 -15732678675 -41963963776 32734719500 -10597551734 1215763500 204773548 -134374100 71781619 -28348950 5133611 4900 -144746 24650 -2156 0 7] Division Poly (8) = [-2571419770853 1215506524050 67371048936842 -320148770148050 780063910616298 -1249129857057600 1423544884020198 -1160552647602600 621047252595462 -133390086758000 -94508756302632 102557214742500 -42735421158370 6650264571300 470955582384 859919970900 -1163784258588 520062744600 -101339901340 -2100672000 5910589524 -1768634400 442778784 -97461000 11262114 409500 -266364 31300 -2044 0 4] Division Poly (9) = [184160099143680751 -1745915691101562000 7553596765573730970 -20009912719373528175 37942026581120864697 -60375121456041861525 93410183300843035368 -141970066026214424625 190405429869508518294 -205725048911535979875 170148544422339746088 -101903285497398603750 37479654863464097844 -301195540341584325 -10122360365346701220 7022704801725188100 -2024994639983255253 -378932954398234425 638476088702667243 -278350695029482875 46649147045567535 8235437040258750 -4808056523794875 -19863562351500 413123504333085 -21629335715325 -61645404898854 25482225972000 -4079567512557 -51564996000 145726971768 -34704720000 6686917839 -1118177550 97716879 3647700 -1573194 142650 -7308 0 9] Division Poly (10) = [413009374512445941380 -5577533221799587495650 34236508339578868067654 -126719683386541187863300 312994894498933292419431 -530641300710685283735000 585897029187423197307976 -280834885094634332916300 -367204662156668126267015 1082254486519067947850050 -1554831039561822593605650 1672867489720306188031100 -1511763332284285767508693 1186278164953699558211100 -786873604739812654099112 405920703060332401917500 -130861468159990009717737 -5601080695755881466900 37964990852501696833520 -25524121253263387893600 8897497566342411821410 -784837740659180354300 -925670621559347454588 522167496232044339600 -83452626309791455327 -45657452461518723000 34482142926904321488 -10360740343811041800 1058457111228061160 328746903184114800 -137359646628361520 17449112283988000 -1181088726955137 1434498958414150 -782923178241638 188460706507500 -17341433546593 -2258719474900 951528824400 -162366029100 21994486360 -2572647000 159807824 8131200 -2124444 149000 -6104 0 5] Division Poly (11) = [-54041658613892771450681999 880907080312611332584912000 -7219594509378023629107644470 38958100184313046991444736425 -152640690458238768754008318817 454785460748010763365906132375 -1056137061172539849022036113531 1936054859688651591523350738175 -2810594691494082952472648616520 3208473937931657698860198494875 -2822039231599463382188559156202 1848423918012109590080578699875 -912617258569632579061077286483 560913385968977938523311946800 -817656871503167956435977465356 1249509868334450532408690045625 -1414165966153163021643340433938 1199336430865617781090316458650 -784676191760539643225675692205 396756309706661409373382542875 -144956275362751028758501833067 23355448732213310557101714875 17220044440091899138064455473 -20247521386823417986151910750 11805434554239601412412797599 -4040005394287265921365582350 234083284571165543297755125 642823838857235347992405825 -419159192063093806076371388 127589838582618892736949000 -6470559713355987866471481 -12226425861215930742609000 5613930837990861266425006 -822808169809586975048075 -285218373979309991270589 186775240363627878171825 -38115245033833256003913 -4184634313923610398775 4784966662201425769762 -1316603611701382184125 126856023732928120092 24162795683139180375 -9281076375640161037 1097831192157003150 -100276466219262732 63186211155991825 -25032991453137052 4693816276634100 -310935739698815 -50338154356875 15290737879263 -2102529532125 227429915559 -21041940150 1025882033 51025100 -10176859 580525 -19558 0 11] Multiplication-by-n maps (x coordinate): n = 2: Numerator: [49 -50 14 0 1] Denominator: [25 -28 0 4] n = 3: Numerator: [-1525 -4641 14700 -10473 1050 1470 -600 84 0 1] Denominator: [2401 -7350 9741 -6300 1470 450 -252 0 9] n = 5: Numerator: [11362160425 25747089400 -441542258500 1506059616215 -2610427772875 2620690440081 -1387765627500 -5048462735 622380767750 -514545267425 213273944550 -37895439750 -6392442000 5509239565 -1991083500 805974932 -259821875 26485165 8844500 -2116075 -204050 110250 -13000 700 0 1] Denominator: [24265539076 -126761092500 284239264925 -378286361750 393514275875 -416360781200 421947611075 -340338334000 222184587415 -139925348500 86109315418 -40174487500 9539139565 1483576500 -2055966500 735111700 -102334925 -17456250 11041735 -2166500 136906 23750 -4340 0 25] n = 7: Numerator: [-478965310761451231025 3253200126164286188149 493504842253691880150 -87437670391256256814141 481053400926406685558475 -1474524847437726457036608 3051293047895397342722300 -4507790169717305498341981 4708354723086060377511600 -3031718411072855187719700 100320809977898287428700 2584762647056569539994518 -3803952756150941424717400 3428800794002557340072846 -2220821754300618338952600 1043523046720703474603804 -312300468078508586572175 1442623950439048333404 74652464685011903431000 -62420322870375191780779 32723404759644607191750 -10817148832748217403500 983621853556791774500 1094908222340954435400 -597643354403853229500 85498396077199034566 40785097726864444800 -20343885839157086724 223835554725509900 2681079531989243980 -1026461532749354800 119137846302349868 37877316216756800 -18977605618891227 3304306659173450 8701877287670 -135764897535400 34412538727721 -5354282777900 727182801268 -86238689250 4295207210 519821400 -43847846 -10392900 1754788 -98000 2744 0 1] Denominator: [341086173774927439401 -4798021850215625783850 33341949831200126354581 -150271512229128794144550 486949620236074001282038 -1192396394453621322632800 2261070134715425544591521 -3347375281558187150583900 3842454854008922612126960 -3324943281677884470444750 2010418069392193707136282 -651020404345562013303800 -96608621157166208197954 166151917069487225505300 48699725372809023988580 -178444916497903457931200 144560299534716328862298 -54814088180206102522950 961202166802238932207 8616789704135225396700 -2291677169592145859020 -1813626803872896374350 1838081104627613478024 -798819036672743394000 191378585118824669566 -10013444688503331600 -15500999700626997900 10243440676476617400 -4123480548928793500 1066016998482282000 -119062576319787996 -30000425318197600 19749888363614829 -6463294466493550 1585109901891446 -246150026516100 -2360054651479 12392379246100 -3190374052068 372027946500 61786550 -7553991900 1303637806 -106222200 2621892 345100 -30184 0 49] Testing division of points: P = [0:2:1] 2*P = [245:-32:125], divided by 2 gives back P, OK 3*P = [-74725:-438957:117649], divided by 3 gives back P, OK 5*P = [1769929178043950:4738372533007263:3779940084024824], divided by 5 gives back P, OK 7*P = [-8845779679186810919721876142275:-26132116500093837448172183040908:6299356293743239735763552887851], divided by 7 gives back P, OK 11*P = [-345907035865394112110113258379175841526681422618969349065465631483788171611500:-603899496397932670693901238084339680074376067505653656300679516648438378729902:157828710767928051843902784106074829349824572090398507020120360018086980045999], divided by 11 gives back P, OK 13*P = [4330944971498881477952763040195461194737358561970732874089910688931368534665435456142865934677314444316324525:474166894211156940132146040087902301358254640922900664396468316978550001533595729712356829915629891398826393:4459345156448775844130923624171028485455804112741895938417180204973106756635206294993276819983272953020126899], divided by 13 gives back P, OK P = [1:0:1] 2*P = [14:51:1], divided by 2 gives back P, OK 3*P = [858:3056:2197], divided by 3 gives back P, OK 5*P = [-13422227300:37155830557:12167000000], divided by 5 gives back P, OK 7*P = [-654363158444498413938:323334584599779613133:232135196336821724283], divided by 7 gives back P, OK 11*P = [-5386909266611602426586636855741750187975628118240481:-31903410988726312174342705633718553251007282422752800:8563273080452283301577237101778658433493825993941319], divided by 11 gives back P, OK 13*P = [6790601027182872441717735378318194615000557734419531444518829576329287422:-21346190491686533430108554189028709484678265994449397859310470032693638296:10895308449429756233096859998848382387567744114034063749875541435853032123], divided by 13 gives back P, OK P = [2:0:1] 2*P = [21:-96:1], divided by 2 gives back P, OK 3*P = [17347:11477:6859], divided by 3 gives back P, OK 5*P = [1314368321100:2192807253559:296474109632], divided by 5 gives back P, OK 7*P = [787735371750610845962493:2815013979731975184348416:58266402897702006018621], divided by 7 gives back P, OK 11*P = [465224049592215941888315944477150086362582688911509781121082:-2835041364493288591742476527691666698801289699650164214285000:12520837463201904227545769580855021289721316529527142889041], divided by 11 gives back P, OK 13*P = [967652288848675141165417507105084877050922452157366640667361749659468531276841232963:-2467719925245805762134421012865078764322728240276925184295644784012954762439103997267:137922062795787281492160592505828749775362042044145821626654801172360654848016552211], divided by 13 gives back P, OK P = [3:3:1] 2*P = [742:-552:343], divided by 2 gives back P, OK 3*P = [1735612:-8697671:68921], divided by 3 gives back P, OK 5*P = [13274790938560307650:-3810346189413166609:6816655498982663368], divided by 5 gives back P, OK 7*P = [15610084384521543609511648390658094288:68045384727563741553482631637942786750:797803639727363681600463977477765079], divided by 7 gives back P, OK 11*P = [1575803501107696145915932812044229184495312851311623153876318357968752759104183973347056429397:1396274583140038254949640133020198974959304566276876829967194082976845151053935966087848230097:557829383989248411534035078306591098535924517768571182260197731835239742103251080379853060699], divided by 11 gives back P, OK 13*P = [6161146492714921360750727810183946205467564656490939099032408800798722540272737508766984883606134682101989119243397164919137164312:-35721620630687298226865205673450160556524720425884654664577788075243215491371022249911678723584335179331885213925899777407539593821:183117292199220258281649737393844871119425437622572982949683718143218212229910662967343636339932171621634631574337220088031542071], divided by 13 gives back P, OK P = [-1:-4:1] 2*P = [798:377:343], divided by 2 gives back P, OK 3*P = [4430992:-438330:4330747], divided by 3 gives back P, OK 5*P = [-12221903491172643150:11468039763290751651:4885740073494125000], divided by 5 gives back P, OK 7*P = [17650003281779675566729443347938708188:-192526580513012204672730365490691444763:72980796628288414077404408180857060533], divided by 7 gives back P, OK 11*P = [-30613130525745975806945896359562605604200966296242976777041809153479858248968536822155766662519:-15714745521957622294462788054133735354109125384042241494977265337200555303010618130240791627276:10342901057480405091454441780213283779071882904636290875244915407676321355926935920245292819619], divided by 11 gives back P, OK 13*P = [1405907707042133954154238850941035663903445083801514062880744416997628088406667394648913262927105511332783388554595372344393472664228:-2211226265150483927592113283252013630287688089685314399591313107761425853236835065390795882450722392047791605464694483959070884011570:1600088061666351860094194147994818358340122989198013456481419612192269188713359699781782586135291445838482977423277673449499162776373], divided by 13 gives back P, OK P = [-3:-1:1] 2*P = [406:8180:1], divided by 2 gives back P, OK 3*P = [-198562138:-133849341:68417929], divided by 3 gives back P, OK 5*P = [-868891893753069223266400:-892775925650647678206441:320035512450753499922432], divided by 5 gives back P, OK 7*P = [-250789195524699438713028256143149165935010703462:-351763092836663361098186249071565146814058578612:102208756706176009076316662108042042887248607671], divided by 7 gives back P, OK 11*P = [-5888498972561699214345998647776423563516419612163855732932875428098479096816453556740071283543529303920465099353451197:-13533256227761692733082484218341561251156460176136586962103570474399526108120718796397535148131526130064613929899679999:3291138473665024086163024275753883782780254080619125033356991189541952502966715638923169363573135424125729714408703999], divided by 11 gives back P, OK 13*P = [-471304787040968158056679651141156035898503824031997613220205307381493602197020538234554557851623914285000405516091920163285632114952834039661937557168333773226984038:-1370873330960135587145910098464877803541908169825891341967548989668552498702749973686005785221486327913645312167741302000549449734377969308776534759994492228417393091:330212063553055881533947376167502836269069675579486301004644611488773223934819786676041306852236930427317775633620010841259816717836527910178288832111727833861202679], divided by 13 gives back P, OK P = [4:-7:1] 2*P = [4277:-1045:2197], divided by 2 gives back P, OK 3*P = [173402493:270630132:41781923], divided by 3 gives back P, OK 5*P = [347958005352980994267950:-591491125266464506985649:90144087121871684875000], divided by 5 gives back P, OK 7*P = [28346791926960812679644342662875487909944722853:46007717633420125671884939882166416087274190645:6574733970234508106612925608541549400717628583], divided by 7 gives back P, OK 11*P = [17474145883556647766828376232602106710826303890390986982624317936592550275465510611644786949719563721070184568269144:29480256355813074498457852565032175239305961624890346125612405835647274977712834264461974502384623321822021473979573:3896217090865641720447450673233504443391236048556578877575563503584301366068007409294978657913670393568854035781361], divided by 11 gives back P, OK 13*P = [141214430924449205970890907019814623022662416842585435331280731630294938794541398360467356587791564443343502605886099748817931388768459086946049432514093725256267:-226503185172742643796701194535524557733787205454975272078361208779360866680687110556127834139290657225066635029141642546627353273657327903648741011104842867737892:39145148418716729635148349998510974266838033447983885103993474847107471829372688807853030441396426545342852451854525365130399276623238448918996402000657968479137], divided by 13 gives back P, OK eclib-20250122/tests/out_ntl/tegr.out000066400000000000000000000017471474421343600173700ustar00rootroot00000000000000 =============================================================== 1a1 = [0,2429469980725060,0,275130703388172136833647756388,0] 14 points entered:[ [172656371022254:11183605599461162465976:1] [59018983696173167486925:9046770248558568185070809755805:2803221] [-127897562256303:-1568465432141985518043:1] [179104002703038:11530632350958995292984:1] [20351620436417161937099238:15630342741658265676253387896555759:34645976] [6310504541502:1353961721252033023032:1] [-61804347285637731061518:-1206451034261670590274867000456:32461759] [3183756031646993484900:-1445688913020859355673024573444:15625] [109129972974418179597312:-23118208949065563006261517438272:2571353] [7266977526271761:-716978870073714829212603:1] [140613088567692:33055815750694859233124:27] [679895213412287772:-58522059114298646792700636:12167] [11456459729211596549772:983394088087157723809198920329:203297472] [122207436525982205089872:8219252385969460300109469047112:62570773] ] Tamagawa exponent = 8 Index of egr subgroup = 1024 eclib-20250122/tests/out_ntl/telog.out000066400000000000000000000034501474421343600175320ustar00rootroot00000000000000Testing some points: The points are P0 = [0:2:1], P1 = [1:0:1], and P2 = [2:0:1] Curve [0,0,1,-7,6] Elliptic log of P is (0.546562908322120431419801072941076517702805266912,0.740274134120707496653665555320480125332101657314) Reconstructed P = [0:2:1] OK! Elliptic log of P is (0.903829356268671133671764878922345603084278311076,0.740274134120707496653665555320480125332101657314) Reconstructed P = [1:0:1] OK! Elliptic log of P is (1.14719994671046572970364208782769493741074222861,0) Reconstructed P = [2:0:1] OK! Elliptic log of P is (1.09312581664424086283960214588215303540561053382,0) Reconstructed P = [245:-32:125] OK! Elliptic log of P is (1.80765871253734226734352975784469120616855662215,0) Reconstructed P = [14:51:1] OK! Elliptic log of P is (0.218555901877464934465196333901746724935670328935,0) Reconstructed P = [21:-96:1] OK! Elliptic log of P is (1.45039226459079156509156595186342212078708357799,0) Reconstructed P = [3:3:1] OK! Elliptic log of P is (1.83247340110167192891021063284829381555935021075,0.740274134120707496653665555320480125332101657314) Reconstructed P = [-2:-4:1] OK! Elliptic log of P is (0.600637038388345298283841014886618419707936961698,0.740274134120707496653665555320480125332101657314) Reconstructed P = [2:13:8] OK! (m*[0:2:1])/m = [ [0:2:1] ] Checking... [0:2:1] OK (m*[0:2:1])/m = [ [0:2:1] ] Checking... [0:2:1] OK (m*[0:2:1])/m = [ [0:2:1] ] Checking... [0:2:1] OK ================================ Curve [1,1,0,-202,1025] The point Q is = [-8:51:1] Elliptic log of P is (2.15251566696160241628533178186449561190793579504,0) Reconstructed P = [-8:51:1] The point P3 is = [8:-3:1] Elliptic log of P is (3.40172041025849963266962742312340879857800215114,0) Reconstructed P = [8:-3:1] (m*[8:-3:1])/m = [ [8:-3:1] ] Checking... [8:-3:1] OK ================================ eclib-20250122/tests/out_ntl/tequiv.out000066400000000000000000000031671474421343600177420ustar00rootroot00000000000000Verbose? How many quartics to check (0 to quit)? Enter quartic coefficients a,b,c,d,e ? 1: (1,0,-80,324,-244) new Enter quartic coefficients a,b,c,d,e ? 2: (1,0,-68,236,-96) Checking equivalence of (1,0,-68,236,-96) and (1,0,-80,324,-244) u-poly = [1,0, -306176, -39149568, 8727953408] No integral roots new Enter quartic coefficients a,b,c,d,e ? 3: (1,1,-35,11,190) Checking equivalence of (1,1,-35,11,190) and (1,0,-80,324,-244) u-poly = [1,0, -194816, -4748544, 7849278464] No integral roots Checking equivalence of (1,1,-35,11,190) and (1,0,-68,236,-96) u-poly = [1,0, -176704, -3458816, 6658838528] Root u = -272 equivalent to #2 Enter quartic coefficients a,b,c,d,e ? 4: (1,0,-26,12,233) Checking equivalence of (1,0,-26,12,233) and (1,0,-80,324,-244) equiv failed on first test! First has I=3472, J=-404912, disc=3463112448, type=1 Second has I=3472, J=-404912, disc=3463112448, type=2 Checking equivalence of (1,0,-26,12,233) and (1,0,-68,236,-96) equiv failed on first test! First has I=3472, J=-404912, disc=3463112448, type=1 Second has I=3472, J=-404912, disc=3463112448, type=2 Checking equivalence of (1,0,-26,12,233) and (1,1,-35,11,190) equiv failed on first test! First has I=3472, J=-404912, disc=3463112448, type=1 Second has I=3472, J=-404912, disc=3463112448, type=2 new How many quartics to check (0 to quit)? Enter quartic coefficients a,b,c,d,e ? 1: (11,-11,21,-5,10) new Enter quartic coefficients a,b,c,d,e ? 2: (10,5,21,11,11) Checking equivalence of (10,5,21,11,11) and (11,-11,21,-5,10) u-poly = [1,0, -5334230, -150935400, 6798600758125] Root u = -1705 equivalent to #1 How many quartics to check (0 to quit)? eclib-20250122/tests/out_ntl/theight.out000066400000000000000000000123571474421343600200620ustar00rootroot00000000000000Computed 78519 primes, largest is 1000253 Extra primes in list: Curve [1,0,0,-9632000,11505156432] Point [1794:-732:1] has infinite order Local heights: Sum so far = 0 log(den(x(P))) = 0 2: -0.5198603854199589820629240910936324260566251007701914405905100071200452164772710367043974952473140156565 3: 0 5: -1.0729586082894002497338395554841250930170675695123451479417652609827859918051051764200892520621197405333 7: 0 43: 0 Sum so far = -1.5928189937093592317967636465777575190736926702825365885322752681028312082823762131244867473094337561898 R: 2.6591777372351697106379171777341996972920761893137085990849604193273227819567664580094427822110846671662 Sum of local heights: 1.0663587435258104788411535311564421782183835190311720105526851512244915736743902448849560349016509109764 global height of [1794:-732:1] is 1.0663587435258104788411535311564421782183835190311720105526851512244915736743902448849560349016509109764 Curve [0,1,0,-19357973048906456166239827272707359553313344,21187731957757821187375878909257489490487412099497964528006317056] Input curve is not minimal at [ 2 ] Heights will be computed after mapping points to the minimal model [1,0,0,-1209873315556653510389989204544209972082084,331058311839965956052748107957148273288865814054655695750098704] Point [11376724821019368394185473144824:531128848935479591898724774494856605576120:2212245127] has infinite order Local heights: 1303: 14.344849154249690235603620395077325556187893008120017198267101647487168571034698862883609598254465320882 Sum so far = 14.344849154249690235603620395077325556187893008120017198267101647487168571034698862883609598254465320882 log(den(x(P))) = 14.344849154249690235603620395077325556187893008120017198267101647487168571034698862883609598254465320882 2: -0.64982548177494872757865511386704053257078137596273930073813750890005652059658879588049686905914251957063 3: -3.2042858419486532665694652743573666385551807936496859008928584731093583552209428200480459515400519256316 7: -1.9459101490553133051053527434431797296370847295818611884593901499375798627520692677876584985878715269931 13: -2.5649493574615367360534874415653186048052679447602071164190455106634646673244101793995746634404894887693 29: -1.683647914993237013591636016180955802747256456961372039460835175821390390568926166646683557408928211323 31: -2.5754904033638596844468732434067679078374541978604439788175385543562360624481634241603986235020649729297 43: -1.8806000578467812117364212566729235177795680924407777075958426324614295869364932192687959990419986434488 73: 0 79: -3.2770858893502661206297091561110581916301559183169572190591283381698545458433242086094552743305597049787 83: 0 89: 0 151: 0 199: -2.6466524123622461977050606459342686009455526402847362494532304939720496026904579500629921371491090237371 239: 0 263: 0 601: -6.3985949345352075792730805065791461321158652517313974246007004844989970499719731737852755946786480364573 617: 0 1433: 0 3449: -4.072919806468420453392926484639460182502821920485483498613314298014594425119712262801577989827526315447 6199: -4.3660716338509596986144265790573211827559692709318631192630445064520287152938899407747291356332810471928 1607849: -7.1452039094195084867538538892263668870756826570435860169910410159563007931008167769280037358413050635495 Sum so far = -28.066388638181248245847327955963848354770748241891093562097005494826172006833069323270078431786511159146 R: 48.791346916987674129415518895963499708776538989235459332368713903014226657552157302578853138139342116254 Sum of local heights: 20.724958278806425883568190939999651354005790747344365770271708408188054650719087979308774706352830957108 global height of [11376724821019368394185473144824:531128848935479591898724774494856605576120:2212245127] is 20.724958278806425883568190939999651354005790747344365770271708408188054650719087979308774706352830957108 Testing points on the curve [0,0,1,-7,6] The points are P0 = [0:2:1], P1 = [1:0:1], and P2 = [2:0:1] Their negatives are -P0 = [0:-3:1], -P1 = [1:-1:1], and -P2 = [2:-1:1] Computing their heights: Heights are 0.99090633315308797388259855288719422818432598249311083931508337741640200828756857760393418236367133926751, 0.66820516565192793503314205088782304708129183235953495290561093851504315269673218586650086473309992408244, and 0.76704335533154620579545064655221715456242461918849090382159571937411742205666289745531823277891939649419 The origin is [0:1:0] Now some additions etc,: P0 + P1 = [3:3:1] P0 - P1 = [8:21:1] P0 - P1 - P2 = [93:-143:27] P0.twice() = [245:-32:125] P0 + P0 = [245:-32:125] 3*P0 = [-74725:-438957:117649] P0 - P0 = [0:1:0] P0 +3 P1 - P2 = [816:-23310:1] 2P0 +2 P1 + P2 = [93:896:1] P0 -P1 -P2 = [93:-143:27] with height 3.5188832555391414837879545230426549481593909803113988737513473960896918684535926847613147712843718244401 2 (P0 -P1 -P2) = [936156018:-10370368:469097433] with height 14.075533022156565935151818092170619792637563921245595495005389584358767473814370739045259085137487297761 The quotient is 4 3 (P0 -P1 -P2) = [141154686087724689336:364929251737439849995:18067866971533021791] with height 31.669949299852273354091590707383894533434518822802589863762126564807226816082334162851832941559346419961 The quotient is 9 The regulator of P0, P1, P2 is 0.41714355875838396981711954461809339674981010609849838672473681975617770253416381366667499881931397967318 eclib-20250122/tests/out_ntl/thilbert.out000066400000000000000000000003131474421343600202300ustar00rootroot00000000000000Enter nonzero a and b: (1234,5678)_p 0 0 2 0 17 1 167 0 617 1 Global symbol = 1 Check (should be 0) = 0 --agrees with single call to global_hilbert() --agrees with solve_conic() Enter nonzero a and b: eclib-20250122/tests/out_ntl/threading.out000066400000000000000000000326261474421343600203740ustar00rootroot00000000000000Primes up to 10000 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 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 521 523 541 547 557 563 569 571 577 587 593 599 601 607 613 617 619 631 641 643 647 653 659 661 673 677 683 691 701 709 719 727 733 739 743 751 757 761 769 773 787 797 809 811 821 823 827 829 839 853 857 859 863 877 881 883 887 907 911 919 929 937 941 947 953 967 971 977 983 991 997 1009 1013 1019 1021 1031 1033 1039 1049 1051 1061 1063 1069 1087 1091 1093 1097 1103 1109 1117 1123 1129 1151 1153 1163 1171 1181 1187 1193 1201 1213 1217 1223 1229 1231 1237 1249 1259 1277 1279 1283 1289 1291 1297 1301 1303 1307 1319 1321 1327 1361 1367 1373 1381 1399 1409 1423 1427 1429 1433 1439 1447 1451 1453 1459 1471 1481 1483 1487 1489 1493 1499 1511 1523 1531 1543 1549 1553 1559 1567 1571 1579 1583 1597 1601 1607 1609 1613 1619 1621 1627 1637 1657 1663 1667 1669 1693 1697 1699 1709 1721 1723 1733 1741 1747 1753 1759 1777 1783 1787 1789 1801 1811 1823 1831 1847 1861 1867 1871 1873 1877 1879 1889 1901 1907 1913 1931 1933 1949 1951 1973 1979 1987 1993 1997 1999 2003 2011 2017 2027 2029 2039 2053 2063 2069 2081 2083 2087 2089 2099 2111 2113 2129 2131 2137 2141 2143 2153 2161 2179 2203 2207 2213 2221 2237 2239 2243 2251 2267 2269 2273 2281 2287 2293 2297 2309 2311 2333 2339 2341 2347 2351 2357 2371 2377 2381 2383 2389 2393 2399 2411 2417 2423 2437 2441 2447 2459 2467 2473 2477 2503 2521 2531 2539 2543 2549 2551 2557 2579 2591 2593 2609 2617 2621 2633 2647 2657 2659 2663 2671 2677 2683 2687 2689 2693 2699 2707 2711 2713 2719 2729 2731 2741 2749 2753 2767 2777 2789 2791 2797 2801 2803 2819 2833 2837 2843 2851 2857 2861 2879 2887 2897 2903 2909 2917 2927 2939 2953 2957 2963 2969 2971 2999 3001 3011 3019 3023 3037 3041 3049 3061 3067 3079 3083 3089 3109 3119 3121 3137 3163 3167 3169 3181 3187 3191 3203 3209 3217 3221 3229 3251 3253 3257 3259 3271 3299 3301 3307 3313 3319 3323 3329 3331 3343 3347 3359 3361 3371 3373 3389 3391 3407 3413 3433 3449 3457 3461 3463 3467 3469 3491 3499 3511 3517 3527 3529 3533 3539 3541 3547 3557 3559 3571 3581 3583 3593 3607 3613 3617 3623 3631 3637 3643 3659 3671 3673 3677 3691 3697 3701 3709 3719 3727 3733 3739 3761 3767 3769 3779 3793 3797 3803 3821 3823 3833 3847 3851 3853 3863 3877 3881 3889 3907 3911 3917 3919 3923 3929 3931 3943 3947 3967 3989 4001 4003 4007 4013 4019 4021 4027 4049 4051 4057 4073 4079 4091 4093 4099 4111 4127 4129 4133 4139 4153 4157 4159 4177 4201 4211 4217 4219 4229 4231 4241 4243 4253 4259 4261 4271 4273 4283 4289 4297 4327 4337 4339 4349 4357 4363 4373 4391 4397 4409 4421 4423 4441 4447 4451 4457 4463 4481 4483 4493 4507 4513 4517 4519 4523 4547 4549 4561 4567 4583 4591 4597 4603 4621 4637 4639 4643 4649 4651 4657 4663 4673 4679 4691 4703 4721 4723 4729 4733 4751 4759 4783 4787 4789 4793 4799 4801 4813 4817 4831 4861 4871 4877 4889 4903 4909 4919 4931 4933 4937 4943 4951 4957 4967 4969 4973 4987 4993 4999 5003 5009 5011 5021 5023 5039 5051 5059 5077 5081 5087 5099 5101 5107 5113 5119 5147 5153 5167 5171 5179 5189 5197 5209 5227 5231 5233 5237 5261 5273 5279 5281 5297 5303 5309 5323 5333 5347 5351 5381 5387 5393 5399 5407 5413 5417 5419 5431 5437 5441 5443 5449 5471 5477 5479 5483 5501 5503 5507 5519 5521 5527 5531 5557 5563 5569 5573 5581 5591 5623 5639 5641 5647 5651 5653 5657 5659 5669 5683 5689 5693 5701 5711 5717 5737 5741 5743 5749 5779 5783 5791 5801 5807 5813 5821 5827 5839 5843 5849 5851 5857 5861 5867 5869 5879 5881 5897 5903 5923 5927 5939 5953 5981 5987 6007 6011 6029 6037 6043 6047 6053 6067 6073 6079 6089 6091 6101 6113 6121 6131 6133 6143 6151 6163 6173 6197 6199 6203 6211 6217 6221 6229 6247 6257 6263 6269 6271 6277 6287 6299 6301 6311 6317 6323 6329 6337 6343 6353 6359 6361 6367 6373 6379 6389 6397 6421 6427 6449 6451 6469 6473 6481 6491 6521 6529 6547 6551 6553 6563 6569 6571 6577 6581 6599 6607 6619 6637 6653 6659 6661 6673 6679 6689 6691 6701 6703 6709 6719 6733 6737 6761 6763 6779 6781 6791 6793 6803 6823 6827 6829 6833 6841 6857 6863 6869 6871 6883 6899 6907 6911 6917 6947 6949 6959 6961 6967 6971 6977 6983 6991 6997 7001 7013 7019 7027 7039 7043 7057 7069 7079 7103 7109 7121 7127 7129 7151 7159 7177 7187 7193 7207 7211 7213 7219 7229 7237 7243 7247 7253 7283 7297 7307 7309 7321 7331 7333 7349 7351 7369 7393 7411 7417 7433 7451 7457 7459 7477 7481 7487 7489 7499 7507 7517 7523 7529 7537 7541 7547 7549 7559 7561 7573 7577 7583 7589 7591 7603 7607 7621 7639 7643 7649 7669 7673 7681 7687 7691 7699 7703 7717 7723 7727 7741 7753 7757 7759 7789 7793 7817 7823 7829 7841 7853 7867 7873 7877 7879 7883 7901 7907 7919 7927 7933 7937 7949 7951 7963 7993 8009 8011 8017 8039 8053 8059 8069 8081 8087 8089 8093 8101 8111 8117 8123 8147 8161 8167 8171 8179 8191 8209 8219 8221 8231 8233 8237 8243 8263 8269 8273 8287 8291 8293 8297 8311 8317 8329 8353 8363 8369 8377 8387 8389 8419 8423 8429 8431 8443 8447 8461 8467 8501 8513 8521 8527 8537 8539 8543 8563 8573 8581 8597 8599 8609 8623 8627 8629 8641 8647 8663 8669 8677 8681 8689 8693 8699 8707 8713 8719 8731 8737 8741 8747 8753 8761 8779 8783 8803 8807 8819 8821 8831 8837 8839 8849 8861 8863 8867 8887 8893 8923 8929 8933 8941 8951 8963 8969 8971 8999 9001 9007 9011 9013 9029 9041 9043 9049 9059 9067 9091 9103 9109 9127 9133 9137 9151 9157 9161 9173 9181 9187 9199 9203 9209 9221 9227 9239 9241 9257 9277 9281 9283 9293 9311 9319 9323 9337 9341 9343 9349 9371 9377 9391 9397 9403 9413 9419 9421 9431 9433 9437 9439 9461 9463 9467 9473 9479 9491 9497 9511 9521 9533 9539 9547 9551 9587 9601 9613 9619 9623 9629 9631 9643 9649 9661 9677 9679 9689 9697 9719 9721 9733 9739 9743 9749 9767 9769 9781 9787 9791 9803 9811 9817 9829 9833 9839 9851 9857 9859 9871 9883 9887 9901 9907 9923 9929 9931 9941 9949 9967 9973 Running with 1 threads There are 1229 primes up to 10000 eclib-20250122/tests/out_ntl/thtconst.out000066400000000000000000000010711474421343600202630ustar00rootroot00000000000000 Curve [0,0,1,-7,6]: Silverman bound = 6.28483 CPS bound = 0 egr bound = 0 Shift by 1: [0,3,1,-4,0]: CPS bound 2 = 0 Shift by 2 (up by 1): [0,6,1,5,0]: CPS bound = 0.343561 Shift by 0 (down by 1): [0,0,1,-7,6]: CPS bound = 0 No significant improvement (margin of 0.01)! Best shift by 1: Best CPS bound = 0 Overall, CPS is better for 1 curves out of 1 For 100% of curves the new bound is better. Average difference (silverman-cps) = 6.28483 Average difference (silverman-cps2) = 6.28483 Silverman average = 6.28483 CPS 1 average = 0 CPS 2 average = 0 Average offset = 0 eclib-20250122/tests/out_ntl/tilll.out000066400000000000000000000014621474421343600175410ustar00rootroot00000000000000Enter size n: Enter vector number 1: Enter vector number 2: Enter vector number 3: Before reduction, vectors are: [1,2,3] [4,5,6] [7,8,8] FIRST METHOD: JC'S implementation of integer LLL from HC's book After reduction, vectors are: [0,0,-1] [-1,1,0] [1,2,0] Square length of vector 1 is 1 Square length of vector 2 is 2 Square length of vector 3 is 5 Candidates for shortest vectors: (1,1,1): [0,3,-1], norm = 10 (1,1,0): [-1,1,-1], norm = 3 (1,1,-1): [-2,-1,-1], norm = 6 (1,0,1): [1,2,-1], norm = 6 (1,0,0): [0,0,-1], norm = 1 (1,0,-1): [-1,-2,-1], norm = 6 (1,-1,1): [2,1,-1], norm = 6 (1,-1,0): [1,-1,-1], norm = 3 (1,-1,-1): [0,-3,-1], norm = 10 (0,1,1): [0,3,0], norm = 9 (0,1,0): [-1,1,0], norm = 2 (0,1,-1): [-2,-1,0], norm = 5 (0,0,1): [1,2,0], norm = 5 The shortest vector is [0,0,-1] with square length 1 eclib-20250122/tests/out_ntl/timing.out000066400000000000000000000001671474421343600177110ustar00rootroot00000000000000Verbose (0/1): Program timing - demonstration and testing. How many subtimers? Start default timer Stopping all timers eclib-20250122/tests/out_ntl/tlatconst.out000066400000000000000000000037701474421343600204400ustar00rootroot00000000000000Table of Gamma values --------------------- n Gamma(n) Gamma(n+1/2) 1 1 0.88622692545275801364908374167 2 1 1.3293403881791370204736256125 3 2 3.3233509704478425511840640313 4 6 11.631728396567448929144224109 5 24 52.342777784553520181149008492 6 120 287.88527781504436099631954671 7 720 1871.2543057977883464760770536 8 5040 14034.407293483412598570577902 9 40320 119292.46199460900708784991217 10 362880 1133278.3889487855673345741656 11 3628800 11899423.083962248457013028739 12 39916800 136843365.46556585725564983049 13 479001600 1710542068.3195732156956228812 14 6227020800 23092317922.314238411890908896 15 87178291200 334838609873.55645697241817899 16 1307674368000 5189998453040.1250830724817744 17 20922789888000 85634974475162.063870695949277 18 355687428096000 1498612053315336.1177371791124 19 6402373705728000 27724322986333718.178137813579 20 121645100408832000 540624298233507504.47368736478 Table of Lattice constants -------------------------- n gamma_n gamma_n^n 1 1 1 2 1.154700538379251529018297561 1.3333333333333333333333333333 3 1.2599210498948731647672106073 2 4 1.4142135623730950488016887242 4 5 1.5157165665103980823472598013 8 6 1.665366355311208639217572725 21.333333333333333333333333333 7 1.8114473285278133431883457464 64 8 2 256 9 2.2406464525576100868765716641 1423.508349408712868310367206 10 2.3732671191037974065231529926 5668.4748300339395076115877442 11 2.5050324821876886180996625614 24375.132099876182930515702621 12 2.6360392896474785851581370699 112569.96952826428149078806865 13 2.7663681820140629958822583624 555686.3780545043339390013888 14 2.8960871477658809320506009245 2919864.9741275218676690812 15 3.0252540884894484579539012827 16271509.650379324548133062845 16 3.1539187577277054767710128351 95853512.782427047919943311148 17 3.2821242499009068175079523838 595162150.89011988598041576619 18 3.4099081600142680405724628767 3884796548.556584756871179724 19 3.5373034984903691930188147643 26593417312.002201563851069084 20 3.6643394211493565124652803618 190508297302.56008707903465134 eclib-20250122/tests/out_ntl/tlegcert.out000066400000000000000000000003531474421343600202300ustar00rootroot00000000000000Solving ax^2 + by^2 + cz^2 = 0 Using method 4 Enter coefficients a b c: 10000000019 10000000033 -10000010639 Enter certificate k1 k2 k3: Solution: (x:y:z) = (16081092938:20311652644:-25906834446) --OK Enter coefficients a b c: 0 0 0 eclib-20250122/tests/out_ntl/tmanin.out000066400000000000000000000004041474421343600177020ustar00rootroot00000000000000Program tmanin. Using METHOD = 2 to find newforms MODULUS for linear algebra = 1073741789 Verbose output? How many primes for Hecke eigenvalues? Output Hecke eigenvalues to file? (0/1) Sign? (-1/0/1) Enter first and last N: >>>Level 90: 3 newform(s) found. eclib-20250122/tests/out_ntl/tmrank-short.out000066400000000000000000000015721474421343600210540ustar00rootroot00000000000000Curve [0,1,1,-2,0] : Rank = 2 Curve [1,0,0,0,1] : Rank = 2 Curve [1,-1,0,-4,4] : Rank = 2 Curve [0,0,1,-7,6] : Rank = 3 Curve [0,0,1,-1,6] : Rank = 3 Curve [0,0,1,-49,132] : Rank = 3 Curve [0,1,1,-72,210] : Rank = 4 Curve [0,0,1,-7,36] : Rank = 4 Curve [1,0,0,-202,1089] : Rank = 4 Curve [0,0,1,-79,342] : Rank = 5 Curve [0,0,1,-169,930] : Rank = 5 Curve [0,1,1,-30,390] : Rank = 5 Curve [0,0,1,-547,-2934] : Rank = 6 Curve [0,0,0,-9907,306370] : Rank = 6 Curve [0,0,1,-277,4566] : Rank = 6 Curve [0,0,0,-9217,300985] : Rank = 7 Curve [0,1,0,-5945,583879] : Rank = 7 Curve [0,0,0,-9217,300985] : Rank = 7 Curve [0,0,0,-6544,7375129] : Rank = 8 Curve [0,1,0,9910,9815689] : Rank = 8 Curve [0,0,0,-6112,12325825] : Rank = 8 Curve [1,0,1,34318214642441646362435632562579908747,3184376895814127197244886284686214848599453811643486936756] : Rank = 15 eclib-20250122/tests/out_ntl/tmrank.out000066400000000000000000000016401474421343600177130ustar00rootroot00000000000000Curve [0,1,1,-2,0] : Rank = 2 Curve [1,0,0,0,1] : Rank = 2 Curve [1,-1,0,-4,4] : Rank = 2 Curve [0,0,1,-7,6] : Rank = 3 Curve [0,0,1,-1,6] : Rank = 3 Curve [0,0,1,-49,132] : Rank = 3 Curve [0,1,1,-72,210] : Rank = 4 Curve [0,0,1,-7,36] : Rank = 4 Curve [1,0,0,-202,1089] : Rank = 4 Curve [0,0,1,-79,342] : Rank = 5 Curve [0,0,1,-169,930] : Rank = 5 Curve [0,1,1,-30,390] : Rank = 5 Curve [0,0,1,-547,-2934] : Rank = 6 Curve [0,0,0,-9907,306370] : Rank = 6 Curve [0,0,1,-277,4566] : Rank = 6 Curve [0,0,0,-9217,300985] : Rank = 7 Curve [0,1,0,-5945,583879] : Rank = 7 Curve [0,0,0,-9217,300985] : Rank = 7 Curve [0,0,0,-6544,7375129] : Rank = 8 Curve [0,1,0,9910,9815689] : Rank = 8 Curve [0,0,0,-6112,12325825] : Rank = 8 Curve [1,0,1,34318214642441646362435632562579908747,3184376895814127197244886284686214848599453811643486936756] : Rank = 15 Curve [0,0,0,-532,-4374] : Rank = 1 eclib-20250122/tests/out_ntl/tnfd.out000066400000000000000000000103061474421343600173510ustar00rootroot00000000000000Program tnfd. MODULUS for linear algebra = 1073741789 Verbose output? (0/1) Enter level: >>>Level 97 dimension = 8 Split into W-eigenspaces (0/1)? Multiplicity 1 eigenspaces only? (0/1)? Use just one T_p (1) or a linear combination (0)? Computing T_p for p = 2...done. char poly = [-3 28 -54 -54 47 22 -13 -2 1] NTL char poly square-free factors = [[[-3 28 -54 -54 47 22 -13 -2 1] 1]] Factors of multiplicity 1 are: 1: [-3 1] (degree 1) 2: [-1 3 4 1] (degree 3) 3: [-1 6 -1 -3 1] (degree 4) Enter factor number: Degree = 4 (unscaled) min poly = [1 -3 -1 6 -1 ] (rescaled) min poly = [-1 6 -1 -3 1] finished constructing S, now restricting T_p to S done. now combining S and SW 4*Matrix of T(2) restricted to S is [-4,8,4,0;0,4,0,8;-4,4,8,-4;-4,8,4,4] The former poly is the min poly of alpha_1 = 4*alpha The latter is the min poly of alpha, which is the eigenvalue of T(2) Finished computing (dual) subspace S S has denom 4, cumulative denom = 4 W = [1,-4,0,-256;0,8,16,512;0,4,16,320;0,0,48,256] W^(-1)= (1/128)*[128,-64,256,-64;0,176,-320,48;0,16,-32,8;0,-3,6,-1] Basis for Hecke eigenvalues, in terms of powers of alpha: (1/8)*[2,0,0,0] (1/8)*[-1,11,4,-3] (1/8)*[4,-20,-8,6] (1/8)*[-1,3,2,-1] Number of ap? 4*Matrix of T(2) = [-4,8,4,0;0,4,0,8;-4,4,8,-4;-4,8,4,4] char poly = [ -1 6 -1 -3 1 ] a_2 = [0,4,0,8] 4*Matrix of T(3) = [4,4,0,-12;8,-8,-8,-8;-4,8,8,0;0,-4,-4,-4] char poly = [ 4 -1 -5 0 1 ] a_3 = [8,-8,-8,-8] 4*Matrix of T(5) = [8,-8,-4,0;0,0,0,-8;4,-4,-4,4;4,-8,-4,0] char poly = [ 2 1 -4 -1 1 ] a_5 = [0,0,0,-8] 4*Matrix of T(7) = [8,-4,0,4;-8,16,16,0;12,-16,-20,0;0,0,4,8] char poly = [ -16 23 -6 -3 1 ] a_7 = [-8,16,16,0] 4*Matrix of T(11) = [8,-24,-12,16;0,-8,-16,-8;-4,4,20,12;12,-16,-12,0] char poly = [ 92 47 -14 -5 1 ] a_11 = [0,-8,-16,-8] 4*Matrix of T(13) = [-4,-16,-12,0;16,-40,-40,-16;-20,28,40,12;12,-20,-20,-20] char poly = [ -122 -167 -29 6 1 ] a_13 = [16,-40,-40,-16] 4*Matrix of T(17) = [-4,20,12,-4;-8,24,24,16;8,-12,-20,-12;-12,20,16,12] char poly = [ 74 15 -20 -3 1 ] a_17 = [-8,24,24,16] 4*Matrix of T(19) = [-12,0,0,8;0,-8,-8,8;-8,8,12,0;0,4,0,-4] char poly = [ 4 -11 -5 3 1 ] a_19 = [0,-8,-8,8] 4*Matrix of T(23) = [12,-16,-4,32;-16,32,8,16;4,-12,16,4;4,4,4,28] char poly = [ -368 -265 151 -22 1 ] a_23 = [-16,32,8,16] 4*Matrix of T(29) = [-12,32,16,-8;0,16,8,24;-8,8,12,-16;-16,28,16,12] char poly = [ -254 199 -27 -7 1 ] a_29 = [0,16,8,24] 4*Matrix of T(31) = [-8,44,20,-36;8,8,16,8;0,4,-16,-20;-20,24,16,0] char poly = [ 592 -79 -67 4 1 ] a_31 = [8,8,16,8] 4*Matrix of T(37) = [-12,-24,-12,24;0,-24,-24,0;-12,12,24,12;12,-12,-12,-12] char poly = [ 162 -81 -27 6 1 ] a_37 = [0,-24,-24,0] 4*Matrix of T(41) = [48,-12,-8,-36;8,8,16,-48;28,-24,-44,8;8,-32,-12,0] char poly = [ 5506 131 -158 -3 1 ] a_41 = [8,8,16,-48] 4*Matrix of T(43) = [20,-4,-4,-12;8,0,-8,-16;0,4,12,4;4,-12,-8,4] char poly = [ -44 9 20 -9 1 ] a_43 = [8,0,-8,-16] 4*Matrix of T(47) = [36,8,0,-32;16,8,-8,-24;0,8,20,0;0,-12,-8,12] char poly = [ 16 -161 99 -19 1 ] a_47 = [16,8,-8,-24] 4*Matrix of T(53) = [-4,24,4,-40;32,-40,-40,-16;-28,44,48,-4;-4,-4,-12,-20] char poly = [ 1262 -123 -75 4 1 ] a_53 = [32,-40,-40,-16] 4*Matrix of T(59) = [-8,24,4,-32;32,-40,-48,-8;-36,52,68,-4;-4,0,-12,-16] char poly = [ 772 3 -98 -1 1 ] a_59 = [32,-40,-48,-8] 4*Matrix of T(61) = [12,28,12,-44;8,8,24,-16;16,-12,-44,-12;-12,4,8,-4] char poly = [ -1046 -627 -74 7 1 ] a_61 = [8,8,24,-16] 4*Matrix of T(67) = [-32,12,16,36;-40,48,64,48;28,-48,-76,-16;-16,40,36,16] char poly = [ -1604 -1069 -86 11 1 ] a_67 = [-40,48,64,48] 4*Matrix of T(71) = [0,28,8,-28;24,-16,-32,0;-28,40,60,-8;-8,8,-4,0] char poly = [ -656 413 -24 -11 1 ] a_71 = [24,-16,-32,0] 4*Matrix of T(73) = [-40,12,16,36;-40,40,64,48;28,-48,-84,-16;-16,40,36,8] char poly = [ -3982 -1249 4 19 1 ] a_73 = [-40,40,64,48] 4*Matrix of T(79) = [-12,16,-4,-48;48,-80,-72,-32;-44,68,72,4;4,-20,-28,-44] char poly = [ 1952 -1303 -73 16 1 ] a_79 = [48,-80,-72,-32] 4*Matrix of T(83) = [-24,64,32,-16;0,32,16,48;-16,16,24,-32;-32,56,32,24] char poly = [ -4064 1592 -108 -14 1 ] a_83 = [0,32,16,48] 4*Matrix of T(89) = [-16,-44,-12,52;-40,16,48,8;40,-60,-96,12;12,-8,8,-8] char poly = [ -5762 -1449 91 26 1 ] a_89 = [-40,16,48,8] 4*Matrix of W(97) = [-4,0,0,0;0,-4,0,0;0,0,-4,0;0,0,0,-4] char poly = [ 1 4 6 4 1 ] w_97 = [0,0,0,0] Enter level: eclib-20250122/tests/out_ntl/torsion.out000066400000000000000000000075501474421343600201220ustar00rootroot00000000000000Curve [0,0,0,1,1] has 1 torsion point(s) [0:1:0] (order 1) Cyclic: C1 Curve [0,1,1,101470,57781877] has 1 torsion point(s) [0:1:0] (order 1) Cyclic: C1 Curve [0,0,0,1,0] has 2 torsion point(s) [0:1:0] (order 1) [0:0:1] (order 2) Cyclic: C2 Curve [0,0,0,0,100] has 3 torsion point(s) [0:1:0] (order 1) [0:-10:1] (order 3) [0:10:1] (order 3) Cyclic: C3 Curve [0,0,0,1,2] has 4 torsion point(s) [0:1:0] (order 1) [-1:0:1] (order 2) [1:-2:1] (order 4) [1:2:1] (order 4) Cyclic: C4 Curve [0,0,0,-1,0] has 4 torsion point(s) [0:1:0] (order 1) [-1:0:1] (order 2) [0:0:1] (order 2) [1:0:1] (order 2) Non-cyclic: C2 x C2 Curve [0,-1,1,0,0] has 5 torsion point(s) [0:1:0] (order 1) [0:-1:1] (order 5) [0:0:1] (order 5) [1:-1:1] (order 5) [1:0:1] (order 5) Cyclic: C5 Curve [0,0,0,0,1] has 6 torsion point(s) [0:1:0] (order 1) [-1:0:1] (order 2) [0:-1:1] (order 3) [0:1:1] (order 3) [2:-3:1] (order 6) [2:3:1] (order 6) Cyclic: C6 Curve [1,-1,1,-3,3] has 7 torsion point(s) [0:1:0] (order 1) [-1:-2:1] (order 7) [-1:2:1] (order 7) [1:-2:1] (order 7) [1:0:1] (order 7) [3:-6:1] (order 7) [3:2:1] (order 7) Cyclic: C7 Curve [0,1,0,-14624,669300] has 8 torsion point(s) [0:1:0] (order 1) [75:0:1] (order 2) [124:-882:1] (order 4) [124:882:1] (order 4) [82:-168:1] (order 8) [82:168:1] (order 8) [418:-8232:1] (order 8) [418:8232:1] (order 8) Cyclic: C8 Curve [0,1,0,-160,308] has 8 torsion point(s) [0:1:0] (order 1) [-14:0:1] (order 2) [2:0:1] (order 2) [11:0:1] (order 2) [-4:-30:1] (order 4) [-4:30:1] (order 4) [26:-120:1] (order 4) [26:120:1] (order 4) Non-cyclic: C2 x C4 Curve [1,-1,1,-14,29] has 9 torsion point(s) [0:1:0] (order 1) [1:-5:1] (order 3) [1:3:1] (order 3) [-3:-5:1] (order 9) [-3:7:1] (order 9) [3:-5:1] (order 9) [3:1:1] (order 9) [9:-29:1] (order 9) [9:19:1] (order 9) Cyclic: C9 Curve [1,0,0,115,561] has 10 torsion point(s) [0:1:0] (order 1) [-34:17:8] (order 2) [-2:-17:1] (order 5) [-2:19:1] (order 5) [16:-89:1] (order 5) [16:73:1] (order 5) [4:-35:1] (order 10) [4:31:1] (order 10) [70:-629:1] (order 10) [70:559:1] (order 10) Cyclic: C10 Curve [1,0,1,-19,26] has 12 torsion point(s) [0:1:0] (order 1) [-5:2:1] (order 2) [3:-2:1] (order 2) [14:-11:8] (order 2) [4:-7:1] (order 3) [4:2:1] (order 3) [-2:-7:1] (order 6) [-2:8:1] (order 6) [1:-4:1] (order 6) [1:2:1] (order 6) [13:-52:1] (order 6) [13:38:1] (order 6) Non-cyclic: C2 x C6 Curve [1,0,0,-1070,7812] has 16 torsion point(s) [0:1:0] (order 1) [-36:18:1] (order 2) [28:-14:1] (order 2) [62:-31:8] (order 2) [-8:-122:1] (order 4) [-8:130:1] (order 4) [64:-482:1] (order 4) [64:418:1] (order 4) [-26:-122:1] (order 8) [-26:148:1] (order 8) [4:-62:1] (order 8) [4:58:1] (order 8) [34:-122:1] (order 8) [34:88:1] (order 8) [244:-3902:1] (order 8) [244:3658:1] (order 8) Non-cyclic: C2 x C8 Curve [1,0,0,-372368141774940800,87459461608665181808640000] has 16 torsion point(s) [0:1:0] (order 1) [352179456:-176089728:1] (order 2) [352441600:-176220800:1] (order 2) [-5636968450:2818484225:8] (order 2) [335795200:-532861020800:1] (order 4) [335795200:532525225600:1] (order 4) [369088000:-549923580800:1] (order 4) [369088000:549554492800:1] (order 4) [117433600:-6734330460800:1] (order 8) [117433600:6734213027200:1] (order 8) [351262480:-33963904400:1] (order 8) [351262480:33612641920:1] (order 8) [353359600:-34032060800:1] (order 8) [353359600:33678701200:1] (order 8) [654296320:-11132578294400:1] (order 8) [654296320:11131923998080:1] (order 8) Non-cyclic: C2 x C8 Curve [0,0,0,-4/9,0] has 4 torsion point(s) [0:1:0] (order 1) [-2:0:3] (order 2) [0:0:1] (order 2) [2:0:3] (order 2) Non-cyclic: C2 x C2 Curve [1,0,0,-24518104183430,46728128863872512100] has 8 torsion point(s) [0:1:0] (order 1) [2859436:-1429718:1] (order 2) [2964412:-312683558:1] (order 4) [2964412:309719146:1] (order 4) [2864620:-18396950:1] (order 8) [2864620:15532330:1] (order 8) [4985200:-6959055290:1] (order 8) [4985200:6954070090:1] (order 8) Cyclic: C8 eclib-20250122/tests/out_ntl/tp2points.out000066400000000000000000000007771474421343600203730ustar00rootroot00000000000000Test program for P2Point class Point input formats are [x:y:z], [x,y], [x/z,y/z] with any type of brackets Enter a point P: P=[78:1292:221] output_pari(P) = [6/17,76/13] P==P? 1 After P=P2Point(2,4,-6), P=[-1:-2:3] After Q=P, Q=[-1:-2:3] After Q=transform(P,3,4,5,6,0), Q=[-13:15:27] After R=transform(Q,3,4,5,6,1), R=[-1:-2:3] R==P? 1 Projective coordinates of P are X=-1, Y=-2, Z=3 Affine coordinates of P are X=-1/3, Y=-2/3 Real affine coordinates of P are X=-0.3333333333, Y=-0.6666666667 P.isintegral()? 0 eclib-20250122/tests/out_ntl/tperiods.out000066400000000000000000000025231474421343600202510ustar00rootroot00000000000000Input curve = [0,0,1,-7,6]: Minimal model = [0,0,1,-7,6] Periods: [w_1,w_2] = [(0,-1.48054826824141499330733111064096025066420331463),(2.07584399154346652494208784175364314988581412828,0)] tau = (0,1.40207788970577749551790407455005069757479350561) (abs(tau)=1.40207788970577749551790407455005069757479350561) w_R = (2.07584399154346652494208784175364314988581412828,0) w_I = (0,1.48054826824141499330733111064096025066420331463) Curve from periods: [0,0,1,-7,6] Input curve = [0,0,0,-16/9,0]: Minimal model = [0,0,0,-9,0] Periods: [w_1,w_2] = [(1.5138456348012471454717362566781957801974612083,0),(0,1.5138456348012471454717362566781957801974612083)] tau = (0,1) (abs(tau)=1) w_R = (1.5138456348012471454717362566781957801974612083,0) w_I = (0,1.5138456348012471454717362566781957801974612083) Curve from periods: [0,0,0,-9,0] Input curve = [0,0,0,16/9,0]: Minimal model = [0,0,0,9,0] Periods: [w_1,w_2] = [(-1.07045051403761559931715552584764515095294889591,-1.07045051403761559931715552584764515095294889591),(1.07045051403761559931715552584764515095294889591,-1.07045051403761559931715552584764515095294889591)] tau = (0,1) (abs(tau)=1) w_R = (2.14090102807523119863431105169529030190589779181,0) w_IR = (1.07045051403761559931715552584764515095294889591,1.07045051403761559931715552584764515095294889591) Curve from periods: [0,0,0,9,0] eclib-20250122/tests/out_ntl/tperiods.out.clang000066400000000000000000000037021474421343600213340ustar00rootroot00000000000000Input curve = [0,0,1,-7,6]: Minimal model = [0,0,1,-7,6] Periods: [w_1,w_2] = [(0,-1.48054826824141499330733111064096025066420331463),(2.07584399154346652494208784175364314988581412828,0)] tau = (0,1.40207788970577749551790407455005069757479350561) (abs(tau)=1.40207788970577749551790407455005069757479350561) w_R = (2.07584399154346652494208784175364314988581412828,0) w_I = (0,1.48054826824141499330733111064096025066420331463) Curve from periods: [0,0,1,-7,6] Input curve = [0,0,0,0,1024]: Minimal model = [0,0,1,0,0] Periods: [w_1,w_2] = [(-2.6499581254281749359705342494726580538578028073,-1.52995403705719287491319417230882435857282894716),(2.6499581254281749359705342494726580538578028073,-1.52995403705719287491319417230882435857282894716)] tau = (-0.5,0.866025403784438646763723170752936183471402626905) (abs(tau)=1) w_R = (5.29991625085634987194106849894531610771560561461,0.664346770364488539173883442047326229420043550328e-52) w_IR = (2.6499581254281749359705342494726580538578028073,1.52995403705719287491319417230882435857282894716) Curve from periods: [0,0,1,0,0] Input curve = [0,0,0,-16/9,0]: Minimal model = [0,0,0,-9,0] Periods: [w_1,w_2] = [(1.5138456348012471454717362566781957801974612083,0),(0,1.5138456348012471454717362566781957801974612083)] tau = (0,1) (abs(tau)=1) w_R = (1.5138456348012471454717362566781957801974612083,0) w_I = (0,1.5138456348012471454717362566781957801974612083) Curve from periods: [0,0,0,-9,0] Input curve = [0,0,0,16/9,0]: Minimal model = [0,0,0,9,0] Periods: [w_1,w_2] = [(-1.07045051403761559931715552584764515095294889591,-1.07045051403761559931715552584764515095294889591),(1.07045051403761559931715552584764515095294889591,-1.07045051403761559931715552584764515095294889591)] tau = (0,1) (abs(tau)=1) w_R = (2.14090102807523119863431105169529030190589779181,0) w_IR = (1.07045051403761559931715552584764515095294889591,1.07045051403761559931715552584764515095294889591) Curve from periods: [0,0,0,9,0] eclib-20250122/tests/out_ntl/tperiods.out.gcc000066400000000000000000000036221474421343600210050ustar00rootroot00000000000000Input curve = [0,0,1,-7,6]: Minimal model = [0,0,1,-7,6] Periods: [w_1,w_2] = [(0,-1.48054826824141499330733111064096025066420331463),(2.07584399154346652494208784175364314988581412828,0)] tau = (0,1.40207788970577749551790407455005069757479350561) (abs(tau)=1.40207788970577749551790407455005069757479350561) w_R = (2.07584399154346652494208784175364314988581412828,0) w_I = (0,1.48054826824141499330733111064096025066420331463) Curve from periods: [0,0,1,-7,6] Input curve = [0,0,0,0,1024]: Minimal model = [0,0,1,0,0] Periods: [w_1,w_2] = [(-2.6499581254281749359705342494726580538578028073,-1.52995403705719287491319417230882435857282894716),(0.167047794380762227883783529196967617425949805007e-51,-3.05990807411438574982638834461764871714565789432)] tau = (0.5,0.866025403784438646763723170752936183471402626905) (abs(tau)=1) w_R = (5.29991625085634987194106849894531610771560561461,0) w_IR = (2.6499581254281749359705342494726580538578028073,1.52995403705719287491319417230882435857282894716) Curve from periods: [0,0,1,0,0] Input curve = [0,0,0,-16/9,0]: Minimal model = [0,0,0,-9,0] Periods: [w_1,w_2] = [(1.5138456348012471454717362566781957801974612083,0),(0,1.5138456348012471454717362566781957801974612083)] tau = (0,1) (abs(tau)=1) w_R = (1.5138456348012471454717362566781957801974612083,0) w_I = (0,1.5138456348012471454717362566781957801974612083) Curve from periods: [0,0,0,-9,0] Input curve = [0,0,0,16/9,0]: Minimal model = [0,0,0,9,0] Periods: [w_1,w_2] = [(-1.07045051403761559931715552584764515095294889591,-1.07045051403761559931715552584764515095294889591),(1.07045051403761559931715552584764515095294889591,-1.07045051403761559931715552584764515095294889591)] tau = (0,1) (abs(tau)=1) w_R = (2.14090102807523119863431105169529030190589779181,0) w_IR = (1.07045051403761559931715552584764515095294889591,1.07045051403761559931715552584764515095294889591) Curve from periods: [0,0,0,9,0] eclib-20250122/tests/out_ntl/tpoints.out000066400000000000000000000310221474421343600201140ustar00rootroot00000000000000Computed 78519 primes, largest is 1000253 Extra primes in list: Testing some points: The points are P0 = [0:2:1], P1 = [1:0:1], and P2 = [2:0:1] Now in Pari format: The points are P0 = [0,2], P1 = [1,0], and P2 = [2,0] Their negatives are -P0 = [0:-3:1], -P1 = [1:-1:1], and -P2 = [2:-1:1] Computing their heights: Heights are 0.99090633315308797388259855289, 0.66820516565192793503314205089, and 0.76704335533154620579545064655 The origin is [0:1:0] Now some additions etc,: P0 + P1 = [3:3:1] P0 - P1 = [8:21:1] P0 - P1 - P2 = [93:-143:27] P0.twice() = [245:-32:125] P0 + P0 = [245:-32:125] 3*P0 = [-74725:-438957:117649] P0 - P0 = [0:1:0] P0 +3 P1 - P2 = [816:-23310:1] 2P0 +2 P1 + P2 = [93:896:1] Now we try a systematic exploration -3, -3, -3: [173402493:-312412055:41781923] -3, -3, -2: [4189408:8960581:704969] -3, -3, -1: [1786410:-1787743:729000] -3, -3, 0: [1735612:8628750:68921] -3, -3, 1: [160962987:-73608612:81182737] -3, -3, 2: [1356164797:-71126160883:493039] -3, -3, 3: [125658707472212:6072729019689:62179146498113] -3, -2, -3: [2212614:-10179939:4574296] -3, -2, -2: [-34216:251158:103823] -3, -2, -1: [-17639:-109980:29791] -3, -2, 0: [92379:143623:148877] -3, -2, 1: [-4163000:-7596119:1953125] -3, -2, 2: [1838781714:-135929375:1806932232] -3, -2, 3: [-4773144746116:-976602707934:1584834464179] -3, -1, -3: [1178299:-4850852:68921] -3, -1, -2: [94875:71299:35937] -3, -1, -1: [24412:-50127:4913] -3, -1, 0: [85098:154071:17576] -3, -1, 1: [3858272:-4442750:1442897] -3, -1, 2: [587381677:2315829684:36264691] -3, -1, 3: [5308466179635:-3022905914377:2608126472125] -3, 0, -3: [4430992:-3892417:4330747] -3, 0, -2: [-119434:155991:54872] -3, 0, -1: [32412:-97546:50653] -3, 0, 0: [-74725:321308:117649] -3, 0, 1: [-1453671:-16871239:5000211] -3, 0, 2: [1175800444:3238879023:2554497863] -3, 0, 3: [-8489731927494:-19600265861445:4763680807976] -3, 1, -3: [5081640:197180774:3375] -3, 1, -2: [5310773:-336300:2685619] -3, 1, -1: [657459:-3409809:24389] -3, 1, 0: [8348488:4750403:3442951] -3, 1, 1: [228191806:-536379633:37259704] -3, 1, 2: [114813702300:174977582986:28288984823] -3, 1, 3: [556368785287493:-733074121389148:187375095748567] -3, 2, -3: [8704995703:942557295:8960030533] -3, 2, -2: [-363511764:-185058623:122763473] -3, 2, -1: [216346510:-146306363:205379000] -3, 2, 0: [-724812816:692674750:291434247] -3, 2, 1: [28678925057:-61748215932:37360194607] -3, 2, 2: [-8685736238109:26728697273751:8963913629917] -3, 2, 3: [-1258675911627328:-170609866818516791:56286247430493053] -3, 3, -3: [6411102385354:21118267149921:548548738856] -3, 3, -2: [734465224452:-495548440926:348765000319] -3, 3, -1: [46328051291:614238485020:263374721] -3, 3, 0: [2041384645877:-367524023451:1045987472951] -3, 3, 1: [22947655893900:-160349260775081:470003609375] -3, 3, 2: [49052364371736622:19768548114717625:21681696304639736] -3, 3, 3: [141154686087724689336:-382997118708972871786:18067866971533021791] -2, -3, -3: [9718082:-5196113:9129329] -2, -3, -2: [-88288:60819:32768] -2, -3, -1: [10350:-17696:12167] -2, -3, 0: [-8569:21344:6859] -2, -3, 1: [22083:-365579:132651] -2, -3, 2: [1467346:29518545:15813251] -2, -3, 3: [-14840686668:-53202497391:13077534016] -2, -2, -3: [55278:480700:729] -2, -2, -2: [4277:-1152:2197] -2, -2, -1: [93:-897:1] -2, -2, 0: [742:209:343] -2, -2, 1: [5000:-15351:512] -2, -2, 2: [1124214:1218856:357911] -2, -2, 3: [1399931107:-2331158336:371694959] -2, -1, -3: [20213:12411:24389] -2, -1, -2: [-330:-377:125] -2, -1, -1: [68:-25:64] -2, -1, 0: [-78:28:27] -2, -1, 1: [1243:-1632:1331] -2, -1, 2: [-128097:250701:79507] -2, -1, 3: [83553550:-541263919:223648543] -2, 0, -3: [28688:68991:4096] -2, 0, -2: [798:-720:343] -2, 0, -1: [37:224:1] -2, 0, 0: [245:-93:125] -2, 0, 1: [342:-6325:1] -2, 0, 2: [650692:91633:314432] -2, 0, 3: [448295118:-1637295092:33076161] -2, 1, -3: [-19875:324544:148877] -2, 1, -2: [-1807:-8533:2197] -2, 1, -1: [522:559:729] -2, 1, 0: [-1208:-1845:512] -2, 1, 1: [31062:-6216:29791] -2, 1, 2: [-4555265:134912:1520875] -2, 1, 3: [9633434827:-9849844875:9677214091] -2, 2, -3: [22319442:19888197:7880599] -2, 2, -2: [371756:-695903:85184] -2, 2, -1: [67850:138204:12167] -2, 2, 0: [199563:-208288:79507] -2, 2, 1: [1507693:6967591:68921] -2, 2, 2: [936156018:-458727065:469097433] -2, 2, 3: [13269197888:-2985362435769:262144] -2, 3, -3: [-4964538862:7806531200:2565726409] -2, 3, -2: [67004241:-268411616:125751501] -2, 3, -1: [-8104163:48961227:19465109] -2, 3, 0: [-21256194:-153135513:42508549] -2, 3, 1: [836123500:1525038911:1450571968] -2, 3, 2: [-290048080358:-567945909132:142809632083] -2, 3, 3: [924932335876083:-16318887357184:920911723813171] -1, -3, -3: [11454454:20427225:2406104] -1, -3, -2: [80352:-93666:29791] -1, -3, -1: [1955:7564:125] -1, -3, 0: [2717:-1575:1331] -1, -3, 1: [816:23309:1] -1, -3, 2: [798682:-68303:405224] -1, -3, 3: [119498676:-651053998:4019679] -1, -2, -3: [-33633:139628:50653] -1, -2, -2: [-91:-1147:343] -1, -2, -1: [12:35:27] -1, -2, 0: [-14:-33:8] -1, -2, 1: [120:18:125] -1, -2, 2: [-6461:-3700:2197] -1, -2, 3: [4922993:-3160443:4657463] -1, -1, -3: [11832:6549:4913] -1, -1, -2: [50:-119:8] -1, -1, -1: [4:6:1] -1, -1, 0: [3:-4:1] -1, -1, 1: [11:35:1] -1, -1, 2: [1548:-1079:729] -1, -1, 3: [139610:1648791:1000] -1, 0, -3: [-3344:3094:1331] -1, 0, -2: [21:-44:27] -1, 0, -1: [-1:3:1] -1, 0, 0: [0:-3:1] -1, 0, 1: [2:13:8] -1, 0, 2: [-476:-1422:343] -1, 0, 3: [506217:208180:571787] -1, 1, -3: [30475:-5797:15625] -1, 1, -2: [52:-375:1] -1, 1, -1: [18:7:8] -1, 1, 0: [8:-22:1] -1, 1, 1: [93:116:27] -1, 1, 2: [7475:-11361:2197] -1, 1, 3: [4040376:10769499:493039] -1, 2, -3: [-440586:-390925:157464] -1, 2, -2: [5236:-2538:4913] -1, 2, -1: [-345:204:125] -1, 2, 0: [301:-475:343] -1, 2, 1: [-1804:4179:1331] -1, 2, 2: [45066:-518089:195112] -1, 2, 3: [3497024:311754698:158340421] -1, 3, -3: [193462973:-156569868:86938307] -1, 3, -2: [409317:3155489:6859] -1, 3, -1: [202288:-61085:103823] -1, 3, 0: [27222:-305641:216] -1, 3, 1: [1828180:436722:857375] -1, 3, 2: [84254013:-271587900:7880599] -1, 3, 3: [144166484837:146955288613:47555965367] 0, -3, -3: [-198562138:65431412:68417929] 0, -3, -2: [499689:-641312:531441] 0, -3, -1: [-8075:15471:4913] 0, -3, 0: [858:-5253:2197] 0, -3, 1: [-752:9191:4096] 0, -3, 2: [-60458:-305040:79507] 0, -3, 3: [22469403:26544416:32461759] 0, -2, -3: [2021717:-787325:1030301] 0, -2, -2: [406:-8181:1] 0, -2, -1: [132:17:64] 0, -2, 0: [14:-52:1] 0, -2, 1: [75:64:27] 0, -2, 2: [1547:-2967:343] 0, -2, 3: [369738:730191:68921] 0, -1, -3: [-32232:-50399:13824] 0, -1, -2: [130:-24:125] 0, -1, -1: [-3:0:1] 0, -1, 0: [1:-1:1] 0, -1, 1: [-2:3:1] 0, -1, 2: [36:-133:64] 0, -1, 3: [-5750:31324:12167] 0, 0, -3: [17347:-18336:6859] 0, 0, -2: [21:95:1] 0, 0, -1: [2:-1:1] 0, 0, 0: [0:1:0] 0, 0, 1: [2:0:1] 0, 0, 2: [21:-96:1] 0, 0, 3: [17347:11477:6859] 0, 1, -3: [-5750:-43491:12167] 0, 1, -2: [36:69:64] 0, 1, -1: [-2:-4:1] 0, 1, 0: [1:0:1] 0, 1, 1: [-3:-1:1] 0, 1, 2: [130:-101:125] 0, 1, 3: [-32232:36575:13824] 0, 2, -3: [369738:-799112:68921] 0, 2, -2: [1547:2624:343] 0, 2, -1: [75:-91:27] 0, 2, 0: [14:51:1] 0, 2, 1: [132:-81:64] 0, 2, 2: [406:8180:1] 0, 2, 3: [2021717:-242976:1030301] 0, 3, -3: [22469403:-59006175:32461759] 0, 3, -2: [-60458:225533:79507] 0, 3, -1: [-752:-13287:4096] 0, 3, 0: [858:3056:2197] 0, 3, 1: [-8075:-20384:4913] 0, 3, 2: [499689:109871:531441] 0, 3, 3: [-198562138:-133849341:68417929] 1, -3, -3: [144166484837:-194511253980:47555965367] 1, -3, -2: [84254013:263707301:7880599] 1, -3, -1: [1828180:-1294097:857375] 1, -3, 0: [27222:305425:216] 1, -3, 1: [202288:-42738:103823] 1, -3, 2: [409317:-3162348:6859] 1, -3, 3: [193462973:69631561:86938307] 1, -2, -3: [3497024:-470095119:158340421] 1, -2, -2: [45066:322977:195112] 1, -2, -1: [-1804:-5510:1331] 1, -2, 0: [301:132:343] 1, -2, 1: [-345:-329:125] 1, -2, 2: [5236:-2375:4913] 1, -2, 3: [-440586:233461:157464] 1, -1, -3: [4040376:-11262538:493039] 1, -1, -2: [7475:9164:2197] 1, -1, -1: [93:-143:27] 1, -1, 0: [8:21:1] 1, -1, 1: [18:-15:8] 1, -1, 2: [52:374:1] 1, -1, 3: [30475:-9828:15625] 1, 0, -3: [506217:-779967:571787] 1, 0, -2: [-476:1079:343] 1, 0, -1: [2:-21:8] 1, 0, 0: [0:2:1] 1, 0, 1: [-1:-4:1] 1, 0, 2: [21:17:27] 1, 0, 3: [-3344:-4425:1331] 1, 1, -3: [139610:-1649791:1000] 1, 1, -2: [1548:350:729] 1, 1, -1: [11:-36:1] 1, 1, 0: [3:3:1] 1, 1, 1: [4:-7:1] 1, 1, 2: [50:111:8] 1, 1, 3: [11832:-11462:4913] 1, 2, -3: [4922993:-1497020:4657463] 1, 2, -2: [-6461:1503:2197] 1, 2, -1: [120:-143:125] 1, 2, 0: [-14:25:8] 1, 2, 1: [12:-62:27] 1, 2, 2: [-91:804:343] 1, 2, 3: [-33633:-190281:50653] 1, 3, -3: [119498676:647034319:4019679] 1, 3, -2: [798682:-336921:405224] 1, 3, -1: [816:-23310:1] 1, 3, 0: [2717:244:1331] 1, 3, 1: [1955:-7689:125] 1, 3, 2: [80352:63875:29791] 1, 3, 3: [11454454:-22833329:2406104] 2, -3, -3: [924932335876083:-904592836455987:920911723813171] 2, -3, -2: [-290048080358:425136277049:142809632083] 2, -3, -1: [836123500:-2975610879:1450571968] 2, -3, 0: [-21256194:110626964:42508549] 2, -3, 1: [-8104163:-68426336:19465109] 2, -3, 2: [67004241:142660115:125751501] 2, -3, 3: [-4964538862:-10372257609:2565726409] 2, -2, -3: [13269197888:2985362173625:262144] 2, -2, -2: [936156018:-10370368:469097433] 2, -2, -1: [1507693:-7036512:68921] 2, -2, 0: [199563:128781:79507] 2, -2, 1: [67850:-150371:12167] 2, -2, 2: [371756:610719:85184] 2, -2, 3: [22319442:-27768796:7880599] 2, -1, -3: [9633434827:172630784:9677214091] 2, -1, -2: [-4555265:-1655787:1520875] 2, -1, -1: [31062:-23575:29791] 2, -1, 0: [-1208:1333:512] 2, -1, 1: [522:-1288:729] 2, -1, 2: [-1807:6336:2197] 2, -1, 3: [-19875:-473421:148877] 2, 0, -3: [448295118:1604218931:33076161] 2, 0, -2: [650692:-406065:314432] 2, 0, -1: [342:6324:1] 2, 0, 0: [245:-32:125] 2, 0, 1: [37:-225:1] 2, 0, 2: [798:377:343] 2, 0, 3: [28688:-73087:4096] 2, 1, -3: [83553550:317615376:223648543] 2, 1, -2: [-128097:-330208:79507] 2, 1, -1: [1243:301:1331] 2, 1, 0: [-78:-55:27] 2, 1, 1: [68:-39:64] 2, 1, 2: [-330:252:125] 2, 1, 3: [20213:-36800:24389] 2, 2, -3: [1399931107:1959463377:371694959] 2, 2, -2: [1124214:-1576767:357911] 2, 2, -1: [5000:14839:512] 2, 2, 0: [742:-552:343] 2, 2, 1: [93:896:1] 2, 2, 2: [4277:-1045:2197] 2, 2, 3: [55278:-481429:729] 2, 3, -3: [-14840686668:40124963375:13077534016] 2, 3, -2: [1467346:-45331796:15813251] 2, 3, -1: [22083:232928:132651] 2, 3, 0: [-8569:-28203:6859] 2, 3, 1: [10350:5529:12167] 2, 3, 2: [-88288:-93587:32768] 2, 3, 3: [9718082:-3933216:9129329] 3, -3, -3: [141154686087724689336:364929251737439849995:18067866971533021791] 3, -3, -2: [49052364371736622:-41450244419357361:21681696304639736] 3, -3, -1: [22947655893900:159879257165706:470003609375] 3, -3, 0: [2041384645877:-678463449500:1045987472951] 3, -3, 1: [46328051291:-614501859741:263374721] 3, -3, 2: [734465224452:146783440607:348765000319] 3, -3, 3: [6411102385354:-21666815888777:548548738856] 3, -2, -3: [-1258675911627328:114323619388023738:56286247430493053] 3, -2, -2: [-8685736238109:-35692610903668:8963913629917] 3, -2, -1: [28678925057:24388021325:37360194607] 3, -2, 0: [-724812816:-984108997:291434247] 3, -2, 1: [216346510:-59072637:205379000] 3, -2, 2: [-363511764:62295150:122763473] 3, -2, 3: [8704995703:-9902587828:8960030533] 3, -1, -3: [556368785287493:545699025640581:187375095748567] 3, -1, -2: [114813702300:-203266567809:28288984823] 3, -1, -1: [228191806:499119929:37259704] 3, -1, 0: [8348488:-8193354:3442951] 3, -1, 1: [657459:3385420:24389] 3, -1, 2: [5310773:-2349319:2685619] 3, -1, 3: [5081640:-197184149:3375] 3, 0, -3: [-8489731927494:14836585053469:4763680807976] 3, 0, -2: [1175800444:-5793376886:2554497863] 3, 0, -1: [-1453671:11871028:5000211] 3, 0, 0: [-74725:-438957:117649] 3, 0, 1: [32412:46893:50653] 3, 0, 2: [-119434:-210863:54872] 3, 0, 3: [4430992:-438330:4330747] 3, 1, -3: [5308466179635:414779442252:2608126472125] 3, 1, -2: [587381677:-2352094375:36264691] 3, 1, -1: [3858272:2999853:1442897] 3, 1, 0: [85098:-171647:17576] 3, 1, 1: [24412:45214:4913] 3, 1, 2: [94875:-107236:35937] 3, 1, 3: [1178299:4781931:68921] 3, 2, -3: [-4773144746116:-608231756245:1584834464179] 3, 2, -2: [1838781714:-1671002857:1806932232] 3, 2, -1: [-4163000:5642994:1953125] 3, 2, 0: [92379:-292500:148877] 3, 2, 1: [-17639:80189:29791] 3, 2, 2: [-34216:-354981:103823] 3, 2, 3: [2212614:5605643:4574296] 3, 3, -3: [125658707472212:-68251875517802:62179146498113] 3, 3, -2: [1356164797:71125667844:493039] 3, 3, -1: [160962987:-7574125:81182737] 3, 3, 0: [1735612:-8697671:68921] 3, 3, 1: [1786410:1058743:729000] 3, 3, 2: [4189408:-9665550:704969] 3, 3, 3: [173402493:270630132:41781923] P0 -P1 -P2 = [93:-143:27] Height of P0-P1-P2 = 3.518883255539141483787954523 3 (P0 -P1 -P2) = [141154686087724689336:364929251737439849995:18067866971533021791] Height of 3*(P0-P1-P2) = 31.669949299852273354091590707 The quotient is 9 eclib-20250122/tests/out_ntl/tsat.out000066400000000000000000000242761474421343600174040ustar00rootroot00000000000000====================================================== E = [0,0,1,-7,36] 4 points entered. Saturating at primes from 3 up to 31 Original generators: [ [1:-6:1] [-30:21:8] [-3:5:1] [-2:6:1] ] Finished saturation Saturation was successful: points were saturated. ====================================================== E = [0,1,1,-5203683874,-144483976270257] 1 points entered. Saturating at all primes Original generators: [ [2168251995411655778450807625109071458038066424045439264804487113928192266016020816172218469959472732741510882314178322295331571822203868759614460527408393291040333261244844673953396751473422476995056323999281244426790658741733680090138250308642118792275475439143640175842859841861264637794519698266643177065819124073183662609282196450269581232530177580634465414842216528373420323470390660256872979658885631514035518348207869636806327533508766676916684354545201633207996298998579901677851243624161746589199279061505874565140912014693702028364739260393363418410011798145756316894322963444249147617189658773074116491868653410041586711402977569904300351653936563902996379791449084233231227444059282985855021708597859154178410390445730153459861205321644159930738153044138358534665941126919788270822023659547507189517953043121524084072826640534204404300472862720958811506286038768947221129351368146095020133206527850215213950359031199486169574626580562846695046144828938927639571527184357435976547650233355430910696272506250710136450456894613228631694103703933128788483928479939687032487589013851132850684009952593048445016939728828366898294158020628858754314743175045687398921901306570682458345426806628575823818801710206865420359781674525597354384674535648163829019093957749883277798097159017005089757478115510067535309286959737817694716226665304123810921822327337505528034993000293784222380300988272288056564997643480032615147394559721279318718817658651213353867153113663308446804249733068918074852208587161776863336775478249305395428139272514254338938661523728115109079983135497074135741902177177999604848710924039842168027670793487422571666903905642786384352531734076733827122457553483648925141026837037509914027412169473693596906535856646397352311187868483922299889317614661572418967877218341775885698055825924594384826053641479194295243865238745227804689351553427105421391182502920232922502107626301181580631476235655118267512131848224089397881897391106797316846696863657121327359364921363885951494291129789263590516609433357442753979175746253392335248115963358563519225104124856975885085451153634415758609794618675169641380964085177770283733146557710513935065334084:364654369939587648906030762497183160109799932520650058473363052219001308473384490911706405327718697981247451098615982520199645970933830586030154221168571970479695728142576529636749368000968999430831418040633283507293148166400111964336132329693370563941243608304103118635763763871473320114434276900544107964277568511975569658271003516219748148962844792223712916904487152552673353199810409466086477926873859617492908007285811437488882628561671691938468841363705905046933159244012880659388085232633048536202972626384696337309510755341270174064849639232837560473077424191232713145537795992525229024094819288602358958183748275795826931290827850214181121003836714105128411417440027360841694561297046489151577185815004853653631309769452368745405178134574583216805407905563485825129714243040090535269494424068589987051547149416660798406980488525645025986822101607825558083463402728332177661751209357299930496711314336935733168117194205776152965289683798092995859473722642449236990940585291388058223677341808671604826854635264579205902337879123696848135422385086381954572327211150858524979066980117300089224757572813696508036079332096754879164681400594143712362513751637672178645631852441401005600560911657194060598416805555184766414632445213502160447629146507421544326076124685348273636380749382590469323037537456798790010911484256990362805352466003316143078595248039148429507096280144630620875465771714123525979480680262191956249492812343264974653172764673582375973200128237268233497010078416360077157636217916142154902156819759441964369767958125349092784887195111965076637610415036710299856528153841184036406257551853851922646605007420623465848209535215803147916346137362582569449990535986732389047591523922915380971466539014735487552659653072536572946791807698597843296032353968427432951509410199484240933117920377862676413312501322519112790523947235328179692810649587946704912790592260617330237158584048655547875279955969751372773326857438357176395050456576464438439737011718767378163589134288534627690726556343761315341705359551358313620563682865101664670378036299702780398110693067880348806438123817052382898219452382009080152124622107344593030316661775018429035194563637:22317970971443875510611416101670014063668929622831105713401848353385316357833502476650169666238609506087380683653752861251316718941551021529634676318722856804562481981038783704965926981894188040424793490282253199818654113403299652411766586893637130844237556802191193881748289829318453568155519369817072879478501421977458952245825208377187676830481519728613877718488541152862443312019160701652096030025286262868295333293751809263461353455807780736830633364090387805457788263561273442847931501904840605662223721447538164697728515638037749354408496834998174519425164118860754125696257929015927953548312475428447961050159177374010733123196007769087605301025246657294061092368609497376968037727428713097507568320128441337346419127591378252085508742928012408809501754062842882357521616608671649298326924215970513443763734062770550920194398575831413358255150966255520164344717795011990002273655966510824703682564440820960177925281111050129305897235397125605146890531611594301654186908799443341871309270068544156774169133478879354536191604826212655718599503438362386780457393969122515706195169781384450157732458404828323791884576526004489890287644901077681404407444887681900211255249512230135643352114304013678172359997357266565904381267131107054586136520020807774895620583325622322681098811178059391982810861776666746192636631001776990384773431454306089061617574732768003979548756136864641554986647906209140690447324944012868613604026983320395301550962373816762107139737362463100989048640283782005683054645760529775838499173716253816568567111603337493700682263305947769200140004766794916642737838354166541364524503235736628923596537336119435817755486308384581248453905226595195854109627329816846782215641144505332763667376790836435296624214901500770801446403123588601822008055568995437059758200758821882232217656317711713252479536512494090275474267650910103053541521776292425133116980377726105030951104026007449281506890788218298119670232955279031318796075303045843728647357475338352902001496140017154422025945974039589898173587384356313154052740510594785527806175232165610851643753950815807169507656504384856287060143893491226759270952136509949484652111617488637731392] ] Finished saturation Saturation was successful: index gain = 3. New generators: [ [14986931173003228760840414871852147976607848645984618771104488093465357235642483249101234369962329540628919747143492328836904844320646997239288269963796421809427854486303981435632275267326817136749482009612149433561486268353477221552938476:-8205452548669931425705662808214708011821779110339621586064377914222134830813388165142677106884964627346340262024523431333472092215913380577041636064958499079740946069243644115846523745688777100788896240083781545430792294999410644569703090411:47190886885240830168837111305250498473924214069702508468798179087586425058508758403484988744208755837410257773968837300792812547048121267314170386019423120462260202132768315652146750448168154355407626076374835919868144957186286895808] ] ====================================================== E = [1,1,1,-218325338,-1241755642969] 1 points entered. Saturating at all primes Original generators: [ [52725:11541787:1] ] Finished saturation Saturation was successful: points were saturated. ====================================================== E = [0,0,1,-23737,960366] 8 points entered. Saturating at all primes Original generators: [ [36:390:1] [-87:1538:1] [181:1610:1] [-159:845:1] [-29:1274:1] [-11005:192282:125] [-3021:40175:27] [10532:78629:64] ] Finished saturation Saturation was successful: index gain = 5. New generators: [ [36:390:1] [-87:1538:1] [181:1610:1] [7046:-2067064:2197] [-29:1274:1] [-11005:192282:125] [-3021:40175:27] [10532:78629:64] ] ====================================================== E = [0,1,0,-3532341,2671895459] 1 points entered. Saturating at primes from 3 up to 3 Original generators: [ [-70530065697753731555722521380451694847027684946481619207066358883190994719487509574998052510855059423334984274230836976431876403642:200898144915891992877832706966832248880788948705776913304828657795482993310179952832361429299128720575547455788810135494156109029455:32383162777362251978562757665550366176161600539636371030636031896984923251479838151766462063041425141567992375986724367103348073] ] Finished saturation Saturation was successful: index gain = 3. New generators: [ [2039080769383242:43530702836852015:1260762051627] ] ====================================================== E = [0,1,1,-9872,374262] 4 points entered. Saturating at primes from 1 up to 211 Original generators: [ [57:0:1] [56:13:1] [458:19:8] [36:-259:1] ] Finished saturation Saturation was successful: points were saturated. ====================================================== E = [0,0,0,-17607,-889490] 1 points entered. Saturating at primes from 1 up to 101 Original generators: [ [46596:-1234751:64] ] Finished saturation Saturation was successful: index gain = 2. New generators: [ [-82:54:1] ] ====================================================== E = [0,0,0,-17607,-889490] 1 points entered. Saturating at all primes Original generators: [ [263280129247652531170706277157407041933571252365420026866208951873920842052396252657635769198080932098233160834620319573506062955649578386039454820298260:12270174977753354259300841932138583546945739892423470904743601423748009727778856605607417283774449633972161184879734495532161875678358689349216627511369921:120754622061233085483190490682227449179649624416185851339590001839002936632584697769070479156764302333294029190402580462433963906189955071839715336000] ] Finished saturation Saturation was successful: index gain = 10. New generators: [ [-82:54:1] ] eclib-20250122/tests/out_ntl/tsat2.out000066400000000000000000000013331474421343600174530ustar00rootroot00000000000000 =============================================================== 24129r1 = [0,0,1,-68799,-1969790] 2 points entered:[ [-1870:9257:8] [-197:1984:1] ] Saturation index bound (for points of good reduction) = 4 Tamagawa index primes are [ 2 5 ] Saturation primes are now[ 2 3 5 ] Checking saturation at [ 2 3 5 ] Checking 2-saturation Points were proved 2-saturated (max q used = 17) Checking 3-saturation Points were proved 3-saturated (max q used = 37) Checking 5-saturation Points were proved 5-saturated (max q used = 73) Finished p-saturation, points were saturated =============================================================== Number of curves entered: 1 Number saturated already: 1 Number which were saturated: 0 eclib-20250122/tests/out_ntl/tsat3.out000066400000000000000000000021321474421343600174520ustar00rootroot00000000000000 24129181 = [0,0,1,-68799,-1969790] rank = 2 torsion group structure = [ ] (torsion rank 0) Input non-torsion points: [ [-1870:9257:8] [-197:1984:1] ] Input torsion points: [ ] Saturation complete --input points were saturated Generator 1 is [-1870:9257:8]; height 2.0083871151269007291034854397 Generator 2 is [-197:1984:1]; height 0.18240478738536152619143455674 Regulator = 0.28891907499740315117172793739 24129 18 1 [0,0,1,-68799,-1969790] 2 [-1870:9257:8] [-197:1984:1] ============================================================== 133507b2 = [1,-1,0,-898,-7905] rank = 2 torsion group structure = [ 2 2 ] (torsion rank 2) Input non-torsion points: [ [-178:299:8] [-23748:-59351:1728] ] Input torsion points: [ [34:-17:1] [-10:5:1] ] Saturation complete --input points were saturated Generator 1 is [-178:299:8]; height 4.6929258797812327543577096898 Generator 2 is [-23748:-59351:1728]; height 6.9948553142437901997940849255 Regulator = 32.793309684572014438912548031 133507 b 2 [1,-1,0,-898,-7905] 2 [-178:299:8] [-23748:-59351:1728] ============================================================== eclib-20250122/tests/out_ntl/tsatbnd.out000066400000000000000000000203041474421343600200540ustar00rootroot00000000000000====================================================== E = [0,0,1,-7,36] 4 points entered: [1:-6:1] (height 1.6349748928639427433912346865) [-30:21:8] (height 3.2314398318025205249814387186) [-3:5:1] (height 1.8051880666153947782569419431) [-2:6:1] (height 1.7512018533833741083102767996) Regulator of input points: 3.3063784745913055160929273361 Subgroup of EGR points has index 1 Images of points in component groups at bad primes and R p Group Image(s) 545723 [ 1 ] [ 0 ][ 0 ][ 0 ][ 0 ] R [ 1 ] [ 0 ][ 0 ][ 0 ][ 0 ] Global Tamagawa number: 1 Global Tamagawa exponent: 1 lower height bound (egr points): 0.21022410381342863575778136906 bound on saturation index (egr points): 82 lower height bound (all points): 0.21022410381342863575778136906 bound on saturation index (all points): 82 ====================================================== E = [1,1,1,-218325338,-1241755642969] 1 points entered: [52725:11541787:1] (height 7.3905747176836140279287903443) Regulator of input points: 7.3905747176836140279287903443 Subgroup of EGR points has index 6 Images of points in component groups at bad primes and R p Group Image(s) 2 [ 6 ] [ 2 ] 3 [ 2 ] [ 1 ] 5 [ 4 ] [ 2 ] 7 [ 1 ] [ 0 ] 17 [ 1 ] [ 0 ] 43 [ 1 ] [ 0 ] R [ 2 ] [ 0 ] Global Tamagawa number: 96 Global Tamagawa exponent: 12 lower height bound (egr points): 0.84317631672419664796432298771 bound on saturation index (egr points): 17 lower height bound (all points): 0.0058553910883624767219744651925 bound on saturation index (all points): 35 ====================================================== E = [0,0,1,-23737,960366] 8 points entered: [36:390:1] (height 4.9361653636229264429376338091) [-87:1538:1] (height 5.350421534561939113440960756) [181:1610:1] (height 5.3726790325808126194074889629) [-159:845:1] (height 5.51138405123110174136087036) [-29:1274:1] (height 5.186753578413399282082532573) [-11005:192282:125] (height 8.5719034126843733282338758998) [-3021:40175:27] (height 7.6074992975744923251011004698) [10532:78629:64] (height 8.0608521192641240532924901594) Regulator of input points: 260586.99720495370890427160378 Subgroup of EGR points has index 2 Images of points in component groups at bad primes and R p Group Image(s) 457532830151317 [ 1 ] [ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ] R [ 2 ] [ 1 ][ 1 ][ 0 ][ 1 ][ 1 ][ 1 ][ 1 ][ 0 ] Global Tamagawa number: 2 Global Tamagawa exponent: 2 lower height bound (egr points): 4.8453850861058816557151019275 bound on saturation index (egr points): 29 lower height bound (all points): 1.2113462715264704139287754819 bound on saturation index (all points): 3793 ====================================================== E = [0,1,0,-3532341,2671895459] 1 points entered: [-70530065697753731555722521380451694847027684946481619207066358883190994719487509574998052510855059423334984274230836976431876403642:200898144915891992877832706966832248880788948705776913304828657795482993310179952832361429299128720575547455788810135494156109029455:32383162777362251978562757665550366176161600539636371030636031896984923251479838151766462063041425141567992375986724367103348073] (height 200.11614623735196412520764022) Regulator of input points: 200.11614623735196412520764022 Subgroup of EGR points has index 2 Images of points in component groups at bad primes and R p Group Image(s) 2 [ 1 ] [ 0 ] 5 [ 1 ] [ 0 ] 7 [ 1 ] [ 0 ] 41 [ 2 2 ] [ 1 0 ] R [ 1 ] [ 0 ] Global Tamagawa number: 2 Global Tamagawa exponent: 2 lower height bound (egr points): 1.4668632445206274496218150367 bound on saturation index (egr points): 23 lower height bound (all points): 0.36671581113015686240545375916 bound on saturation index (all points): 23 ====================================================== E = [0,1,1,-9872,374262] 4 points entered: [57:0:1] (height 1.0498013827768001207241015434) [56:13:1] (height 1.934198495189080558266052584) [458:19:8] (height 2.7881011029218950258294536227) [36:-259:1] (height 3.5740919517758305527160893622) Regulator of input points: 13.995472891083440653774320287 Subgroup of EGR points has index 1 Images of points in component groups at bad primes and R p Group Image(s) 24191611 [ 1 ] [ 0 ][ 0 ][ 0 ][ 0 ] R [ 1 ] [ 0 ][ 0 ][ 0 ][ 0 ] Global Tamagawa number: 1 Global Tamagawa exponent: 1 lower height bound (egr points): 0.025163911436707098565305010427 bound on saturation index (egr points): 11816 lower height bound (all points): 0.025163911436707098565305010427 bound on saturation index (all points): 11816 ====================================================== E = [0,1,0,-19357973048906456166239827272707359553313344,21187731957757821187375878909257489490487412099497964528006317056] 12 points entered: [11376724821019368394185473144824:531128848935479591898724774494856605576120:2212245127] (height 20.72495827880642588356819094) [7623939119367566734712416:221638196641185505905607878680125440:6859] (height 22.408810521229377300789725156) [36426251939262077044010523050021856:1440660184888000534262415597113906110443804160:7723644690663] (height 28.213818287160612389821916159) [-2374492566122734660340122:529890342210233698629090661148812455:2744] (height 25.262656286423319502646655345) [133315763430614733564506995979036000:12052050702684033030644774922369112945461998208:13452404189687] (height 26.065344483854759949872060941) [-736456133932085217609486905120:65252742580786613608001616883511206150656:281011375] (height 18.549337908829374081613273099) [-595772851387421768949418976:167161309967794524103557005329392387840:912673] (height 27.346838711032488668750614154) [6022489089748785062867974730217810:556978335673856277257836463329999151388906387:588059226152] (height 31.238508420371796120945604319) [-14469357974751181338226317055916720:4882855888975145618903473912921126613023223376:27655941287521] (height 27.922856002931459820899095934) [401117760561576371833764564008128488352:9772673504421360502054799343252140728954874846976:98542628343088957] (height 28.927471674017823708763203918) [289759090016726210750821602762394720:4585180501130133566892803635614473034268791168:75274392943567] (height 26.081232007993861502562570226) [147460739409404501162213937304:6903716310575347660155145984848699291480:143055667] (height 28.763360826153868438542566456) Regulator of input points: 165496855732751.12575169679605 Subgroup of EGR points has index 12582912 Images of points in component groups at bad primes and R p Group Image(s) 2 [ 16 ] [ 1 ][ 8 ][ 7 ][ 0 ][ -5 ][ 7 ][ -6 ][ 0 ][ -2 ][ -6 ][ 5 ][ 1 ] 3 [ 12 ] [ -5 ][ 4 ][ 0 ][ -5 ][ 1 ][ 3 ][ -5 ][ 0 ][ -4 ][ 3 ][ 3 ][ -2 ] 7 [ 4 ] [ 2 ][ 2 ][ 0 ][ 0 ][ 1 ][ 2 ][ 2 ][ 2 ][ 1 ][ 0 ][ 0 ][ 1 ] 13 [ 4 ] [ 2 ][ 2 ][ 1 ][ 1 ][ 1 ][ 0 ][ 0 ][ 1 ][ 0 ][ 2 ][ 2 ][ 2 ] 29 [ 2 ] [ 1 ][ 0 ][ 1 ][ 1 ][ 0 ][ 0 ][ 1 ][ 1 ][ 0 ][ 1 ][ 1 ][ 0 ] 31 [ 4 ] [ 1 ][ 1 ][ 1 ][ 0 ][ 1 ][ 2 ][ 0 ][ 1 ][ 2 ][ 1 ][ 2 ][ 1 ] 43 [ 2 ] [ 1 ][ 0 ][ 0 ][ 0 ][ 1 ][ 0 ][ 0 ][ 1 ][ 1 ][ 1 ][ 1 ][ 1 ] 73 [ 2 ] [ 0 ][ 1 ][ 1 ][ 1 ][ 1 ][ 1 ][ 1 ][ 0 ][ 1 ][ 1 ][ 0 ][ 0 ] 79 [ 4 ] [ 1 ][ 0 ][ 1 ][ 1 ][ 1 ][ 1 ][ 1 ][ 1 ][ 1 ][ 1 ][ 0 ][ 1 ] 83 [ 2 ] [ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ] 89 [ 2 ] [ 0 ][ 1 ][ 1 ][ 1 ][ 0 ][ 0 ][ 0 ][ 1 ][ 0 ][ 1 ][ 0 ][ 1 ] 151 [ 2 ] [ 0 ][ 0 ][ 1 ][ 1 ][ 1 ][ 1 ][ 1 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ] 199 [ 2 ] [ 1 ][ 0 ][ 1 ][ 1 ][ 0 ][ 1 ][ 1 ][ 0 ][ 0 ][ 0 ][ 1 ][ 1 ] 239 [ 4 ] [ 0 ][ 2 ][ 1 ][ 0 ][ 1 ][ 2 ][ 0 ][ 0 ][ 1 ][ 1 ][ 0 ][ 1 ] 263 [ 4 ] [ 0 ][ 0 ][ 2 ][ 2 ][ 1 ][ 1 ][ 2 ][ 1 ][ 0 ][ 1 ][ 2 ][ 0 ] 601 [ 4 ] [ 2 ][ 1 ][ 1 ][ 1 ][ 1 ][ 1 ][ 1 ][ 2 ][ 2 ][ 1 ][ 2 ][ 1 ] 617 [ 2 ] [ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 1 ][ 0 ][ 0 ][ 1 ][ 0 ][ 1 ][ 0 ] 1433 [ 2 ] [ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ][ 0 ] 3449 [ 2 ] [ 1 ][ 0 ][ 1 ][ 0 ][ 1 ][ 0 ][ 0 ][ 0 ][ 1 ][ 1 ][ 0 ][ 1 ] 6199 [ 2 ] [ 1 ][ 1 ][ 0 ][ 0 ][ 0 ][ 1 ][ 0 ][ 1 ][ 0 ][ 0 ][ 1 ][ 0 ] 1607849 [ 2 ] [ 1 ][ 0 ][ 0 ][ 0 ][ 1 ][ 0 ][ 0 ][ 1 ][ 1 ][ 1 ][ 1 ][ 0 ] R [ 2 ] [ 0 ][ 1 ][ 0 ][ 1 ][ 0 ][ 1 ][ 1 ][ 0 ][ 1 ][ 0 ][ 0 ][ 1 ] Global Tamagawa number: 25769803776 Global Tamagawa exponent: 48 lower height bound (egr points): 49.659667113944377632502217479 bound on saturation index (egr points): 3621299 lower height bound (all points): 0.02155367496264946945855130967 bound on saturation index (all points): 43050497269923094561 eclib-20250122/tests/out_ntl/tversion.out000066400000000000000000000006641474421343600202750ustar00rootroot00000000000000This eclib version is 20250122 [ year month day ] = [ 2025 1 22 ] Configure options and compilation date: eclib version 20250122, using NTL bigints and NTL real and complex multiprecision floating point Testing comparison of version date and various (year, month, day) date triples: Date 20200101 is before the version date 20250122 Date 20300611 is after the version date 20250122 Date 20210317 is before the version date 20250122 eclib-20250122/tests/out_ntl/twist.out000066400000000000000000000030101474421343600175620ustar00rootroot00000000000000 Curve is: [1,-1,0,4,3] (reduced minimal model) b2 = -3 b4 = 8 b6 = 12 b8 = -25 c4 = -183 c6 = -3429 disc = -10351 (bad primes: [ 11 941 ]; # real components = 1) #torsion not yet computed Conductor = 10351 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 11 1 1 1 I1 1 1 941 1 1 1 I1 1 1 Enter a twist value: (0 to set a new `original' curve, 1 to twist original, or any other integer to twist immediately preceding output) E * 10 is: [0,0,0,6100,254000] (reduced minimal model) b2 = 0 b4 = 12200 b6 = 1016000 b8 = -37210000 c4 = -292800 c6 = -219456000 disc = -42397696000000 (bad primes: [ 2 5 11 941 ]; # real components = 1) #torsion not yet computed Conductor = 16561600 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 2 18 6 0 I*8 4 1 5 6 2 0 I*0 1 1 11 1 1 1 I1 1 -1 941 1 1 1 I1 1 -1 Enter a twist value: (0 to set a new `original' curve, 1 to twist original, or any other integer to twist immediately preceding output) E * 10 is: [1,-1,0,4,3] (reduced minimal model) b2 = -3 b4 = 8 b6 = 12 b8 = -25 c4 = -183 c6 = -3429 disc = -10351 (bad primes: [ 11 941 ]; # real components = 1) #torsion not yet computed Conductor = 10351 Global Root Number = -1 Reduction type at bad primes: p ord(d) ord(N) ord(j) Kodaira c_p root_number 11 1 1 1 I1 1 1 941 1 1 1 I1 1 1 Enter a twist value: (0 to set a new `original' curve, 1 to twist original, or any other integer to twist immediately preceding output) eclib-20250122/tests/out_ntl/vectest1.out000066400000000000000000000015731474421343600201620ustar00rootroot00000000000000Test run of vector package. iota(10) = [1,2,3,4,5,6,7,8,9,10] Enter n : Uninitialized new vec v = [] Copy of v = [] Initialized new vec v = [0] Copy of v = [0] Enter new entries of v: Now v = [1] w = [0,0,0] After w=v, Now v = [1] Now w = [1] w==v: 1 w!=v: 0 Enter i : After w*=2, w = [2] 3*v = [3] Now v = [1] v+w = [3] Now v = [1] v-w = [-1] Now v = [1] v*w = 2 Now v = [1] w/2 = [1] Now w = [2] -v = [-1] +v = [1] +w = [2] v = [1]; w = [2] Elements of v: v[1] = 1 Member test: Enter a test number: 1 IS a member of v. Subscript test Enter length of subscript vec:Enter subscript vector:The sub-vector is [1] Change one entry of v. Index?New entry?New entry: v[1] = 1 Now v = [1] Initial slice; length? Slice = [1] Now v = [1] General slice; beginning, end? Slice = [1] Now v = [1] w = [2]; content(w) = 2 After makeprimitive(w), w = [1] u = [0] After swapvec(u,v): u = [1] v = [0] eclib-20250122/tests/out_ntl/vectest2.out000066400000000000000000000015731474421343600201630ustar00rootroot00000000000000Test run of vector package. iota(10) = [1,2,3,4,5,6,7,8,9,10] Enter n : Uninitialized new vec v = [] Copy of v = [] Initialized new vec v = [0] Copy of v = [0] Enter new entries of v: Now v = [1] w = [0,0,0] After w=v, Now v = [1] Now w = [1] w==v: 1 w!=v: 0 Enter i : After w*=2, w = [2] 3*v = [3] Now v = [1] v+w = [3] Now v = [1] v-w = [-1] Now v = [1] v*w = 2 Now v = [1] w/2 = [1] Now w = [2] -v = [-1] +v = [1] +w = [2] v = [1]; w = [2] Elements of v: v[1] = 1 Member test: Enter a test number: 1 IS a member of v. Subscript test Enter length of subscript vec:Enter subscript vector:The sub-vector is [1] Change one entry of v. Index?New entry?New entry: v[1] = 1 Now v = [1] Initial slice; length? Slice = [1] Now v = [1] General slice; beginning, end? Slice = [1] Now v = [1] w = [2]; content(w) = 2 After makeprimitive(w), w = [1] u = [0] After swapvec(u,v): u = [1] v = [0] eclib-20250122/tests/out_ntl/vectest3.out000066400000000000000000000015731474421343600201640ustar00rootroot00000000000000Test run of vector package. iota(10) = [1,2,3,4,5,6,7,8,9,10] Enter n : Uninitialized new vec v = [] Copy of v = [] Initialized new vec v = [0] Copy of v = [0] Enter new entries of v: Now v = [1] w = [0,0,0] After w=v, Now v = [1] Now w = [1] w==v: 1 w!=v: 0 Enter i : After w*=2, w = [2] 3*v = [3] Now v = [1] v+w = [3] Now v = [1] v-w = [-1] Now v = [1] v*w = 2 Now v = [1] w/2 = [1] Now w = [2] -v = [-1] +v = [1] +w = [2] v = [1]; w = [2] Elements of v: v[1] = 1 Member test: Enter a test number: 1 IS a member of v. Subscript test Enter length of subscript vec:Enter subscript vector:The sub-vector is [1] Change one entry of v. Index?New entry?New entry: v[1] = 1 Now v = [1] Initial slice; length? Slice = [1] Now v = [1] General slice; beginning, end? Slice = [1] Now v = [1] w = [2]; content(w) = 2 After makeprimitive(w), w = [1] u = [0] After swapvec(u,v): u = [1] v = [0] eclib-20250122/tests/ptest.cc000066400000000000000000000073571474421343600156630ustar00rootroot00000000000000// ptest.cc -- test program for arith functions ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #include int main() { long n, p; cout<<"Initialized table of " << nprimes() << " primes, up to "<> n; p=prime_number(n); cout << "prime_number("<)? "; cin >> n; vector plist=primes(n); cout << plist << endl; cout<<"Enter a number to see if it is that list: "; cin>>p; auto pi=find(plist.begin(),plist.end(),p); if(pi==plist.end()) cout<<"NOT in the list"< v(10); iota(v.begin(),v.end(),1); cout<<"iota(10): "<> n; for(primevar pr(n); pr.ok(); pr++) cout << "Prime number " << pr.index() << " = " << pr << endl; long m; while (cout << "\nEnter an integer m (0 to stop): ", cin >> m, m!=0) { cout << "Smallest prime factor of " << m << " is " << primdiv(m) << endl; plist=pdivs(m); cout << "m has " << plist.size() << " prime divisors: " << plist << endl; cout << "with exponents: "; for( const auto& pri : plist) cout << pri <<":"< dlist=alldivs(m,plist); cout << "m has " << dlist.size() << " divisors: " << dlist << endl; dlist = posdivs(m,plist); cout << "m has " << dlist.size() << " positive divisors: " << dlist << endl; dlist = sqdivs(m,plist); cout << "m has " << dlist.size() << " positive divisors whose square divides m: " << dlist << endl; dlist = sqfreedivs(m,plist); cout << "m has " << dlist.size() << " positive square-free divisors: " << dlist << endl; } long a,b; int cont=1; while(cont) { cout<<"Enter integers a b (0 0 to stop): "; cin>>a>>b; long g=gcd(a,b); if(g==0) cont=0; else { cout<<"gcd = "<>ws; if(cin.eof()) {cout<> n; cin >> d; q=rational(n,d); cout << "q = " << q << " has denominator " << den(q) << \ " and numerator " << num(q) << "\n"; } cout << "Enter a rational (either n or n/d): "; cin>>q; cout << "q = " << q << " has denominator " << den(q) << \ " and numerator " << num(q) << "\n"; cout<<"floor(q) = "<>q1>>q2>>q3; cout << "q1 = " << q1 << "\t"; cout << "q2 = " << q2 << "\t"; cout << "q3 = " << q3 << "\n"; cout << "Enter three rationals in the format [q1:q2:q3]: "; char c; cin>>c>>q1>>c>>q2>>c>>q3>>c; cout << "[q1:q2:q3] = [" << q1 << ":"; cout << q2 << ":"; cout << q3 << "]\n"; } eclib-20250122/tests/smattest.cc000066400000000000000000000377701474421343600163720ustar00rootroot00000000000000// smattest.cc: test of sparse matrix package ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // Original version by Luiz Figueiredo #include #include float ran0( long& idum ); float ran0( int& idum ); #include const scalar modulus(PRIME30); // 1073741789 = max p s.t. p < 2^30 long starttime,stoptime; void random_fill_in( smat& sm, int max, scalar seed ) { int *intpos = new int [sm.nco]; scalar *scalarval = new scalar [sm.nco]; for( int r = 0; r < sm.nro; r++ ) { int *lp = intpos; scalar *lv =scalarval; for( int i = 0; i < sm.nco; i++ ) { *lp++ = 0; *lv++ = 0; } int count = 0; int N = int( (max+1) * ran0( seed ) ); //number of entries in row i if( N == (max+1) ) N--; // could occur ! for( int s = 0; s < N; s++ ) { int v = int( 20 * ran0( seed ) ) - 10; // value between -10 & 9 if( v != 0 ) { int p = int( sm.nco * ran0( seed ) ); //position in matrix if( p == sm.nco ) p--; if( intpos[ p ] == 0 ) count++; intpos[ p ] = 1; scalarval[ p ] = v; } } delete[] sm.col[r]; delete[] sm.val[r]; int *ptr = sm.col[r] = new int [ count + 1 ]; scalar *vptr = sm.val[r] = new scalar [ count ]; *ptr++ = count; for( int l = 0; l < sm.nco; l++ ) { if( intpos[l] != 0 ) { *ptr++ = l+1; *vptr++ = scalarval[ l ]; } } } delete[] intpos; delete[] scalarval; } int main(void) { cout << "enter 0 to exit\n"; cout << "enter 1 to do all tests \n"; cout << "enter 2 to operations \n"; cout << "enter 3 to special speed test \n" << "enter> "< "< "< "< "<> t; while( t != 0 ) { if( t == 1 ) { int nr, nc; cout << "Test run of sparse matrix package.\n\n"; cout << "enter # of rows:\n"; cin >> nr; cout << "enter # of colums:\n"; cin >> nc; smat sm(nr,nc); cout << "Unitialized new smat sm = " << sm << endl; cout << "Enter any number "; cin >> i; //******** test of constructor from matrix *************** //mat a; int r; cout << "Enter size of a square matrix A: "; cin >> r; mat a(r,r); cout << "Enter entries of A: "; cin >> a; cout << "A = " << a; smat sm1(a); cout << "smat from matrix A = " << endl << sm1 << endl; cout << "Enter any number "; cin >> i; //******* test of copy constructor ******************* smat sm2 = sm1; cout << "Copy of smat = " << endl << sm2 << endl; cout << "Enter any number "; cin >> i; //******** test of assignment ************** smat sm3; sm3 = sm1; cout << "Copy using assignment= " << endl << sm3 << endl; cout << "Enter any number "; cin >> i; //********* testing function as_matrix ***** cout << "enter number of rows of smat for conversion " << endl; int numRow; cin >> numRow; cout << "Now enter number of columns" << endl; int numCol; cin >> numCol; smat T( numRow, numCol ); // cout << " Now enter smat for conversion" << endl; // cout << " for each row, enter first value then position for each of the entries" << endl; // cout << " for each row terminate input by typing zero as a value." << endl; // cin >> T; int max=10, seed = 10; random_fill_in( T, max, seed ); cout << endl << "smat = " << endl << T; cout << "smat as a matrix = "<< endl << T.as_mat( ) << endl; cout << "Enter any number "; cin >> i; //********* testing ref to (i,j) entry ********** cout << "Enter position: (row,col)"; int j,k; cin >> j; cin >> k; cout << "T(" << j <<" , " << k << ") = " << T.elem(j,k) <> i; cout << "number of non-zero elements ?" << endl; cin >> d; int n = d; int *pos = new int [d+1]; scalar *val = new scalar [d]; cout << "values ? " << endl; while( n-- ) cin >> *val++; cout << " positions ? " << endl; for (int ii=0; ii> *pos++; pos -= d; val -= d; T.set_row(i, d, pos, val); cout << " new matrix : " << endl; cout << T << endl; delete[] pos; delete[] val; } //*********testing operations *********** if( t == 1 || t == 2 ) { cout << "testing operations " << endl; int row,col; cout << "Enter size of smat A row,col: "<< endl; cin >> row >> col; smat A( row, col ); random_fill_in( A, 10, 10 ); // cout << "Enter entries of A: "<< endl; // cin >> A; cout << "Enter size of smat B: row,col: "<< endl; cin >> row >> col; smat B( row, col ); random_fill_in( B, 10, 10 ); // cout << "Enter entries of B: "<< endl; // cin >> B; cout << "matrix A" << endl << A << endl; cout << "matrix B" << endl << B << endl; cout << "Enter any number "; cin >> i; smat C = A; cout << "C = A = " << endl << C; cout << "Enter any number "; cin >> i; cout << "B==A?" << (B==A) << endl; cout << "B!=A?" << (B!=A) << endl; cout << "C==A?" << (C==A) << endl; cout << "C!=A?" << (C!=A) << endl; cout << "Enter any number "; cin >> i; B+=A; cout << "after B+=A, A = " << endl << A <> i; B-=A; cout << "after B-=A, A = " << A <> i; B*=2; cout << "after B*=2, B = " << B << endl; cout << "Enter any number "; cin >> i; B/=2; cout << "after B/=2, B = " << B << endl; cout << "Enter any number "; cin >> i; cout << "A+B=" << (A+B) << endl; cout << "Now A = " << A << "and B = " << B << endl; cout << "Enter any number "; cin >> i; cout << "A-B=" << (A-B) << endl; cout << "Now A = " << A << "and B = " << B; cout << "test addition of scalar to smat" << endl; B = A; scalar sc = 17; B += sc; cout<<"After adding 17 to A it is now:\n"<> row >> col; smat sm(row,col); random_fill_in( sm, 10, 10 ); // cin >> sm; cout << " now enter matrix: first row, col and then the entries"<> row >> col; mat m(row, col); cin >> m; mat sm_as_m = sm.as_mat(); cout << "the smat is (as a matrix) \n"<> row1 >> col1; smat sm1(row1,col1); cout << "now enter first smat;" << endl; cin >> sm1; cout << "enter dimension second smat;" << endl; cin >> row2 >> col2; smat sm2(row2, col2); cin >> sm2; cout << " the product is: " << endl; cout << sm1*sm2 << endl; } if ( t == 3 ) { int row,col; cout << "enter size of matrices for speed test (row,col) " << endl; cin >> row; cin >> col; mat m1( row,col); mat m2( row,col); mat m3(row,col); mat m(row,col); for( int r=1; r<=row; r++ ) { for( int c = 1; c<=5 && r+c < col; c++ ) { m1.set( r, r+c,1 ); m2.set( r, r+c-1, 2 ); m3.set( r, r+c+1, -1 ); } } smat sm1(m1); smat sm2 (m2); smat sm3 (m3); smat sm(row,col); cout << "want to see matrices ? "; int see; cin >> see; if( see ) { cout << "sm1 = " << sm1 << endl; cout << "sm2 = " << sm2 << endl; cout << "sm3 = " << sm3 << endl; } cout << "Loop how many times ?" << endl; int j, loop; cin >> loop; starttime = clock(); for(j = 0; j < loop; j++) { m += m1; m -= 2*m2; m += 3*m3; if(see>1) cout<1) cout<> nro; cin >> nc; smat sm(nro,nc); cout << "enter matrix as an smat" << endl; int max=10, seed = 10; random_fill_in( sm, max, seed ); // cin >> sm; cout << "display matrices? ( 0 = no; 1 = yes )" << endl; int flag, flag2; cin >> flag; cout << "display fill-in information?" << endl; cin >> flag2; if( flag ) cout << "matrix A is " << sm << endl; smat_elim A (sm, modulus ); if( flag2 ) { cout << "initial population: "; display_population(A); } A.step0(); cout << "after step0 " << endl; cout << "# of rows eliminated so far: " << A.get_rank( ) << endl; if( flag ) cout << " matrix: " << A << endl; if( flag2 ) display_population( A ); A.step1(); cout << "after step1" << endl; cout << "# of rows eliminated so far: " << A.get_rank( ) << endl; if( flag ) cout << " matrix: " << A << endl; if( flag2 ) display_population( A ); A.step2(); cout << "after step2" << endl; cout << "# of rows eliminated so far: " << A.get_rank( ) << endl; if( flag ) cout << " matrix: " << A << endl; if( flag2 ) display_population( A ); A.step3(); cout << "after step3" << endl; cout << "# of rows eliminated so far: " << A.get_rank( ) << endl; if( flag ) cout << " matrix: " << A << endl; if( flag2 ) display_population( A ); A.step4(); cout << "after step4" << endl; cout << "# of rows eliminated so far: " << A.get_rank( ) << endl; if( flag ) cout << " matrix: " << A << endl; if( flag2 ) display_population( A ); A.standard( ); cout << "after standard " << endl; cout << "rank of matrix: " << A.get_rank( ) << endl; if( flag ) cout << " matrix: " << A << endl; if( flag2 ) display_population( A ); } if( t == 5 ) { cout << "test of kernel function" << endl; cout << "enter size of matrix for elimination (row,col) "<< endl; int nro,nco; cin >> nro; cin >> nco; smat sm(nro,nco); int rand; cout << "Do you want to input the matrix for elimination or do you want\n"; cout << "a matrix with random entries? (1 for random and zero otherwise\n"; cin >> rand; int flag; cout << "want to determine the rank using matrix? (1 = yes; 0 = no )"; cin >> flag; if( rand ) { cout << "How many maximum number of non-zero entries per row?\n"; int max, seed; cin >> max; cout << "enter seed for random number generator\n"; cin >> seed; cout << "calculating matrix,\n"; random_fill_in( sm, max, seed ); cout << "done\n"; } else { cout << "enter matrix as an smat" << endl; cin >> sm; } smat_elim A( sm, modulus ); vec_i pc, npc; if( flag ) { long rk, ny; scalar pr = modulus; mat m = sm.as_mat (); mat ker_mat = echmodp( m, pc, npc, rk, ny, pr); cout << " rank using echmodp : " << rk; int pop = population(ker_mat); cout << " number of non-zero entries: " << pop << endl; } /********A.step0 (); cout << "step0 : A * ker_mat is : "; if( (A*ker_mat) == smat(nro)) cout << "0"; else cout << "problem in step0!!!"; A.step1 (); cout << "step1 : A * ker_mat is : "; if( (A*ker_mat) == smat(nro)) cout << "0"; else cout << "problem in step1!!!"; A.step2(); cout << "step2 : A * ker_mat is : "; if( (A*ker_mat) == smat(nro)) cout << "0"; else cout << "problem in step2!!!"; A.step3 (); cout << "step3 : A * ker_mat is : "; if( (A*ker_mat) == smat(nro)) cout << "0"; else cout << "problem in step3!!!"; A.step4 (); cout << "step4 : A * ker_mat is : "; if( (A*ker_mat) == smat(nro)) cout << "0"; else cout << "problem in step4!!!"; A.standard(); cout << "standard : A * ker_mat is : "; if( (A*ker_mat) == smat(nro)) cout << "0"; else cout << "problem in standard!!!";*****/ smat kern = A.kernel(pc,npc); cout << "rank is:" << dim( pc ) << endl; display_population(kern); // smat_elim A2( sm, modulus ); // smat oldkern = A2.old_kernel(pc, npc); // cerr << "old version "; // cout << "rank is:" << dim( pc ) << endl; // display_population(oldkern); // cerr << "old kernel basis:\n" << oldkern.as_mat() <> row; smat A( row, row ); cout << "Enter entries of A: "<< endl; cin >> A; cout << "A = \n"<> lambda; cout<<"lambda = "<> t; } cout< #include int main() { cout << "\nSubspace package test program\n\n"; int times,ntimes,r=0; while (cout << "Enter size of square matrix M: ", cin >> r, r>0 ) { mat m(r,r); cout << "Enter entries of M: "; cin >> m; cout << " M = " << m; cout << "Trace(M) = " << m.trace() << endl; /* int i; mat mpower=m; for (i=2; i<=r; i++) {mpower=mpower*m; cout << "m^" << i << " = " << mpower; cout << "Trace(m^" << i << ") = " << mpower.trace() << endl; } { vector cp = m.charpoly(); cout << "char. poly. of m has coefficients " << cp << endl; } cout << "det(M) = " << m.determinant() << endl; cout << "rank(M) = " << m.rank() << endl; cout << "nullity(M) = " << m.nullity() << endl; */ cout << endl << "Enter number of times to repeat kernel tests: "; cin >> ntimes; { times=ntimes; subspace ker; while(times--) ker = kernel(m); mat kerbasis = basis(ker); cout << "kernel(m) has basis\n" << kerbasis; vec_i kerpivs = pivots(ker); cout << "pivots: " << kerpivs << "\n"; int kerdenom = denom(ker); cout << "denom: " << kerdenom << "\n"; } cout << "Now compute kernel mod p, p = " << DEFAULT_MODULUS << endl; { times=ntimes; subspace ker; while(times--) ker = pkernel(m,DEFAULT_MODULUS); mat kerbasis = basis(ker); cout << "kernel(m) has basis\n" << kerbasis; vec_i kerpivs = pivots(ker); cout << "pivots: " << kerpivs << "\n"; times=ntimes; subspace oldker; while(times--) oldker = oldpkernel(m,DEFAULT_MODULUS); if((kerbasis!=basis(oldker))||(kerpivs!=pivots(oldker))) { cout << "!!! Differs from old version !!!" << endl; cout << "Old basis = \n"<> lambda; subspace elambda = eigenspace(m,lambda); cout << "eigenspace for lambda has basis\n" << basis(elambda); cout << "with dimension " << dim(elambda) << endl; } */ } cout< #include int main(void) { cout << "Test run of sparse vector package.\n\n"; int i,j,n,a; cout << "Enter n : "; cin >> n; svec v; cout << "Uninitialized new vec v = " << v << endl; svec v2(v); cout << "Copy of v = " << v2 << endl; cout << "Enter new entries of v: "; cout << "Dimension = "; cin>>n; v=svec(n); cout << "Number of entries = "; cin>>n; for(i=1; i<=n; i++) { cout<<"Position: "; cin>>j; cout<<"Entry: "; cin>>a; v.set(j,a); } cout << "Now v = " << v << endl; svec w(3); cout << "w = " << w << endl; w = v; cout << "After w=v, " << endl; cout << "Now v = " << v << endl; cout << "Now w = " << w << endl; cout << "w==v: " << (w==v) << endl; cout << "w!=v: " << (w!=v) << endl; cout << "v+w = " << v+w << endl; cout << "v-w = " << v-w << endl; cout << "Enter i : "; cin >> i; w*=2; cout << "After w*=2, w = " << w << endl; cout << "3*v = " << (3*v) << endl; cout << "Now v = " << v << endl; cout << "v+w = " << v+w << endl; cout << "Now v = " << v << endl; cout << "v-w = " << v-w << endl; cout << "Now v = " << v << endl; cout << "w/2 = " << w/2 << endl; cout << "Now w = " << w << endl; cout << "-v = " << -v << endl; cout << "+v = " << +v << endl; cout << "+w = " << +w << endl; cout << "2*v-w = " << (2*v-w) << endl; cout << "Resetting w[1] to 99: "; w.set(1,99); cout << "w = " << w << endl; w -= 2*v; cout << "After w-=2*v, w = " << w << endl; vec vv = v.as_vec(); cout << "v as an ordinary vector = "<> i; cout << i; if (member(i,v)) cout << " IS "; else cout << " IS NOT "; cout << "a member of v." << endl; cout << "Subscript test\n"; cout << "Enter length of subscript vec:"; int m; cin >> m; vec index=vec(m); cout << "Enter subscript vector:"; cin >> index; vec vv = v[index]; cout << "The sub-vector is " << vv << endl; cout << "Change one entry of v. Index?"; cin >> i; cout << "New entry?"; scalar x; cin >> x; v[i]=x; cout << "New entry: v[" << i << "] = " << v[i] << endl; cout << "Now v = " << v << endl; cout << "Initial slice; length? "; cin >> j; cout << "Slice = " << v.slice(j) << endl; cout << "Now v = " << v << endl; cout << "General slice; beginning, end? "; cin >> j >> k; cout << "Slice = " << v.slice(j,k) << endl; cout << "Now v = " << v << endl; cout << "w = " << w << "; content(w) = " << content(w) << endl; makeprimitive(w); cout << "After makeprimitive(w), w = " << w << endl; vec u(n); cout << "u = "<< u << endl; swapvec(u,v); cout << "After swapvec(u,v):\nu = " << u << "\nv = " << v << endl; #endif } eclib-20250122/tests/tate.cc000066400000000000000000000027131474421343600154500ustar00rootroot00000000000000// tate.cc: program to call Tate's algorithm and display curve details ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #include void line(int w) {int wid=w; while(wid--)cout << "-";cout< ai(5); while (getcurve(ai,verb)) { Curvedata D(ai,v); cout<<"Integral model: "<<(Curve)D< #include using namespace std; int main() { cout.precision(15); double x; int debug=0; // cout << "Debug? "; cin>>debug; while(cout<<"Enter x: ", cin>>x, x!=0.0) { cout << "x = " << x; cout << "\tK0(x) = " << kbessel(0,x,debug) << flush; cout << "\tK1(x) = " << kbessel(1,x,debug) << endl; } } eclib-20250122/tests/tcon2.cc000066400000000000000000000025301474421343600155350ustar00rootroot00000000000000//tcon2.cc: conic test program ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #include #include #define VERBOSITY 0 #ifndef CONIC_METHOD #define CONIC_METHOD 4 #endif //#define TEST_PARAM int main() { initprimes("PRIMES",VERBOSITY); bigint a,b,c,d,x0,y0,z0; cin >> a >> b >> c >> d; int res = solve_conic(a,b,c,d,x0,y0,z0,CONIC_METHOD); if(!res) {x0=y0=z0=0;} cout< int main(void) { set_precision(30); initprimes("PRIMES",0); //the_primes.init(25000000); Curve E; cout << "\nEnter a curve: " << endl ; cin>>ws; if(cin.eof()) {cout<> E ; cout << "The curve is " << E << endl ; /* cout << "\nEnter a curve: " << endl ; E.input(cin); cout << "The curve is " << E << endl ; cout << "To test out different constructors: Using all specified:\n" ; E = Curve(0,0,1,-7,6) ; cout << "the curve is " << E << "\n" ; cout << "Using just a4 and a6 specified:\n" ; E = Curve(78, 89) ; cout << "the curve is " << E << "\n" ; E = Curve(0, 0, 1, -7, 6); cout << "the curve is " << E << "\n" ; */ cout << "A test of invariants:\n" ; Curvedata cd(E,0) ; // the 0 means no minimalization cout << "The curve is " << cd << endl ; cd = Curvedata(E,1) ; // the 1 forces minimalization cout << "The minimal curve is "; cout << cd; cout << endl ; /* cout << "A test of extended invariants:\n" ; CurvedataExtra cdx(cd) ; cout << "The extra curve data is "; cout << cdx; cout << endl ; */ cout <<"A test of Tate's algorithm:\n"; CurveRed cdr(cd); cout << cdr << endl; cout <<"Full display:\n"; cdr.display(cout); cout <<"Traces of Frobenius:\n"; for(primevar pr(25); pr.ok(); pr++) { long p = pr; bigint ap = Trace_Frob(cdr,bigint(p)); cout<<"p="< qai; qai.push_back(qa1); qai.push_back(qa2); qai.push_back(qa3); qai.push_back(qa4); qai.push_back(qa6); Curvedata Es(qai,scale); cout<<"Constructed curve is "<<(Curve)Es<<" with scale = "< #include #include #include int main() { initprimes("PRIMES",0); Curve E(0,0,1,-7,6); Curvedata C(E, 0); cout << "Curve " << E << endl; int i; cout << "\nDivision polynomials:\n\n"; for(i=2; i<12; i+=1) cout<<"Division Poly ("< Plist = {P0, P1, P2, P0+P1, P0+P2, P1+P2, P0+P1+P2}; for ( const auto& P : Plist) { cout << "\nP = " << P << endl; for ( auto m : {2,3,5,7,11,13}) { Point Q = m*P; vector newP = Q.division_points(m); cout << m << "*P = " << Q << ", divided by " << m << " gives back "; if (newP.size()==1 && newP[0]==P) { cout << "P, OK" << endl; } else { cout << newP << "???" << endl; } } } #endif } //end of file tdivpol.cc eclib-20250122/tests/tegr.cc000066400000000000000000000044341474421343600154560ustar00rootroot00000000000000// tegr.cc -- test for finding egr subgroup from a set of points ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // #include #include #include #include #include #include #include #include #include #include int main() { // set_precision("Enter precision in bits"); initprimes("PRIMES",0); long N, nclass, ncurve; Curve E; while(1) { cin >> N; if(N==0) exit(0); cin >> nclass >> ncurve; cin >> E; Curvedata C(E, 0); CurveRed CR(C); cout< Qlist = torsion_points(CD, per, m); cout<<"m-torsion points: "<0: Curve c(0,0,1,-7,6); Curvedata cd(c,1); cout << "Testing some points:\n"; Point P0(cd, bigint(0),bigint(2)) ; Point P1(cd, bigint(1),bigint(0)) ; Point P2(cd, bigint(2),bigint(0)) ; cout << "The points are P0 = " << P0 << ", P1 = " << P1 << ", and P2 = " << P2 << endl ; if (!P0.isvalid()) cout << "P0 is not on the curve!\n"; if (!P1.isvalid()) cout << "P1 is not on the curve!\n"; if (!P2.isvalid()) cout << "P2 is not on the curve!\n"; /* // a curve with rank 3 and D<0: Curve c(0,0,1,-1,6); Curvedata cd(c,1); cout << "Testing some points:\n"; Point P0(cd, bigint(0),bigint(2)) ; Point P1(cd, bigint(1),bigint(2)) ; Point P2(cd, bigint(12),bigint(41)) ; cout << "The points are P0 = " << P0 << ", P1 = " << P1 << ", and P2 = " << P2 << endl ; if (!P0.isvalid()) cout << "P0 is not on the curve!\n"; if (!P1.isvalid()) cout << "P1 is not on the curve!\n"; if (!P2.isvalid()) cout << "P2 is not on the curve!\n"; */ /* // a curve (7998K1) with rank 1 and 5-torsion: Curve c(1,0,0,5355560,7740216896); Curvedata cd(c,1); Point P0(cd, bigint(-248),bigint(80104)) ; cout << "The point is P0 = " << P0 << endl ; if (!P0.isvalid()) cout << "P0 is not on the curve!\n"; */ cout<<"Curve "< #include #define NEQPLIST 0 // Number of primes for equiv-test sieving vector eqplist; int getquartic(quartic& g, int verbose) { bigint a, b, c, d, e; if(verbose) cout << "Enter quartic coefficients a,b,c,d,e ?" << endl; char ch; cin>>ch; if(ch=='(') cin>>a>>ch>>b>>ch>>c>>ch>>d>>ch>>e>>ch; else { cin.putback(ch); cin >> a >> b >> c >> d >> e; } if (is_zero(a)&&is_zero(b)&&is_zero(c)&&is_zero(d)&&is_zero(e)) return 0; g=quartic(a,b,c,d,e); // will set its own invariants, roots and type g.set_equiv_code(eqplist); return 1; } int main() { initprimes("PRIMES",0); cout.precision(50); cin.flags( cin.flags() | ios::dec ); int verb; cout << "Verbose? "; cin >> verb; while (1) { long nq; cout << "How many quartics to check (0 to quit)? "; cin >> nq; cout< glist(nq); vector dlist; int i,j; for(i=0; i int main(){ #ifdef MPFP set_precision(350); #endif initprimes("PRIMES",1); Curve E; bigint u, r, s, t; while (cerr<<"Input a curve: ", cin>>E, !E.isnull()) { Curvedata C(E, 0); cout<<"Curve "<< E < badp = getbad_primes(C); Curvedata Emin = C.minimalize(u,r,s,t); int is_min = is_one(abs(u)); // then E was already minimal, no adjustments needed if(!is_min) { cout<<"Input curve is not minimal at "<> P, !(!cin)&& P.isvalid() ) { cout << "Point " << P; int ord = order(P); if(ord>0)cout<< " has order " << ord; else cout<< " has infinite order"; cout << endl; Point Pmin = (is_min? P: transform(P, &Emin, u, r, s, t)); cout << "Local heights:\n"; bigfloat gh = to_bigfloat(0); bigint d = gcd(Pmin.getZ(),Pmin.getX()); vector pdivsz=pdivs(d); for ( const auto& q : pdivsz) { cout << q << ":\t\t" << flush; bigfloat ph = pheight(Pmin,q); gh+=ph; cout << ph << endl; } cout << "Sum so far =\t" << gh << endl; bigfloat lxd = 2*log(I2bigfloat(d)); cout << "log(den(x(P))) = " << lxd << endl; for ( const auto& pr : badp) { if(div(pr,d)) continue; cout << pr << ":\t\t" << flush; bigfloat ph = pheight(Pmin,pr); gh+=ph; cout << ph << endl; } cout << "Sum so far =\t" << gh << endl; bigfloat rh = realheight(Pmin); cout << "R:\t\t" << rh << endl; gh += rh; cout << "\nSum of local heights: " << gh << endl; // // N.B. The call to height() calls realheight() and pheight() again, // since as height() was not called earlier, P's height field was // not set. // // N.B. Computing the global height automatically handles // the move to a minimal model, so height(P) and // height(Pmin) are the same cout<<"global height of "< pointlist(3); pointlist[0] = P0; pointlist[1] = P1; pointlist[2] = P2; //cout << "Making a PointArray out of P0, P1, P2. It is " << pointlist << endl; //cout << "Calling regulator" << endl; bigfloat reg = regulator(pointlist); //cout << "Back from calling regulator" << endl; cout << "The regulator of P0, P1, P2 is " << reg << endl; return 0; } // end main() eclib-20250122/tests/thilbert.cc000066400000000000000000000050071474421343600163270ustar00rootroot00000000000000// thilbert.cc: test of Hilbert symbol functions ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #include #include #include //#define AUTO int main() { bigint a,b,x0,y0,z0; int resp, res, checkres; bigint zero, one; zero=0; one=1; #ifdef AUTO long la,lb,abmax; cout<<"Enter max for a,b: "; cin>>abmax; for(la=-abmax; la<=abmax; la++) for(lb=-abmax; lb<=abmax; lb++) { a=la; b=lb; if(a*b==0) continue; #else while(1) { cout<<"Enter nonzero a and b: "; cin>>a>>b; if(a*b==zero) break; #endif res=checkres=0; cout<<"("< plist = vector_union(pdivs(a),pdivs(b)); for ( const auto& p : plist) { if(p==2) continue; resp=local_hilbert(a,b,p); cout << p << "\t" << resp << endl; res = res|resp; checkres = checkres^resp; } cout<<"\nGlobal symbol = " << res << endl; cout<<"Check (should be 0) = " << checkres << endl; bigint p; int gres = global_hilbert(a,b,plist,p); if(res==gres) cout<<"--agrees with single call to global_hilbert()\n"; else cout<<"--DISAGREES with single call to global_hilbert()\n"; quadratic q(a,zero,b); int oldres = !solve_conic(q,one,x0,y0,z0,4); if(oldres==res) { cout<<"--agrees with solve_conic()\n"; } else cout<<"--DISAGREES with solve_conic()\n"; } cout< #include #include #include #include #include // Primality testing task class class isprime { public: explicit isprime( unsigned int n ) : n_( n ), prime_( 1 ) {} isprime( unsigned int min, unsigned int max ) : min_( min ), max_( max ) {} ~isprime() {;} void operator()() { // Find square root unsigned int sr = sqrt( (double) n_ ); // Loop for( unsigned int i = 2; i <= sr; i++ ) { if( ( n_ % i ) == 0 ) { prime_ = 0; break; } } } unsigned int n() { return n_; } bool isPrime() { return prime_; } private: unsigned int n_; unsigned int min_; unsigned int max_; bool prime_; }; // Main function. // Creates tasks and posts to job queue int main( int argc, char **argv ) { // Variables (with default values) unsigned int N = 10000; // Number of tasks unsigned int nt = 1; // Number of threads unsigned int v = 0; // Verbosity std::vector< isprime* > tasks; // Array to hold tasks int count = 0; // Counter // Read in command line arguments if( argc > 1 ) N = atoi( argv[1] ); // Read in number of tasks if( argc > 2 ) nt = atoi( argv[2] ); // Read in number of threads // Initiate timer timer profile; // Start default timer profile.start(); #ifdef MULTITHREAD // Initiate threadpool/job queue with verbose output threadpool pool( nt, v ); #endif // Create tasks and add to array for later reference for( unsigned int i = 2; i < N; i++ ) { // Create a new task object isprime* task = new isprime( i ); // Add task to container so it can be accessed later tasks.push_back( task ); #ifdef MULTITHREAD // Add task to job queue pool.post< isprime >( *tasks.back() ); #else // Serial version task -> operator()(); #endif } #ifdef MULTITHREAD // Wait for all jobs to be complete pool.close(); #endif // Stop timer profile.stop(); // Print out results std::cout << "Primes up to " << N << std::endl; for (const auto& t : tasks) { if( t -> isPrime() ) { std::cout << std::setw(10) << t -> n() << " "; count++; if( (count % 10) == 0 ) std::cout << std::endl; } } std::cout << std::endl; // Print out run time std::cout << "Running with " << nt << " threads" << std::endl; std::cout << "There are " << count << " primes up to " << N << std::endl; if( v ) profile.show( 1 ); // Delete tasks for( auto it : tasks) delete it; exit( EXIT_SUCCESS ); } eclib-20250122/tests/thtconst.cc000066400000000000000000000116341474421343600163630ustar00rootroot00000000000000// THTCONST.CC: Test program for Silverman & CPS height bounds ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // #include // from qcurves library #include #include #include #include #include bigint a1,a2,a3,a4,a6; Curve C; Curvedata CD; vector plist; const double margin = 0.01; int getcurve(void) { // cout << "Enter curve coefficients a1,a2,a3,a4,a6: " << endl; cin >> C; // cout<> a1 >> a2 >> a3 >> a4 >> a6; // C = Curve(a1,a2,a3,a4,a6); CD = Curvedata(C,0); // "1" means minimise // cout<>n; vector b(n+1); b[0]=vec_m(n); for(int i=1; i<=n; i++) { b[0][i]=1; // these are the weights b[i]=vec_m(n); cout<<"Enter vector number "<<(i)<<": "; cin>>b[i]; } cout<<"Before reduction, vectors are:\n"; for(int i=1; i<=n; i++) cout<-2); i--) for(int j=1; ok&&(j>-2); j--) for(int k=1; ok&&(k>-2); k--) { if((i==0)&&(j==0)&&(k==0)) {ok=0;break;} vec_m v=bigint(i)*b[1]+bigint(j)*b[2]+bigint(k)*b[3]; bigint norm = sqr(v[1])+sqr(v[2])+sqr(v[3]); cout<<"("< #include #include #include // Basic platform detection #ifdef _WIN32 #include #define powernap(x) Sleep(x) #else #include #define powernap(x) usleep((x)*1000) #endif int main( int argc, char **argv ) { // Variables int numTimers = 1; std::string prefix = "timer"; std::vector< std::string > names; int verbose = 0; // Verbosity std::cout << "Verbose (0/1): "; std::cin >> verbose; // Introduction std::cout << "Program timing - demonstration and testing." << std::endl; // Read in number of subtimers std::cout << "How many subtimers? "; std::cin >> numTimers; // Initiate single timer object instance // Timings will be written to std::cout timer logbook; // OR: Write timings to a file. Pass a filename (string) // timer logbook( "times.dat" ); // A default timer is automatically setup std::cout << "Start default timer" << std::endl; logbook.start(); // Initiate the subtimers for( int t = 0; t < numTimers; t++ ) { // Create a name for each subtimer // Usually hard-coded into program but we just // increment a counter and attach to a prefix. stringstream ss; ss << prefix << t; names.push_back( ss.str() ); // add() takes in a string object std::cout << "Adding " << names[t] << std::endl; logbook.add( names[t] ); } // Slumber for one second powernap(1000); // Start all subtimers for( int t = 0; t < numTimers; t++ ) { std::cout << "Starting " << names[t] << std::endl; logbook.start( names[t] ); // Slumber for one second powernap(1000); } // Stop all timers, including default timer std::cout << "Stopping all timers" << std::endl; logbook.stopAll(); // Write statistics to terminal // Commented out for `make check` to pass if( verbose ) logbook.showAll(); exit( EXIT_SUCCESS ); } eclib-20250122/tests/tlatconst.cc000066400000000000000000000031551474421343600165270ustar00rootroot00000000000000// TLATCONST.CC -- test of lattice constant procedures ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // #include int main(){ #ifdef MPFP set_precision(100); #endif initprimes("PRIMES",0); cout << "Table of Gamma values\n"; cout << "---------------------\n\n"; long n; cout << "n\tGamma(n)\tGamma(n+1/2)\n"; for (n=1; n<=20; n++) cout << n << "\t" << Gamma_n(n) << "\t" << Gamma_n_plus_half(n) << endl; cout << "\n\n"; cout << "Table of Lattice constants\n"; cout << "--------------------------\n\n"; cout << "n\tgamma_n\tgamma_n^n\n"; for (n=1; n<=20; n++) { bigfloat gam = lattice_const(n); cout << n << "\t" << gam << "\t" << power(gam,n) << endl; } return 0; }// end main() eclib-20250122/tests/tlegcert.cc000066400000000000000000000054731474421343600163320ustar00rootroot00000000000000// tlegcert.cc: test program for solving legendre equations with certificates ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include #include #include #include #ifndef CONIC_METHOD #define CONIC_METHOD 4 #endif //#define TEST_PARAM //#define HOLZER_MEASURES int main() { initprimes("PRIMES"); cout<<"Solving ax^2 + by^2 + cz^2 = 0\n"; cout<<"Using method "<> a >> b >> c; cout<> k1 >> k2 >> k3; int use_lll=(CONIC_METHOD==5); int res=!use_lll; if(use_lll) legendre_via_lll(a,b,c,k1,k2,k3,x,y,z); else res = legendre_solve_cert_1(a,b,c,k1,k2,k3,x,y,z,u); if(res) // if(!solve_conic(a,0,c,-b,x,y,z,CONIC_METHOD)) { cout<<"No solution!\n"; } else { #ifdef HOLZER_MEASURES cout<<"Before reduction of solution "; show_xyz(x,y,z); cout< #include #include #include #include #include #include #include #include #define AUTOLOOP #define LMFDB_ORDER // if defined, sorts newforms into LMFDB order before output int main(void) { init_time(); start_time(); long n=110, stopp; int output, verbose, sign=1; cout << "Program tmanin. Using METHOD = " << METHOD << " to find newforms" << endl; #ifdef MODULAR cout << "MODULUS for linear algebra = " << MODULUS << endl; #endif cout << "Verbose output? "; cin>>verbose; cout << "How many primes for Hecke eigenvalues? "; cin >> stopp; cout << endl; output=1; cout << "Output Hecke eigenvalues to file? (0/1) "; cin >> output; cout << "Sign? (-1/0/1) "; cin >> sign; #ifdef AUTOLOOP long limit; cout<<"Enter first and last N: ";cin>>n>>limit; n--; while (n1) { cout<<"Enter level: "; cin>>n; #endif if (n>1) { cout << "\n>>>Level " << n; if(verbose)cout<1) nf.display(); else cout << nf.n1ds << " newform(s) found."; if(verbose&&nf.n1ds>0) cout<<"\nComputing ap for primes up to "< #include #include #include bigint a1,a2,a3,a4,a6; Curve C; Curvedata CD; int verbose=0; long hlimq=5; long naux=-1; //#define SELMER_ONLY //#define TIMINGS int getcurve(void) { if (verbose) cout << "Enter curve coefficients a1,a2,a3,a4,a6 ?" << "\n"; cin >> a1 >> a2 >> a3 >> a4 >> a6; C = Curve(a1,a2,a3,a4,a6); CD = Curvedata(C,1); // "1" means minimise return (a1!=0||a2!=0||a3!=0||a4!=0||a6!=0); } int main() { show_version(cerr); set_precision(50); #ifdef TIMINGS init_time(); #endif int second_descent=1; int selmer_only=0; #ifdef SELMER_ONLY selmer_only=1; #endif // cout << "Verbose mode? (0/1)\n"; cin >> verbose; initprimes("PRIMES",verbose); // cout << "Number of sieving primes?\n"; cin >> naux; cin.flags( cin.flags() | ios::dec ); while (getcurve()) { int filerank; // for testing cin >> filerank; if(verbose) cout<<"\n\n"; cout << "Curve "<< C << " :\t"; if (verbose) cout << endl; else cout< #include #include #include #include #include #include #include #include #define OUTPUT_PARI_STYLE //#define DEBUG //#define COMPARE_OLD int main() { // init_time(); cout << "Program tnfd." << endl; #ifdef MODULAR cout << "MODULUS for linear algebra = " << MODULUS << endl; #endif long n=1; int plus=1; int verbose=1; int w_split=0; int mult_one=0; int one_p=0; cout << "Verbose output? (0/1) "; cin >> verbose; // cout << "Plus space (0/1)? "; cin >> plus; while (cout<<"Enter level: ", cin>>n, n>1) { cout << ">>>Level " << n << "\t"; homspace hplus(n,plus,0,0); int dimh = hplus.h1dim(); cout << "dimension = " << dimh << endl; cout << "Split into W-eigenspaces (0/1)? "; cin >> w_split; cout << "Multiplicity 1 eigenspaces only? (0/1)? "; cin >> mult_one; cout << "Use just one T_p (1) or a linear combination (0)? "; cin >> one_p; nfd form = nfd(&hplus, one_p, w_split, mult_one, verbose); long dims = dim(form.S); if(dims==0) continue; bigint den=form.dHS; int i, ip, nap=5; cout<<"Number of ap? "; cin>>nap; primevar pr; // start_time(); for(ip=0; ip1) cout<> showpoints; initprimes("PRIMES",0); vector ai(5); bigint u, r, s, t, v; int verb=1; while (getcurve(ai,verb)) { Curvedata E0(ai,v); Curvedata E1 = E0.minimalize(u,r,s,t); cout<<"Curve ["< tor = torsion_points(E1); int ntor = tor.size(); cout<<" \t has " << ntor << " torsion point(s)\n"; if(showpoints) { int n2 = 0; // counts 2-torsion for(int i=0; i2) cout<<"Non-cyclic: C2 x C"<<(ntor/2)<<"\n"; else cout << "Cyclic: C"< int main() { cout << "Test program for P2Point class" << endl; P2Point P, Q, R; cout << "Point input formats are [x:y:z], [x,y], [x/z,y/z] with any type of brackets" << endl; cout << "Enter a point P: "; cin >> P; cout << "P="< #include #include int main(){ #ifdef MPFP set_precision("Enter precision in bits"); long original_output_precision = RR::OutputPrecision(); RR::SetOutputPrecision(original_output_precision-3); #endif initprimes("PRIMES",0); int verb=1; bigint v; vector ai(5); while (getcurve(ai,verb)) { cout << "Input curve = "; cout <<"["< int main(){ #ifdef MPFP set_precision(100); #else set_precision("Enter precision in bits"); #endif initprimes("PRIMES",1); Curve c(0,0,1,-7,6); Curvedata cd(c,1); cout << "Testing some points:\n"; Point P0(cd, bigint(0),bigint(2)) ; Point P1(cd, bigint(1),bigint(0)) ; Point P2(cd, bigint(2),bigint(0)) ; cout << "The points are P0 = " << P0 << ", P1 = " << P1 << ", and P2 = " << P2 << endl ; cout << "Now in Pari format:\n"; cout << "The points are P0 = "; output_pari(cout,P0); cout << ", P1 = "; output_pari(cout,P1); cout << ", and P2 = "; output_pari(cout,P2); cout << endl ; if (!P0.isvalid()) cout << "P0 is not on the curve!\n"; if (!P1.isvalid()) cout << "P1 is not on the curve!\n"; if (!P2.isvalid()) cout << "P2 is not on the curve!\n"; cout << "Their negatives are -P0 = " << -P0 << ", -P1 = " << -P1 << ", and -P2 = " << -P2 << endl ; cout << "Computing their heights:\n"; bigfloat ht0 = height(P0) ; bigfloat ht1 = height(P1) ; bigfloat ht2 = height(P2) ; cout << "Heights are " << ht0 << ", " << ht1 << ", and " << ht2 << endl ; Point origin(cd); cout << "The origin is " << origin << endl; cout << "Now some additions etc,:\n"; Point sum = P0 + P1 ; cout << "P0 + P1 = " << sum << endl ; sum = P0 - P1 ; cout << "P0 - P1 = " << sum << endl ; sum -= P2 ; cout << "P0 - P1 - P2 = " << sum << endl ; sum = P0.twice(); cout << "P0.twice() = " << sum << endl; sum = P0 + P0; cout << "P0 + P0 = " << sum << endl; sum = 3*P0; cout << "3*P0 = " << sum << endl; sum = P0 - P0; cout << "P0 - P0 = " << sum << endl; sum = P0 + 3 * P1 - P2 ; cout << "P0 +3 P1 - P2 = " << sum << endl ; sum = 2*P0 + 2* P1 + P2 ; cout << "2P0 +2 P1 + P2 = " << sum << endl ; cout << "Now we try a systematic exploration" << endl ; int loop=1; // cout << "input 0 to skip: "; cin >> loop; if (loop) { Point Q0,Q1,Q2; int i0,i1,i2; for(i0 = -3, Q0=-3*(P0+P1+P2) ; i0 < 4 ; i0++, Q0+=P0){ for(i1 = -3, Q1=Q0 ; i1 < 4 ; i1++, Q1+=P1){ for(i2 = -3, Q2=Q1 ; i2 < 4 ; i2++, Q2+=P2){ cout << i0 << ", " << i1 <<", " << i2<< ": " << Q2 << endl ; } } } } sum = P0 -P1 -P2 ; cout << "P0 -P1 -P2 = " << sum << endl ; cout << "Height of P0-P1-P2 = " << flush; bigfloat htsum = height(sum) ; cout << htsum << endl ; cout <<"3 (P0 -P1 -P2) = " << flush; Point triplesum = 3 * sum ; cout << triplesum << endl ; cout << "Height of 3*(P0-P1-P2) = " << flush; bigfloat ht3sum = height(triplesum) ; cout << ht3sum << endl ; cout << "The quotient is " << ht3sum/htsum << endl ; /* vector pointlist(3); // won't initialize pointlist[0] = P0; pointlist[1] = P1; pointlist[2] = P2 ; bigfloat reg = regulator(pointlist) ; cout << "The regulator of P0, P1, P2 is " << reg << endl ; */ return 0; } //ends main //ends file tpoints.cc eclib-20250122/tests/tsat.cc000066400000000000000000000076671474421343600155030ustar00rootroot00000000000000// tsat.cc -- test for saturate.h/cc ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // #include #include #include #include #include #include #include #include #include #include #include #include #include int randint(int top) { int ans=1+(int) (double(top)*rand()/(RAND_MAX+1.0)); ans-=(top/2); return ans; } int main() { // set_precision("Enter precision in bits"); set_precision(100); initprimes("PRIMES",0); int verbose = 1; cerr<<"verbose (0/1)? "; cin >>verbose; // Curve E; // cout<<"\nInput a curve: "; cin >> E; // Curvedata C(E); // cout << "Curve " << E << endl; Curvedata C; while (getcurve(C, verbose)) { cout << "======================================================\n\n"; cout << "E = " << (Curve)C <> npts; vector points; points.reserve(npts); while(j> P; if ( P.isvalid() ) {points.push_back(P); j++;} else {cerr<<"point "<>pmin; cerr<<"maximum prime p to saturate at (or -1 for automatic)? ", cin>>pmax; if (pmax>0) { pmax = NextPrime(pmax); cout<<"\nSaturating at primes from " <2) cout << " from " <0) { cout << "Saturation was successful: "; if(index>1) { cout<<" index gain = "< newpoints = sieve.getgens(); cout<<"New generators:\n"< #include #include #include #include #include #include #include #include #include #include #include #include #define PMIN 2 #define PMAX -1 int main() { set_precision(100); initprimes("PRIMES",0); int verbose = 1; // cout<<"verbose (0/1)? "; cin >>verbose; long N, nclass, ncurve; Curve E; long curvecount=0; long okcount=0; long upcount=0; vector > keeplist; // list of curves which were not saturated, for report at end while(1) { cin >> N; if(N==0) break; cin >> nclass >> ncurve; cin >> E; curvecount++; Curvedata C(E, 0); saturator sieve(&C,1,verbose); cout< unsat; sieve.set_points(points); sieve.saturate(unsat, index, pmax, 2, 10); cout<<"Finished p-saturation"; if (pmax!=-1) cout << "for p up to "<1) { cout<<", index gain = "< newpoints = sieve.getgens(); cout<<"New generators:\n"< keep; keep.push_back(N); keep.push_back(nclass); keep.push_back(ncurve); keep.push_back(index); keeplist.push_back(keep); } else { cout<<", points were saturated"<0) { cout<<"Curves which needed saturation: "<>verbose; int j, npts; long N, ncurve; string code; Curve E; while(!(feof(stdin))) { // Input the curve's ID and the curve: cin >> N; if(N==0) break; #ifdef INPUT_CLASS_IS_LETTER cin >> code; #else int nclass; cin >> nclass; code = codeletter(nclass-1); #endif cin >> ncurve; cin >> E; Curvedata C(E, 0); cout< points; points.reserve(npts); j=0; while(j> P; if ( !P.isvalid() ) { cout<<"point "< tpoints; points.reserve(trank); j=0; while(j> P; if ( !P.isvalid() ) { cout<<"point "< unsatprimes; int success = 1; if (npts) { success = saturate_points(C, points, index, unsatprimes, SAT_BND, 2, use_egr, (verbose)); } if(success) { cout<<"Saturation complete --"; if(index==1) cout<<"input points were saturated"< input_list(istream & is) { char c; int a; vector ai; is>>c; // swallow first [ is>>ws>>c; if (c==']') return ai; is.unget(); while (c!=']') { is >> a >> c; // c is a comma or ] ai.push_back(a); } return ai; } //end of file tsat3.cc eclib-20250122/tests/tsatbnd.cc000066400000000000000000000104161474421343600161510ustar00rootroot00000000000000// tsatbnd.cc -- test saturation index bound ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// // #include #include #include #include #include #include #include #include #include #include #include //#include //#include //#include int main() { // set_precision("Enter precision in bits"); set_precision(100); initprimes("PRIMES",0); int verbose = 1; cerr<<"verbose (0/1)? "; cin >>verbose; Curvedata C; while (getcurve(C, verbose)) { cout << "======================================================\n\n"; cout << "E = " << (Curve)C <> npts; vector points; points.reserve(npts); while(j> P; if ( P.isvalid() ) { points.push_back(P); j++; } else { cerr<<"point "< points_min(points.size()); std::transform(points.begin(), points.end(), points_min.begin(), [&Cmin, u, r, s, t] (const Point& Pi) {return transform(Pi, &Cmin, u, r, s, t);}); CurveRed CR(Cmin); vector plist = getbad_primes(CR); ComponentGroups CG(CR); vector > ims; for( const auto& p : plist) { cout< #include int main( int argc, char **argv ) { cout << "This eclib version is " << eclib_version() << endl; vector date = eclib_date(); cout << "[ year month day ] = " << date << endl; cout << "\nConfigure options and compilation date:\n" << endl; show_version(); cout << "\nTesting comparison of version date and various (year, month, day) date triples:\n" << endl; // test version date comparison int y, m, d, s; y=2020; m=1; d=1; s = compare_eclib_version(y,m,d); cout << "Date "; cout << setw(4)<0) cout << "before"; else if (s<0) cout << "after"; else cout << "the same as"; cout << " the version date "; cout << setw(4)<0) cout << "before"; else if (s<0) cout << "after"; else cout << "the same as"; cout << " the version date "; cout << setw(4)<0) cout << "before"; else if (s<0) cout << "after"; else cout << "the same as"; cout << " the version date "; cout << setw(4)< #include int main(){ initprimes("PRIMES",0); int verbose=0; vector ai(5); while (getcurve(ai,verbose)) { bigint c4,c6,twist2; bigint v; long twist=1; Curvedata D(Curvedata(ai,v),1); Curvedata E = D; CurveRed CR = CurveRed(E); cout << "\nCurve is: " << endl; CR.display(cout); while(1) { cout << "\nEnter a twist value: "; cout << "\n(0 to set a new `original' curve, 1 to twist original,\n"; cout << "or any other integer to twist immediately preceding output)\n "; cin>>ws; if(cin.eof()) {cout<> twist; if(twist==0) break; if(twist==1) { E=D;} else { E.getci(c4, c6); twist *= 4; //corrects for twist not congruent -1 mod 4 twist2 = twist*twist; c4 *= twist2; c6 *= twist*twist2; E = Curvedata(Curve(c4, c6), 1); //minimal form CR=CurveRed(E); cout << "\n\nE * " << twist/4 << " is: \n"; CR.display(cout); cout << endl; } } } } //ends main eclib-20250122/tests/vectest.cc000066400000000000000000000066251474421343600161760ustar00rootroot00000000000000// vectest.cc: Test of vector package ////////////////////////////////////////////////////////////////////////// // // Copyright 1990-2023 John Cremona // // This file is part of the eclib package. // // eclib is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at your // option) any later version. // // eclib is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License // for more details. // // You should have received a copy of the GNU General Public License // along with eclib; if not, write to the Free Software Foundation, // Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA // ////////////////////////////////////////////////////////////////////////// #include int main(void) { cout << "Test run of vector package.\n\n"; int i,j,k,n; cout << "iota(10) = " << vec::iota(10) << endl; cout << "Enter n : "; cin >> n; vec v; cout << "Uninitialized new vec v = " << v << endl; vec v2(v); cout << "Copy of v = " << v2 << endl; v.init(n); cout << "Initialized new vec v = " << v << endl; vec v3(v); cout << "Copy of v = " << v3 << endl; cout << "Enter new entries of v: "; cin >> v; cout << "Now v = " << v << endl; vec w(3); cout << "w = " << w << endl; w = v; cout << "After w=v, " << endl; cout << "Now v = " << v << endl; cout << "Now w = " << w << endl; cout << "w==v: " << (w==v) << endl; cout << "w!=v: " << (w!=v) << endl; cout << "Enter i : "; cin >> i; w*=2; cout << "After w*=2, w = " << w << endl; cout << "3*v = " << (3*v) << endl; cout << "Now v = " << v << endl; cout << "v+w = " << v+w << endl; cout << "Now v = " << v << endl; cout << "v-w = " << v-w << endl; cout << "Now v = " << v << endl; cout << "v*w = " << v*w << endl; cout << "Now v = " << v << endl; cout << "w/2 = " << w/2 << endl; cout << "Now w = " << w << endl; cout << "-v = " << -v << endl; cout << "+v = " << +v << endl; cout << "+w = " << +w << endl; cout << "v = " << v << "; w = " << w << endl; cout << "Elements of v: \n"; for (i=1; i<=n; i++) cout << "v[" << i << "] = " << v[i] << endl; cout << "Member test: Enter a test number: " ; cin >> i; cout << i; if (member(i,v)) cout << " IS "; else cout << " IS NOT "; cout << "a member of v." << endl; cout << "Subscript test\n"; cout << "Enter length of subscript vec:"; int m; cin >> m; vec index=vec(m); cout << "Enter subscript vector:"; cin >> index; vec vv = v[index]; cout << "The sub-vector is " << vv << endl; cout << "Change one entry of v. Index?"; cin >> i; cout << "New entry?"; scalar x; cin >> x; v[i]=x; cout << "New entry: v[" << i << "] = " << v[i] << endl; cout << "Now v = " << v << endl; cout << "Initial slice; length? "; cin >> j; cout << "Slice = " << v.slice(j) << endl; cout << "Now v = " << v << endl; cout << "General slice; beginning, end? "; cin >> j >> k; cout << "Slice = " << v.slice(j,k) << endl; cout << "Now v = " << v << endl; cout << "w = " << w << "; content(w) = " << content(w) << endl; makeprimitive(w); cout << "After makeprimitive(w), w = " << w << endl; vec u(n); cout << "u = "<< u << endl; swapvec(u,v); cout << "After swapvec(u,v):\nu = " << u << "\nv = " << v << endl; }