Modular exponentiation: Difference between revisions
Content deleted Content added
adding lambdatalk |
m →{{header|REXX}}: added/changed whitespace and comments, optimized the function, simplified the function code, added wording in the REXX section header and the output section header. |
||
Line 1,214:
=={{header|REXX}}==
===version 1===
This REXX program attempts to handle ''any'' <big> '''a''', '''b''', or '''m''', </big> but there are limits for any computer language.
<br>For some REXXes, it's around eight million digits for any arithmetic expression or value, which puts limitations on the ▼
<br>values of <big>a<sup>2</sup></big> or <big>10<sup>m</sup></big>.▼
▲
There is REXX code (below) to automatically adjust the number of digits to accommodate huge numbers which are ▼
▲<br>the values of <big>a<sup>2</sup></big> or <big>10<sup>m</sup></big>.
<br>computed when raising large numbers to some arbitrary power. ▼
<lang rexx>/*REXX program displays the modular exponentiation of: a**b mod M */▼
▲
parse arg a b mm /*obtain optional args from the CL*/▼
▲<br>numbers which are computed when raising large numbers to some arbitrary power.
if a=='' | a=="," then a=2988348162058574136915891421498819466320163312926952423791023078876139▼
if b=='' | b=="," then b=2351399303373464486466122544523690094744975233415544072992656881240319▼
▲if a=='' | a=="," then a= 2988348162058574136915891421498819466320163312926952423791023078876139
say 'a=' a; say " ("length(a) 'digits)' /*display the value of A. */▼
▲if b=='' | b=="," then b= 2351399303373464486466122544523690094744975233415544072992656881240319
if m ='' | m =","
say 'a**b (mod 10**'y")=" powerMod(a,b,10**y) /*display the answer ───► console.*/▼
do j=1 for words(m); y= word(m, j) /*use one of the MM powers (list).*/
end /*j*/▼
▲ end /*j*/
/*──────────────────────────────────────────────────────────────────────────────────────*/
powerMod: procedure; parse arg x,p,
parse value max(x*x, p,
numeric digits max(20, e+e) /*ensure big enough to handle A².
$= 1 /*use this for the first value. */
do
if p // 2 then $= $ * x //
p= p % 2; x= x * x //
end /*
This REXX program makes use of '''LINESIZE''' REXX program (or BIF) which is used to determine the screen width (or linesize) of the terminal (console).
<br>The BIF is used to determine the width of a line separator (which are used to separate different outputs).
<br>The '''LINESIZE.REX''' REXX program is included here ──► [[LINESIZE.REX]].<br>
{{out|output|text= when using the inputs of: <tt> , , 40 80 180 888 </tt>}}
<pre>
a= 2988348162058574136915891421498819466320163312926952423791023078876139 (70 digits)
b= 2351399303373464486466122544523690094744975233415544072992656881240319 (70 digits)▼
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
▲b= 2351399303373464486466122544523690094744975233415544072992656881240319
a**b (mod 10**40)= 1527229998585248450016808958343740453059
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
a**b (mod 10**80)= 53259517041910225328867076245698908287781527229998585248450016808958343740453059
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
a**b (mod 10**180)= 31857295076204937005344367438778481743660325586328069392203762862423884839076695547212682454523811053259517041910225328867076245698908287781527229998585248450016808958343740453059
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
a**b (mod 10**888)= 261284964380836515397030706363442226571397237057488951313684545241085642329943676248755716124260447188788530017182951051652748425560733974835944416069466176713156182727448301838517000343485327001656948285381173038339073779331230132340669899896448938858785362771190460312412579875349871655999446205426049662261450633448468931573506876255644749155348923523680730999869785472779116009356696816952771965930728940530517799329942590114178284009260298426735086579254282591289756840358811
822151307479352856856983393715348870715239020037962938019847992960978849852850613063177471175191444262586321233906926671000476591123695550566585083205841790404069511972417770392822283604206143472509425391114072344402850867571806031857295076204937005344367438778481743660325586328069392203762862423884839076695547212682454523811053259517041910225328867076245698908287781527229998585248450016808958343740453059
and took 5.97 seconds.
</pre>
===version 2===
This REXX version handles only up to 100 decimal digits.
<lang rexx>
/* REXX Modular exponentiation */
numeric digits 100
|