June 2018 Update

This commit is contained in:
Ingy döt Net 2018-06-22 20:57:24 +00:00
parent ba8067c3b7
commit 22f33d4004
5278 changed files with 84726 additions and 14379 deletions

View file

@ -0,0 +1,24 @@
public class Program
{
static void Main()
{
System.Console.WriteLine(42.ModInverse(2017));
}
}
public static class IntExtensions
{
public static int ModInverse(this int a, int m)
{
if (m == 1) return 0;
int m0 = m;
(int x, int y) = (1, 0);
while (a > 1) {
int q = a / m;
(a, m) = (m, a % m);
(x, y) = (y, x - q * y);
}
return x < 0 ? x + m0 : x;
}
}

View file

@ -0,0 +1,2 @@
USE: math.functions
42 2017 mod-inv

View file

@ -0,0 +1,27 @@
10 ' Modular inverse
20 LET E% = 42
30 LET T% = 2017
40 GOSUB 1000
50 PRINT MODINV%
60 END
990 ' increments e stp (step) times until bal is greater than t
992 ' repeats until bal = 1 (mod = 1) and returns count
994 ' bal will not be greater than t + e
1000 LET D% = 0
1010 IF E% >= T% THEN GOTO 1140
1020 LET BAL% = E%
1025 ' At least one iteration is necessary
1030 LET STP% = ((T% - BAL%) \ E%) + 1
1040 LET BAL% = BAL% + STP% * E%
1050 LET COUNT% = 1 + STP%
1060 LET BAL% = BAL% - T%
1070 WHILE BAL% <> 1
1080 LET STP% = ((T% - BAL%) \ E%) + 1
1090 LET BAL% = BAL% + STP% * E%
1100 LET COUNT% = COUNT% + STP%
1110 LET BAL% = BAL% - T%
1120 WEND
1130 LET D% = COUNT%
1140 LET MODINV% = D%
1150 RETURN

View file

@ -0,0 +1,43 @@
MODULE ModularInverse;
FROM InOut IMPORT WriteString, WriteInt, WriteLn;
TYPE Data = RECORD x : INTEGER;
y : INTEGER
END;
VAR c : INTEGER;
ab : ARRAY [1..5] OF Data;
PROCEDURE mi(VAR a, b : INTEGER): INTEGER;
VAR t, nt, r, nr, q, tmp : INTEGER;
BEGIN
b := ABS(b);
IF a < 0 THEN a := b - (-a MOD b) END;
t := 0; nt := 1; r := b; nr := a MOD b;
WHILE (nr # 0) DO
q := r / nr;
tmp := nt; nt := t - q * nt; t := tmp;
tmp := nr; nr := r - q * nr; r := tmp;
END;
IF (r > 1) THEN RETURN -1 END;
IF (t < 0) THEN RETURN t + b END;
RETURN t;
END mi;
BEGIN
ab[1].x := 42; ab[1].y := 2017;
ab[2].x := 40; ab[2].y := 1;
ab[3].x := 52; ab[3].y := -217;
ab[4].x := -486; ab[4].y := 217;
ab[5].x := 40; ab[5].y := 2018;
WriteLn;
WriteString("Modular inverse");
WriteLn;
FOR c := 1 TO 5 DO
WriteInt(ab[c].x, 6); WriteString(", ");
WriteInt(ab[c].y, 6); WriteString(" = ");
WriteInt(mi(ab[c].x, ab[c].y),6);
WriteLn;
END;
END ModularInverse.

View file

@ -0,0 +1,37 @@
EnableExplicit
Declare main()
Declare.i mi(a.i, b.i)
If OpenConsole("MODULAR-INVERSE")
main() : Input() : End
EndIf
Macro ModularInverse(a, b)
PrintN(~"\tMODULAR-INVERSE(" + RSet(Str(a),5) + "," +
RSet(Str(b),5)+") = " +
RSet(Str(mi(a, b)),5))
EndMacro
Procedure main()
ModularInverse(42, 2017) ; = 1969
ModularInverse(40, 1) ; = 0
ModularInverse(52, -217) ; = 96
ModularInverse(-486, 217) ; = 121
ModularInverse(40, 2018) ; = -1
EndProcedure
Procedure.i mi(a.i, b.i)
Define x.i = 1,
y.i = Int(Abs(b)),
r.i = 0
If y = 1 : ProcedureReturn 0 : EndIf
While x < y
r = (a * x) % b
If r = 1 Or (y + r) = 1
Break
EndIf
x + 1
Wend
If x > y - 1 : x = -1 : EndIf
ProcedureReturn x
EndProcedure