/[dtapublic]/to_be_filed/sf_code/esrgweba/htdocs/howtos/sourceforge/use_the_gmp.htm
ViewVC logotype

Annotation of /to_be_filed/sf_code/esrgweba/htdocs/howtos/sourceforge/use_the_gmp.htm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 23 - (hide annotations) (download) (as text)
Sat Oct 8 06:11:57 2016 UTC (8 years ago) by dashley
Original Path: sf_code/esrgweba/htdocs/howtos/sourceforge/use_the_gmp.htm
File MIME type: text/html
File size: 10545 byte(s)
Initial commit.
1 dashley 23 <html>
2    
3     <head>
4     <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
5     <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
6     <meta name="ProgId" content="FrontPage.Editor.Document">
7     <title>How To Use The GMP And Perform Large Integer Or High-Precision Arithmetic
8     On SourceForge Web Sites</title>
9     <base target="main">
10     </head>
11    
12     <body background="../../bkgnds/bk10.gif">
13    
14     <p align="center"><b><font size="4">How To Use The <a href="http://www.swox.com/gmp"> GMP</a> And Perform Large Integer
15     Or High-Precision Arithmetic On <a href="http://www.sourceforge.net"> SourceForge</a> Web Sites</font></b></p>
16     <hr>
17     <p><b>04/15/03:</b>&nbsp; I (Dave Ashley) have several number theory CGI pages
18     here at <a href="http://www.sourceforge.net">SourceForge</a>.&nbsp; These pages
19     do things like calculate the GCD of two integers, find best rational
20     approximations, etc.; and they do need arbitrarily large integer capability to
21     be useful.&nbsp; It was quite difficult to obtain large integer capability for
22     these pages.&nbsp; Here are the steps I went through, and the eventual solution
23     (in the hopes that it helps others).</p>
24     <ul>
25     <li>I had used the <i>bcmath</i> library with PHP before (it is built into the
26     version of PHP I have on my Linux box at home).&nbsp; Unfortunately, I
27     discovered immediately that the version of PHP used by <i>SourceForge</i>
28     does not have <i>bcmath</i> built in.</li>
29     <li>I tried writing arbitrary integer functions using PHP.&nbsp; These proved
30     to be painfully inefficient.&nbsp; I abandoned the effort when early
31     observations indicated that these probably would not allow calculation of a
32     couple hundred rounds of <a href="../../phpcgibin/euclid_gcd.php">Euclid's
33     GCD algorithm</a> in a practical time (not too long for a user to wait, and
34     within the CPU time limits for a PHP script).</li>
35     <li>I tried writing a separate program in 'C' to do the calculations using the
36     <a href="http://www.swox.com/gmp">GMP library</a>, and tried calling this
37     program from the PHP script using the <i>exec()</i> function.&nbsp; This
38     worked famously at home, but did not work at <i>SourceForge</i>.&nbsp; The
39     behavior at <i>SourceForge</i> was a mystery because using a shell I could
40     invoke the program successfully, but PHP could not invoke it.</li>
41     <li>I completed a <i>SourceForge</i> support ticket.&nbsp; The response to the
42     ticket indicated that:
43     <ul>
44     <li>The GMP is installed on the shell servers but not the web servers,
45     which is why I could run the compiled external program from a shell but
46     not from PHP.</li>
47     <li>The solution is to compile the GMP library, place it in the <i>SourceForge</i>
48     web space, and link to it.</li>
49     </ul>
50     </li>
51     <li>After much experimentation, I discovered that I could not figure out how
52     to place another copy of the GMP library in the web space at SourceForge and
53     link to it.&nbsp; As best I could glean, there are security implications to
54     replacing libraries (perhaps one could trick a program into dynamically
55     linking with the a trojan library), and so dynamically linked libraries
56     could only exist in certain locations (all paths which belong to <i>root</i>).</li>
57     <li>However, I also discovered that I could statically link my program with
58     the GMP (which gives a much larger executable), and place that much larger
59     executable on <i>SourceForge</i> and run it.&nbsp; The executable went from
60     about 20K to 500K when static linking was specified.</li>
61     </ul>
62     <p>All that being said, here are the specific steps I took to use the GMP from
63     PHP:</p>
64     <ul>
65     <li>Be sure that the GMP is installed on your system (the one you are using
66     for compiling).&nbsp; You need both the library and the development
67     files.&nbsp; Here is what shows on my system at home:<br>
68     <br>
69     <font face="Courier">[apache@khinchin apache]$ rpm -q -a | grep gmp<br>
70     gmp-4.0.1-3<br>
71     gmp-devel-4.0.1-3</font><br>
72     <br>
73     Note that both GMP and GMP-devel are installed.<br>
74     <br>
75     On a <a href="http://www.redhat.com">RedHat</a> system, you can use <font face="Courier">rpm</font>
76     to install the packages.&nbsp; On other systems, you may need to install
77     differently or compile and install them from source.</li>
78     <li>Because static linking bloats the executable, the sanest approach (and the
79     one I use) is to write <i>one</i> executable and have it do all the number
80     crunching for all of your PHP scripts.&nbsp; (By writing one executable, the
81     GMP library is present in only one place--that one executable.)&nbsp; The
82     executable I wrote accepts a subfunction code, which is essentially an
83     indication of which PHP script is calling it.&nbsp; Thus, my single
84     executable does GCD calculation, best rational approximations, Miller-Rabin
85     testing, etc., depending on the command-line parameters (which are
86     controlled by the calling PHP script).<br>
87     <br>
88     For example, when the GCD PHP script calls the executable, it uses the
89     subfunction code &quot;gcd&quot; and gets output like this (when finding the
90     GCD of 27 and 150):<br>
91     <br>
92     <font face="Courier" size="2">[apache@khinchin phpcgibin]$ ./arith_large_cgi gcd 27 150<br>
93     S<br>
94     27<br>
95     150<br>
96     1<br>
97     150<br>
98     27<br>
99     5<br>
100     15<br>
101     2<br>
102     27<br>
103     15<br>
104     1<br>
105     12<br>
106     3<br>
107     15<br>
108     12<br>
109     1<br>
110     3<br>
111     4<br>
112     12<br>
113     3<br>
114     4<br>
115     0<br>
116     3<br>
117     S<br>
118     </font><br>
119     On the other hand, when doing Miller-Rabin testing to see if a certain
120     number is prime (101, for example), the single executable is called like
121     this and produces this output:<br>
122     <br>
123     <font face="Courier" size="2">[apache@khinchin phpcgibin]$ ./arith_large_cgi gmp_prob_prime
124     101 25<br>
125     S<br>
126     101<br>
127     25<br>
128     2<br>
129     S<br>
130     </font><br>
131     In the first example above, the numbers which are emitted by the program are
132     data from successive rounds of Euclid's GCD algorithm (which the PHP script
133     formats and displays).&nbsp; In the second case, the output is,
134     respectively, the number whose primality is to be determined (an echo back),
135     the number of rounds of Miller-Rabin testing (again, and echo-back), and
136     finally a code to indicate the testing results (0 = a compsite number, 1 =
137     probably a prime number, and 2 = definitely a prime number).&nbsp; The
138     output of the program is meant to be interpreted by the calling PHP script
139     (i.e. it is not human-friendly).<br>
140     <br>
141     Also note that the first and last lines of the output are
142     &quot;S&quot;.&nbsp; This prevents the calling PHP script from assuming all
143     output is present if the program coredumps or somehow terminates.&nbsp; The
144     calling PHP script checks the number of lines and also checks for the
145     starting and ending &quot;S&quot; characters.</li>
146     <li>Accomplishing static linking is a little bit tricky.&nbsp; Here are the
147     conditions that need to be met:
148     <ul>
149     <li>The static GMP library has to be on the system you use for compilation
150     (it is by default).&nbsp; If it is not present, you may need to compile
151     and install the GMP from source code.</li>
152     <li>When calling the <i>gcc</i> compiler,&nbsp; the <font face="Courier">-static</font>
153     switch can be anywhere, but the <b><font face="Courier">-lgmp</font>
154     switch must be near the end of the command line, after the modules that
155     reference the GMP</b>.&nbsp; This is because <i>gcc</i> links from left
156     to right.&nbsp; For example, my program is built like this:<br>
157     <br>
158     <font face="Courier">gcc -static -o arith_large_cgi arith_large_cgi.c auxfuncs.c subfunc_gcd.c subfunc_gmp_prob_prime.c -lgmp</font><br>
159     <br>
160     Notice that the <font face="Courier">-lgmp</font> switch is at the end
161     of the command line.</li>
162     </ul>
163     </li>
164     <li>The executable can be placed in the same directory as the PHP scripts (it
165     will always find it there).</li>
166     <li>The PHP <i>exec()</i> function is well-documented.&nbsp; You can give it a
167     variable in which it will store the output of the called program in an
168     array.&nbsp; For example, from one of my PHP scripts, here is the code which
169     calls <i>exec()</i> and also checks the output for sanity.<br>
170     <br>
171     <font face="Courier" size="2"> //We can now run the external program to do the calculation.<br>
172     $cgi_command_string = "./arith_large_cgi gcd " . $N1 . " " . $N2;<br>
173     <br>
174     exec($cgi_command_string, $cgi_result);<br>
175     $cgi_result_nelem = count($cgi_result);<br>
176     <br>
177     //We need to perform some sanity checks on the CGI output to be sure it<br>
178     //is what we want. If it seems wrong, we need to generate an error message<br>
179     //and not try to display the output.<br>
180     $cgi_output_is_sane = 1;<br>
181     if ($cgi_result_nelem == 0)<br>
182     &nbsp;&nbsp; $cgi_output_is_sane = 0;<br>
183     if ($cgi_result_nelem > 0)<br>
184     &nbsp;&nbsp; {<br>
185     &nbsp;&nbsp; if (($cgi_result_nelem % 5) != 0)<br>
186     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $cgi_output_is_sane = 0;<br>
187     &nbsp;&nbsp; if ($cgi_result[0] != "S")<br>
188     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $cgi_output_is_sane = 0;<br>
189     &nbsp;&nbsp; if ($cgi_result[$cgi_result_nelem - 1] != "S")<br>
190     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $cgi_output_is_sane = 0;<br>
191     &nbsp;&nbsp; }<br>
192     <br>
193     if (!$cgi_output_is_sane)<br>
194     &nbsp;&nbsp; {<br>
195     &nbsp;&nbsp; do_err_msg("An unspecified error occurred when ...<br>
196     </font><br>
197     Notice how the snippet above checks the output of the program for sanity.</li>
198     <li>Finally, you must have the execute permission for <i>other</i> (the web
199     server is <i>other</i>) set in your compiled executable, or else PHP cannot
200     run the compiled program.&nbsp; You can change these permissions with the <i>chmod</i>
201     command.</li>
202     </ul>
203     <p align="left">Please drop <a href="mailto:dtashley@users.sourceforge.net">me</a>
204     an e-mail if I should change or enhance this documentation or if there is a
205     better way to do something.</p>
206     <hr>
207     <p align="center" style="margin-top: -2; margin-bottom: -1"><font size="1">This
208     web page is maintained by <a href="mailto:dtashley@users.sourceforge.net">David
209     T. Ashley</a>.<br>$Header: /cvsroot/esrg/sfesrg/esrgweba/htdocs/howtos/sourceforge/use_the_gmp.htm,v 1.2 2003/04/27 21:01:30 dtashley Exp $</font></p>
210     <hr noshade size="5">
211    
212     </body>
213    
214     </html>

dashley@gmail.com
ViewVC Help
Powered by ViewVC 1.1.25