GInt.pas
上传用户:master
上传日期:2007-01-06
资源大小:17k
文件大小:85k
源码类别:

加密解密

开发平台:

Pascal

  1. {License, info, etc
  2.  ------------------
  3. This implementation is made by Walied Othman, to contact me
  4. mail to Walied.Othman@Student.KULeuven.ac.be or
  5. Triade@ace.Ulyssis.Student.KULeuven.ac.be, or ICQ me on 20388046.
  6. If you 're going to use these implementations, at least mention my
  7. name or something and notify me so I may even put a link on my page.
  8. This implementation is freeware and according to the coderpunks'
  9. manifesto it should remain so, so don 't use these implementations
  10. in commercial applications.  Encryption, as a tool to ensure privacy
  11. should be free and accessible for anyone.
  12. If any algorithm is patented in your country, you should acquire a
  13. license before using this software.  Modified versions of this
  14. software must remain in the public domain and must contain an
  15. acknowledgement of the original author (=me).
  16. This implementaion is available at
  17. http://ace.ulyssis.student.kuleuven.ac.be/~triade/GInt/index.htm
  18. copyright 1999, Walied Othman
  19. This header may not be removed.
  20. Updates:
  21. --------
  22.  9/1/99: Division algorithm speeded up, 3 times faster now
  23. 22/1/99: Procedure Added to compute the Legendre symbol
  24. 26/2/99: The Procedure GIntToBinStr optimized
  25. 28/2/99: signtype changed
  26. 19/3/99: TrialDiv range expanded
  27. 23/3/99: BinStrToGInt optimized, 4 times faster now
  28.          GIntMulByInt and GIntMulByIntBis procedures added
  29. }
  30. Unit GInt;
  31. Interface
  32. Uses Windows, SysUtils, Controls;
  33. Type
  34.    TCompare = (Lt, St, Eq, Er);
  35.    Tsign = (negative, positive);
  36.    TGInt = ^cont;
  37.    cont = Record
  38.       sign : Tsign;
  39.       value : longint;
  40.       next, prev : TGInt;
  41.    End;
  42. Procedure zeronetochar8(Var g : char; x : String);
  43. Procedure zeronetochar6(Var g : integer; x : String);
  44. Procedure initialize8(Var trans : Array Of String);
  45. Procedure initialize6(Var trans : Array Of String);
  46. Procedure Convert8to6bit(str8 : String; Var str6 : String);
  47. Procedure Convert6to8bit(str6 : String; Var str8 : String);
  48. Procedure Convert8to1bit(str8 : String; Var str1 : String);
  49. Procedure Convert6to1bit(str6 : String; Var str1 : String);
  50. Procedure Convert1to8bit(str1 : String; Var str8 : String);
  51. Procedure Convert1to6bit(str1 : String; Var str6 : String);
  52. Procedure decstrtogint(GIntstr : String; Var GInt : TGInt);
  53. Procedure ginttodecstr(Var GIntstr : String; GInt : TGInt);
  54. Procedure InttoGInt(Int : integer; Var GInt : TGInt);
  55. Procedure gintdestroy(Var GInt : TGInt);
  56. Procedure GIntcopy(GInt1 : TGInt; Var GInt2 : TGInt);
  57. Procedure GIntdivbyint(GInt : TGInt; Var res : TGInt; by : longint; Var m : longint);
  58. Procedure GIntmodbyint(GInt : TGInt; by : longint; Var m : longint);
  59. Function GIntCompareAbs(GInt1, GInt2 : TGInt) : TCompare;
  60. Procedure GIntchangesign(Var GInt : TGInt);
  61. Procedure GIntabs(Var GInt : TGInt);
  62. Procedure GIntadd(GInt1, GInt2 : TGInt; Var sum : TGInt);
  63. Procedure GIntsub(GInt1, GInt2 : TGInt; Var dif : TGInt);
  64. Procedure GIntmul(GInt1, GInt2 : TGInt; Var prod : TGInt);
  65. Procedure GIntMulByInt(GInt1 : TGInt; By : Longint; Var prod : TGInt);
  66. Procedure GIntMulByIntBis(Var GInt : TGInt; By : Longint);
  67. Procedure GIntSquare(GInt : TGInt; Var Square : TGInt);
  68. Procedure GInttobinstr(GInt : TGint; Var S : String);
  69. Procedure Binstrtogint(S : String; Var GInt : TGInt);
  70. Procedure GInttostr(GInt : TGInt; Var str : String);
  71. Procedure strtoGInt(str : String; Var GInt : TGInt);
  72. Procedure GIntExp(GInt, exp : TGInt; Var res : TGInt);
  73. Procedure GIntfac(GInt : TGInt; Var res : TGint);
  74. Procedure GIntdivmod(GInt1, GInt2 : TGInt; Var divres, modres : TGInt);
  75. Procedure GIntdiv(GInt1, GInt2 : TGInt; Var divres : TGInt);
  76. Procedure GIntmod(GInt1, GInt2 : TGInt; Var modres : TGInt);
  77. Procedure GIntSquareMod(GInt, Modb : TGInt; Var GIntSM : TGInt);
  78. Procedure GIntAddMod(GInt1, GInt2, base : TGInt; Var GIntres : TGInt);
  79. Procedure GIntMulMod(GInt1, GInt2, base : TGInt; Var GIntres : TGInt);
  80. Procedure GIntmodExp(GInt, exp, modb : TGInt; Var res : TGInt);
  81. Procedure GIntGCD(GInt1, GInt2 : TGint; Var GCD : TGInt);
  82. Procedure GIntLCM(GInt1, GInt2 : TGInt; Var LCM : TGInt);
  83. Procedure GIntTrialdiv9999(GInt : TGInt; Var ok : boolean);
  84. Procedure GIntRandom1(Seed : TGInt; Var RandomGInt : TGInt);
  85. Procedure GIntRabinMiller(GIntp : TGInt; nrtest : integer; Var ok : boolean);
  86. Procedure GIntBezoutBachet(GInt1, GInt2 : TGInt; Var a, b : TGInt);
  87. Procedure GIntModInv(GInt1, base : TGInt; Var Inverse : TGInt);
  88. Procedure GIntPrimetest(GIntp : TGInt; nrRMtests : integer; Var ok : boolean);
  89. Procedure GIntLegendreSymbol(a, p : TGInt; Var L : integer);
  90. Implementation
  91. Var
  92.    primes : Array[1..1227] Of integer =
  93.       (3, 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,
  94.       131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251,
  95.       257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389,
  96.       397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541,
  97.       547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677,
  98.       683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839,
  99.       853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009,
  100.       1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123,
  101.       1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279,
  102.       1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429,
  103.       1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553,
  104.       1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693,
  105.       1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847,
  106.       1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997,
  107.       1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131,
  108.       2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287,
  109.       2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417,
  110.       2423, 2437, 2441, 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593,
  111.       2609, 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707, 2711, 2713, 2719,
  112.       2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, 2843, 2851, 2857, 2861,
  113.       2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037,
  114.       3041, 3049, 3061, 3067, 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209,
  115.       3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, 3359,
  116.       3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527,
  117.       3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659,
  118.       3671, 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821,
  119.       3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3943, 3947, 3967,
  120.       3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129,
  121.       4133, 4139, 4153, 4157, 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273,
  122.       4283, 4289, 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447, 4451, 4457,
  123.       4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, 4603, 4621, 4637,
  124.       4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789,
  125.       4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957,
  126.       4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101,
  127.       5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281,
  128.       5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443,
  129.       5449, 5471, 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623,
  130.       5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737, 5741, 5743, 5749, 5779,
  131.       5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903,
  132.       5923, 5927, 5939, 5953, 5981, 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101,
  133.       6113, 6121, 6131, 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263, 6269,
  134.       6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, 6389, 6397,
  135.       6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599,
  136.       6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779,
  137.       6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947,
  138.       6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103,
  139.       7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283,
  140.       7297, 7307, 7309, 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487,
  141.       7489, 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589, 7591, 7603, 7607,
  142.       7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, 7753, 7757, 7759, 7789,
  143.       7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, 7937, 7949, 7951,
  144.       7963, 7993, 8009, 8011, 8017, 8039, 8053, 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, 8147, 8161,
  145.       8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, 8311,
  146.       8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419, 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521,
  147.       8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, 8599, 8609, 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681,
  148.       8689, 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831,
  149.       8837, 8839, 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, 8933, 8941, 8951, 8963, 8969, 8971, 8999, 9001, 9007,
  150.       9011, 9013, 9029, 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, 9137, 9151, 9157, 9161, 9173, 9181,
  151.       9187, 9199, 9203, 9209, 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, 9319, 9323, 9337, 9341, 9343,
  152.       9349, 9371, 9377, 9391, 9397, 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9473, 9479, 9491,
  153.       9497, 9511, 9521, 9533, 9539, 9547, 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, 9643, 9649, 9661, 9677, 9679,
  154.       9689, 9697, 9719, 9721, 9733, 9739, 9743, 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, 9833, 9839,
  155.       9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, 9923, 9929, 9931, 9941, 9949, 9967, 9973);
  156.    chr64 : Array[1..64] Of char = ('a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', 'e', 'E', 'f', 'F',
  157.       'g', 'G', 'h', 'H', 'i', 'I', 'j', 'J', 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N', 'o', 'O', 'p',
  158.       'P', 'q', 'Q', 'r', 'R', 's', 'S', 't', 'T', 'u', 'U', 'v', 'V', 'w', 'W', 'x', 'X', 'y', 'Y',
  159.       'z', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '=');
  160. {$H+}
  161. Procedure zeronetochar8(Var g : char; x : String);
  162. Begin
  163.    If x[1] = '0' Then
  164.    Begin
  165.       If x[2] = '0' Then
  166.       Begin
  167.          If x[3] = '0' Then
  168.          Begin
  169.             If x[4] = '0' Then
  170.             Begin
  171.                If x[5] = '0' Then
  172.                Begin
  173.                   If x[6] = '0' Then
  174.                   Begin
  175.                      If x[7] = '0' Then
  176.                      Begin
  177.                         If x[8] = '0' Then g := chr(1) Else g := chr(2);
  178.                      End
  179.                      Else
  180.                      Begin
  181.                         If x[8] = '0' Then g := chr(4) Else g := chr(3);
  182.                      End
  183.                   End
  184.                   Else
  185.                   Begin
  186.                      If x[7] = '0' Then
  187.                      Begin
  188.                         If x[8] = '0' Then g := chr(5) Else g := chr(6);
  189.                      End
  190.                      Else
  191.                      Begin
  192.                         If x[8] = '0' Then g := chr(9) Else g := chr(8);
  193.                      End
  194.                   End
  195.                End
  196.                Else
  197.                Begin
  198.                   If x[6] = '0' Then
  199.                   Begin
  200.                      If x[7] = '0' Then
  201.                      Begin
  202.                         If x[8] = '0' Then g := chr(7) Else g := chr(10);
  203.                      End
  204.                      Else
  205.                      Begin
  206.                         If x[8] = '0' Then g := chr(11) Else g := chr(13);
  207.                      End
  208.                   End
  209.                   Else
  210.                   Begin
  211.                      If x[7] = '0' Then
  212.                      Begin
  213.                         If x[8] = '0' Then g := chr(14) Else g := chr(12);
  214.                      End
  215.                      Else
  216.                      Begin
  217.                         If x[8] = '0' Then g := chr(15) Else g := chr(16);
  218.                      End
  219.                   End
  220.                End
  221.             End
  222.             Else
  223.             Begin
  224.                If x[5] = '0' Then
  225.                Begin
  226.                   If x[6] = '0' Then
  227.                   Begin
  228.                      If x[7] = '0' Then
  229.                      Begin
  230.                         If x[8] = '0' Then g := chr(18) Else g := chr(20);
  231.                      End
  232.                      Else
  233.                      Begin
  234.                         If x[8] = '0' Then g := chr(17) Else g := chr(21);
  235.                      End
  236.                   End
  237.                   Else
  238.                   Begin
  239.                      If x[7] = '0' Then
  240.                      Begin
  241.                         If x[8] = '0' Then g := chr(19) Else g := chr(25);
  242.                      End
  243.                      Else
  244.                      Begin
  245.                         If x[8] = '0' Then g := chr(24) Else g := chr(22);
  246.                      End
  247.                   End
  248.                End
  249.                Else
  250.                Begin
  251.                   If x[6] = '0' Then
  252.                   Begin
  253.                      If x[7] = '0' Then
  254.                      Begin
  255.                         If x[8] = '0' Then g := chr(23) Else g := chr(26);
  256.                      End
  257.                      Else
  258.                      Begin
  259.                         If x[8] = '0' Then g := chr(28) Else g := chr(31);
  260.                      End
  261.                   End
  262.                   Else
  263.                   Begin
  264.                      If x[7] = '0' Then
  265.                      Begin
  266.                         If x[8] = '0' Then g := chr(27) Else g := chr(29);
  267.                      End
  268.                      Else
  269.                      Begin
  270.                         If x[8] = '0' Then g := chr(30) Else g := chr(32);
  271.                      End
  272.                   End
  273.                End
  274.             End
  275.          End
  276.          Else
  277.          Begin
  278.             If x[4] = '0' Then
  279.             Begin
  280.                If x[5] = '0' Then
  281.                Begin
  282.                   If x[6] = '0' Then
  283.                   Begin
  284.                      If x[7] = '0' Then
  285.                      Begin
  286.                         If x[8] = '0' Then g := chr(0) Else g := chr(33);
  287.                      End
  288.                      Else
  289.                      Begin
  290.                         If x[8] = '0' Then g := chr(34) Else g := chr(36);
  291.                      End
  292.                   End
  293.                   Else
  294.                   Begin
  295.                      If x[7] = '0' Then
  296.                      Begin
  297.                         If x[8] = '0' Then g := chr(35) Else g := chr(37);
  298.                      End
  299.                      Else
  300.                      Begin
  301.                         If x[8] = '0' Then g := chr(38) Else g := chr(40);
  302.                      End
  303.                   End
  304.                End
  305.                Else
  306.                Begin
  307.                   If x[6] = '0' Then
  308.                   Begin
  309.                      If x[7] = '0' Then
  310.                      Begin
  311.                         If x[8] = '0' Then g := chr(39) Else g := chr(41);
  312.                      End
  313.                      Else
  314.                      Begin
  315.                         If x[8] = '0' Then g := chr(42) Else g := chr(43);
  316.                      End
  317.                   End
  318.                   Else
  319.                   Begin
  320.                      If x[7] = '0' Then
  321.                      Begin
  322.                         If x[8] = '0' Then g := chr(44) Else g := chr(45);
  323.                      End
  324.                      Else
  325.                      Begin
  326.                         If x[8] = '0' Then g := chr(46) Else g := chr(47);
  327.                      End
  328.                   End
  329.                End
  330.             End
  331.             Else
  332.             Begin
  333.                If x[5] = '0' Then
  334.                Begin
  335.                   If x[6] = '0' Then
  336.                   Begin
  337.                      If x[7] = '0' Then
  338.                      Begin
  339.                         If x[8] = '0' Then g := chr(48) Else g := chr(49);
  340.                      End
  341.                      Else
  342.                      Begin
  343.                         If x[8] = '0' Then g := chr(50) Else g := chr(51);
  344.                      End
  345.                   End
  346.                   Else
  347.                   Begin
  348.                      If x[7] = '0' Then
  349.                      Begin
  350.                         If x[8] = '0' Then g := chr(52) Else g := chr(53);
  351.                      End
  352.                      Else
  353.                      Begin
  354.                         If x[8] = '0' Then g := chr(54) Else g := chr(55);
  355.                      End
  356.                   End
  357.                End
  358.                Else
  359.                Begin
  360.                   If x[6] = '0' Then
  361.                   Begin
  362.                      If x[7] = '0' Then
  363.                      Begin
  364.                         If x[8] = '0' Then g := chr(56) Else g := chr(57);
  365.                      End
  366.                      Else
  367.                      Begin
  368.                         If x[8] = '0' Then g := chr(58) Else g := chr(59);
  369.                      End
  370.                   End
  371.                   Else
  372.                   Begin
  373.                      If x[7] = '0' Then
  374.                      Begin
  375.                         If x[8] = '0' Then g := chr(60) Else g := chr(90);
  376.                      End
  377.                      Else
  378.                      Begin
  379.                         If x[8] = '0' Then g := chr(89) Else g := chr(88);
  380.                      End
  381.                   End
  382.                End
  383.             End
  384.          End
  385.       End
  386.       Else
  387.       Begin
  388.          If x[3] = '0' Then
  389.          Begin
  390.             If x[4] = '0' Then
  391.             Begin
  392.                If x[5] = '0' Then
  393.                Begin
  394.                   If x[6] = '0' Then
  395.                   Begin
  396.                      If x[7] = '0' Then
  397.                      Begin
  398.                         If x[8] = '0' Then g := chr(87) Else g := chr(86);
  399.                      End
  400.                      Else
  401.                      Begin
  402.                         If x[8] = '0' Then g := chr(85) Else g := chr(84);
  403.                      End
  404.                   End
  405.                   Else
  406.                   Begin
  407.                      If x[7] = '0' Then
  408.                      Begin
  409.                         If x[8] = '0' Then g := chr(83) Else g := chr(82);
  410.                      End
  411.                      Else
  412.                      Begin
  413.                         If x[8] = '0' Then g := chr(81) Else g := chr(80);
  414.                      End
  415.                   End
  416.                End
  417.                Else
  418.                Begin
  419.                   If x[6] = '0' Then
  420.                   Begin
  421.                      If x[7] = '0' Then
  422.                      Begin
  423.                         If x[8] = '0' Then g := chr(79) Else g := chr(78);
  424.                      End
  425.                      Else
  426.                      Begin
  427.                         If x[8] = '0' Then g := chr(77) Else g := chr(76);
  428.                      End
  429.                   End
  430.                   Else
  431.                   Begin
  432.                      If x[7] = '0' Then
  433.                      Begin
  434.                         If x[8] = '0' Then g := chr(75) Else g := chr(74);
  435.                      End
  436.                      Else
  437.                      Begin
  438.                         If x[8] = '0' Then g := chr(73) Else g := chr(72);
  439.                      End
  440.                   End
  441.                End
  442.             End
  443.             Else
  444.             Begin
  445.                If x[5] = '0' Then
  446.                Begin
  447.                   If x[6] = '0' Then
  448.                   Begin
  449.                      If x[7] = '0' Then
  450.                      Begin
  451.                         If x[8] = '0' Then g := chr(71) Else g := chr(70);
  452.                      End
  453.                      Else
  454.                      Begin
  455.                         If x[8] = '0' Then g := chr(69) Else g := chr(68);
  456.                      End
  457.                   End
  458.                   Else
  459.                   Begin
  460.                      If x[7] = '0' Then
  461.                      Begin
  462.                         If x[8] = '0' Then g := chr(67) Else g := chr(66);
  463.                      End
  464.                      Else
  465.                      Begin
  466.                         If x[8] = '0' Then g := chr(65) Else g := chr(64);
  467.                      End
  468.                   End
  469.                End
  470.                Else
  471.                Begin
  472.                   If x[6] = '0' Then
  473.                   Begin
  474.                      If x[7] = '0' Then
  475.                      Begin
  476.                         If x[8] = '0' Then g := chr(63) Else g := chr(62);
  477.                      End
  478.                      Else
  479.                      Begin
  480.                         If x[8] = '0' Then g := chr(61) Else g := chr(95);
  481.                      End
  482.                   End
  483.                   Else
  484.                   Begin
  485.                      If x[7] = '0' Then
  486.                      Begin
  487.                         If x[8] = '0' Then g := chr(94) Else g := chr(93);
  488.                      End
  489.                      Else
  490.                      Begin
  491.                         If x[8] = '0' Then g := chr(91) Else g := chr(92);
  492.                      End
  493.                   End
  494.                End
  495.             End
  496.          End
  497.          Else
  498.          Begin
  499.             If x[4] = '0' Then
  500.             Begin
  501.                If x[5] = '0' Then
  502.                Begin
  503.                   If x[6] = '0' Then
  504.                   Begin
  505.                      If x[7] = '0' Then
  506.                      Begin
  507.                         If x[8] = '0' Then g := chr(96) Else g := chr(97);
  508.                      End
  509.                      Else
  510.                      Begin
  511.                         If x[8] = '0' Then g := chr(98) Else g := chr(99);
  512.                      End
  513.                   End
  514.                   Else
  515.                   Begin
  516.                      If x[7] = '0' Then
  517.                      Begin
  518.                         If x[8] = '0' Then g := chr(100) Else g := chr(101);
  519.                      End
  520.                      Else
  521.                      Begin
  522.                         If x[8] = '0' Then g := chr(102) Else g := chr(105);
  523.                      End
  524.                   End
  525.                End
  526.                Else
  527.                Begin
  528.                   If x[6] = '0' Then
  529.                   Begin
  530.                      If x[7] = '0' Then
  531.                      Begin
  532.                         If x[8] = '0' Then g := chr(103) Else g := chr(104);
  533.                      End
  534.                      Else
  535.                      Begin
  536.                         If x[8] = '0' Then g := chr(106) Else g := chr(107);
  537.                      End
  538.                   End
  539.                   Else
  540.                   Begin
  541.                      If x[7] = '0' Then
  542.                      Begin
  543.                         If x[8] = '0' Then g := chr(108) Else g := chr(109);
  544.                      End
  545.                      Else
  546.                      Begin
  547.                         If x[8] = '0' Then g := chr(110) Else g := chr(111);
  548.                      End
  549.                   End
  550.                End
  551.             End
  552.             Else
  553.             Begin
  554.                If x[5] = '0' Then
  555.                Begin
  556.                   If x[6] = '0' Then
  557.                   Begin
  558.                      If x[7] = '0' Then
  559.                      Begin
  560.                         If x[8] = '0' Then g := chr(112) Else g := chr(113);
  561.                      End
  562.                      Else
  563.                      Begin
  564.                         If x[8] = '0' Then g := chr(114) Else g := chr(115);
  565.                      End
  566.                   End
  567.                   Else
  568.                   Begin
  569.                      If x[7] = '0' Then
  570.                      Begin
  571.                         If x[8] = '0' Then g := chr(116) Else g := chr(117);
  572.                      End
  573.                      Else
  574.                      Begin
  575.                         If x[8] = '0' Then g := chr(118) Else g := chr(119);
  576.                      End
  577.                   End
  578.                End
  579.                Else
  580.                Begin
  581.                   If x[6] = '0' Then
  582.                   Begin
  583.                      If x[7] = '0' Then
  584.                      Begin
  585.                         If x[8] = '0' Then g := chr(120) Else g := chr(121);
  586.                      End
  587.                      Else
  588.                      Begin
  589.                         If x[8] = '0' Then g := chr(125) Else g := chr(124);
  590.                      End
  591.                   End
  592.                   Else
  593.                   Begin
  594.                      If x[7] = '0' Then
  595.                      Begin
  596.                         If x[8] = '0' Then g := chr(123) Else g := chr(126);
  597.                      End
  598.                      Else
  599.                      Begin
  600.                         If x[8] = '0' Then g := chr(122) Else g := chr(127);
  601.                      End
  602.                   End
  603.                End
  604.             End
  605.          End
  606.       End
  607.    End
  608.    Else
  609.    Begin
  610.       If x[2] = '0' Then
  611.       Begin
  612.          If x[3] = '0' Then
  613.          Begin
  614.             If x[4] = '0' Then
  615.             Begin
  616.                If x[5] = '0' Then
  617.                Begin
  618.                   If x[6] = '0' Then
  619.                   Begin
  620.                      If x[7] = '0' Then
  621.                      Begin
  622.                         If x[8] = '0' Then g := chr(128) Else g := chr(130);
  623.                      End
  624.                      Else
  625.                      Begin
  626.                         If x[8] = '0' Then g := chr(129) Else g := chr(131);
  627.                      End
  628.                   End
  629.                   Else
  630.                   Begin
  631.                      If x[7] = '0' Then
  632.                      Begin
  633.                         If x[8] = '0' Then g := chr(132) Else g := chr(133);
  634.                      End
  635.                      Else
  636.                      Begin
  637.                         If x[8] = '0' Then g := chr(134) Else g := chr(135);
  638.                      End
  639.                   End
  640.                End
  641.                Else
  642.                Begin
  643.                   If x[6] = '0' Then
  644.                   Begin
  645.                      If x[7] = '0' Then
  646.                      Begin
  647.                         If x[8] = '0' Then g := chr(136) Else g := chr(137);
  648.                      End
  649.                      Else
  650.                      Begin
  651.                         If x[8] = '0' Then g := chr(138) Else g := chr(139);
  652.                      End
  653.                   End
  654.                   Else
  655.                   Begin
  656.                      If x[7] = '0' Then
  657.                      Begin
  658.                         If x[8] = '0' Then g := chr(140) Else g := chr(141);
  659.                      End
  660.                      Else
  661.                      Begin
  662.                         If x[8] = '0' Then g := chr(142) Else g := chr(143);
  663.                      End
  664.                   End
  665.                End
  666.             End
  667.             Else
  668.             Begin
  669.                If x[5] = '0' Then
  670.                Begin
  671.                   If x[6] = '0' Then
  672.                   Begin
  673.                      If x[7] = '0' Then
  674.                      Begin
  675.                         If x[8] = '0' Then g := chr(144) Else g := chr(145);
  676.                      End
  677.                      Else
  678.                      Begin
  679.                         If x[8] = '0' Then g := chr(150) Else g := chr(149);
  680.                      End
  681.                   End
  682.                   Else
  683.                   Begin
  684.                      If x[7] = '0' Then
  685.                      Begin
  686.                         If x[8] = '0' Then g := chr(148) Else g := chr(147);
  687.                      End
  688.                      Else
  689.                      Begin
  690.                         If x[8] = '0' Then g := chr(146) Else g := chr(151);
  691.                      End
  692.                   End
  693.                End
  694.                Else
  695.                Begin
  696.                   If x[6] = '0' Then
  697.                   Begin
  698.                      If x[7] = '0' Then
  699.                      Begin
  700.                         If x[8] = '0' Then g := chr(152) Else g := chr(154);
  701.                      End
  702.                      Else
  703.                      Begin
  704.                         If x[8] = '0' Then g := chr(153) Else g := chr(155);
  705.                      End
  706.                   End
  707.                   Else
  708.                   Begin
  709.                      If x[7] = '0' Then
  710.                      Begin
  711.                         If x[8] = '0' Then g := chr(156) Else g := chr(157);
  712.                      End
  713.                      Else
  714.                      Begin
  715.                         If x[8] = '0' Then g := chr(158) Else g := chr(159);
  716.                      End
  717.                   End
  718.                End
  719.             End
  720.          End
  721.          Else
  722.          Begin
  723.             If x[4] = '0' Then
  724.             Begin
  725.                If x[5] = '0' Then
  726.                Begin
  727.                   If x[6] = '0' Then
  728.                   Begin
  729.                      If x[7] = '0' Then
  730.                      Begin
  731.                         If x[8] = '0' Then g := chr(160) Else g := chr(161);
  732.                      End
  733.                      Else
  734.                      Begin
  735.                         If x[8] = '0' Then g := chr(162) Else g := chr(170);
  736.                      End
  737.                   End
  738.                   Else
  739.                   Begin
  740.                      If x[7] = '0' Then
  741.                      Begin
  742.                         If x[8] = '0' Then g := chr(165) Else g := chr(166);
  743.                      End
  744.                      Else
  745.                      Begin
  746.                         If x[8] = '0' Then g := chr(167) Else g := chr(168);
  747.                      End
  748.                   End
  749.                End
  750.                Else
  751.                Begin
  752.                   If x[6] = '0' Then
  753.                   Begin
  754.                      If x[7] = '0' Then
  755.                      Begin
  756.                         If x[8] = '0' Then g := chr(169) Else g := chr(163);
  757.                      End
  758.                      Else
  759.                      Begin
  760.                         If x[8] = '0' Then g := chr(164) Else g := chr(171);
  761.                      End
  762.                   End
  763.                   Else
  764.                   Begin
  765.                      If x[7] = '0' Then
  766.                      Begin
  767.                         If x[8] = '0' Then g := chr(172) Else g := chr(173);
  768.                      End
  769.                      Else
  770.                      Begin
  771.                         If x[8] = '0' Then g := chr(174) Else g := chr(175);
  772.                      End
  773.                   End
  774.                End
  775.             End
  776.             Else
  777.             Begin
  778.                If x[5] = '0' Then
  779.                Begin
  780.                   If x[6] = '0' Then
  781.                   Begin
  782.                      If x[7] = '0' Then
  783.                      Begin
  784.                         If x[8] = '0' Then g := chr(176) Else g := chr(177);
  785.                      End
  786.                      Else
  787.                      Begin
  788.                         If x[8] = '0' Then g := chr(178) Else g := chr(179);
  789.                      End
  790.                   End
  791.                   Else
  792.                   Begin
  793.                      If x[7] = '0' Then
  794.                      Begin
  795.                         If x[8] = '0' Then g := chr(180) Else g := chr(181);
  796.                      End
  797.                      Else
  798.                      Begin
  799.                         If x[8] = '0' Then g := chr(200) Else g := chr(199);
  800.                      End
  801.                   End
  802.                End
  803.                Else
  804.                Begin
  805.                   If x[6] = '0' Then
  806.                   Begin
  807.                      If x[7] = '0' Then
  808.                      Begin
  809.                         If x[8] = '0' Then g := chr(198) Else g := chr(197);
  810.                      End
  811.                      Else
  812.                      Begin
  813.                         If x[8] = '0' Then g := chr(196) Else g := chr(195);
  814.                      End
  815.                   End
  816.                   Else
  817.                   Begin
  818.                      If x[7] = '0' Then
  819.                      Begin
  820.                         If x[8] = '0' Then g := chr(194) Else g := chr(193);
  821.                      End
  822.                      Else
  823.                      Begin
  824.                         If x[8] = '0' Then g := chr(192) Else g := chr(191);
  825.                      End
  826.                   End
  827.                End
  828.             End
  829.          End
  830.       End
  831.       Else
  832.       Begin
  833.          If x[3] = '0' Then
  834.          Begin
  835.             If x[4] = '0' Then
  836.             Begin
  837.                If x[5] = '0' Then
  838.                Begin
  839.                   If x[6] = '0' Then
  840.                   Begin
  841.                      If x[7] = '0' Then
  842.                      Begin
  843.                         If x[8] = '0' Then g := chr(190) Else g := chr(189);
  844.                      End
  845.                      Else
  846.                      Begin
  847.                         If x[8] = '0' Then g := chr(188) Else g := chr(182);
  848.                      End
  849.                   End
  850.                   Else
  851.                   Begin
  852.                      If x[7] = '0' Then
  853.                      Begin
  854.                         If x[8] = '0' Then g := chr(183) Else g := chr(184);
  855.                      End
  856.                      Else
  857.                      Begin
  858.                         If x[8] = '0' Then g := chr(185) Else g := chr(186);
  859.                      End
  860.                   End
  861.                End
  862.                Else
  863.                Begin
  864.                   If x[6] = '0' Then
  865.                   Begin
  866.                      If x[7] = '0' Then
  867.                      Begin
  868.                         If x[8] = '0' Then g := chr(187) Else g := chr(201);
  869.                      End
  870.                      Else
  871.                      Begin
  872.                         If x[8] = '0' Then g := chr(202) Else g := chr(203);
  873.                      End
  874.                   End
  875.                   Else
  876.                   Begin
  877.                      If x[7] = '0' Then
  878.                      Begin
  879.                         If x[8] = '0' Then g := chr(204) Else g := chr(205);
  880.                      End
  881.                      Else
  882.                      Begin
  883.                         If x[8] = '0' Then g := chr(206) Else g := chr(207);
  884.                      End
  885.                   End
  886.                End
  887.             End
  888.             Else
  889.             Begin
  890.                If x[5] = '0' Then
  891.                Begin
  892.                   If x[6] = '0' Then
  893.                   Begin
  894.                      If x[7] = '0' Then
  895.                      Begin
  896.                         If x[8] = '0' Then g := chr(208) Else g := chr(209);
  897.                      End
  898.                      Else
  899.                      Begin
  900.                         If x[8] = '0' Then g := chr(210) Else g := chr(220);
  901.                      End
  902.                   End
  903.                   Else
  904.                   Begin
  905.                      If x[7] = '0' Then
  906.                      Begin
  907.                         If x[8] = '0' Then g := chr(211) Else g := chr(219);
  908.                      End
  909.                      Else
  910.                      Begin
  911.                         If x[8] = '0' Then g := chr(212) Else g := chr(218);
  912.                      End
  913.                   End
  914.                End
  915.                Else
  916.                Begin
  917.                   If x[6] = '0' Then
  918.                   Begin
  919.                      If x[7] = '0' Then
  920.                      Begin
  921.                         If x[8] = '0' Then g := chr(213) Else g := chr(217);
  922.                      End
  923.                      Else
  924.                      Begin
  925.                         If x[8] = '0' Then g := chr(214) Else g := chr(216);
  926.                      End
  927.                   End
  928.                   Else
  929.                   Begin
  930.                      If x[7] = '0' Then
  931.                      Begin
  932.                         If x[8] = '0' Then g := chr(215) Else g := chr(221);
  933.                      End
  934.                      Else
  935.                      Begin
  936.                         If x[8] = '0' Then g := chr(222) Else g := chr(223);
  937.                      End
  938.                   End
  939.                End
  940.             End
  941.          End
  942.          Else
  943.          Begin
  944.             If x[4] = '0' Then
  945.             Begin
  946.                If x[5] = '0' Then
  947.                Begin
  948.                   If x[6] = '0' Then
  949.                   Begin
  950.                      If x[7] = '0' Then
  951.                      Begin
  952.                         If x[8] = '0' Then g := chr(224) Else g := chr(225);
  953.                      End
  954.                      Else
  955.                      Begin
  956.                         If x[8] = '0' Then g := chr(226) Else g := chr(227);
  957.                      End
  958.                   End
  959.                   Else
  960.                   Begin
  961.                      If x[7] = '0' Then
  962.                      Begin
  963.                         If x[8] = '0' Then g := chr(228) Else g := chr(229);
  964.                      End
  965.                      Else
  966.                      Begin
  967.                         If x[8] = '0' Then g := chr(230) Else g := chr(231);
  968.                      End
  969.                   End
  970.                End
  971.                Else
  972.                Begin
  973.                   If x[6] = '0' Then
  974.                   Begin
  975.                      If x[7] = '0' Then
  976.                      Begin
  977.                         If x[8] = '0' Then g := chr(232) Else g := chr(233);
  978.                      End
  979.                      Else
  980.                      Begin
  981.                         If x[8] = '0' Then g := chr(234) Else g := chr(235);
  982.                      End
  983.                   End
  984.                   Else
  985.                   Begin
  986.                      If x[7] = '0' Then
  987.                      Begin
  988.                         If x[8] = '0' Then g := chr(236) Else g := chr(237);
  989.                      End
  990.                      Else
  991.                      Begin
  992.                         If x[8] = '0' Then g := chr(238) Else g := chr(240);
  993.                      End
  994.                   End
  995.                End
  996.             End
  997.             Else
  998.             Begin
  999.                If x[5] = '0' Then
  1000.                Begin
  1001.                   If x[6] = '0' Then
  1002.                   Begin
  1003.                      If x[7] = '0' Then
  1004.                      Begin
  1005.                         If x[8] = '0' Then g := chr(239) Else g := chr(241);
  1006.                      End
  1007.                      Else
  1008.                      Begin
  1009.                         If x[8] = '0' Then g := chr(242) Else g := chr(243);
  1010.                      End
  1011.                   End
  1012.                   Else
  1013.                   Begin
  1014.                      If x[7] = '0' Then
  1015.                      Begin
  1016.                         If x[8] = '0' Then g := chr(244) Else g := chr(245);
  1017.                      End
  1018.                      Else
  1019.                      Begin
  1020.                         If x[8] = '0' Then g := chr(255) Else g := chr(254);
  1021.                      End
  1022.                   End
  1023.                End
  1024.                Else
  1025.                Begin
  1026.                   If x[6] = '0' Then
  1027.                   Begin
  1028.                      If x[7] = '0' Then
  1029.                      Begin
  1030.                         If x[8] = '0' Then g := chr(246) Else g := chr(253);
  1031.                      End
  1032.                      Else
  1033.                      Begin
  1034.                         If x[8] = '0' Then g := chr(247) Else g := chr(252);
  1035.                      End
  1036.                   End
  1037.                   Else
  1038.                   Begin
  1039.                      If x[7] = '0' Then
  1040.                      Begin
  1041.                         If x[8] = '0' Then g := chr(248) Else g := chr(251);
  1042.                      End
  1043.                      Else
  1044.                      Begin
  1045.                         If x[8] = '0' Then g := chr(249) Else g := chr(250);
  1046.                      End
  1047.                   End
  1048.                End
  1049.             End
  1050.          End
  1051.       End
  1052.    End
  1053. End;
  1054. Procedure zeronetochar6(Var g : integer; x : String);
  1055. Begin
  1056.    If x[1] = '0' Then
  1057.    Begin
  1058.       If x[2] = '0' Then
  1059.       Begin
  1060.          If x[3] = '0' Then
  1061.          Begin
  1062.             If x[4] = '0' Then
  1063.             Begin
  1064.                If x[5] = '0' Then
  1065.                Begin
  1066.                   If x[6] = '0' Then g := 1 Else g := 2;
  1067.                End
  1068.                Else
  1069.                Begin
  1070.                   If x[6] = '0' Then g := 3 Else g := 4;
  1071.                End
  1072.             End
  1073.             Else
  1074.             Begin
  1075.                If x[5] = '0' Then
  1076.                Begin
  1077.                   If x[6] = '0' Then g := 5 Else g := 6;
  1078.                End
  1079.                Else
  1080.                Begin
  1081.                   If x[6] = '0' Then g := 7 Else g := 8;
  1082.                End
  1083.             End
  1084.          End
  1085.          Else
  1086.          Begin
  1087.             If x[4] = '0' Then
  1088.             Begin
  1089.                If x[5] = '0' Then
  1090.                Begin
  1091.                   If x[6] = '0' Then g := 9 Else g := 10;
  1092.                End
  1093.                Else
  1094.                Begin
  1095.                   If x[6] = '0' Then g := 11 Else g := 12;
  1096.                End
  1097.             End
  1098.             Else
  1099.             Begin
  1100.                If x[5] = '0' Then
  1101.                Begin
  1102.                   If x[6] = '0' Then g := 13 Else g := 14;
  1103.                End
  1104.                Else
  1105.                Begin
  1106.                   If x[6] = '0' Then g := 15 Else g := 16;
  1107.                End
  1108.             End
  1109.          End
  1110.       End
  1111.       Else
  1112.       Begin
  1113.          If x[3] = '0' Then
  1114.          Begin
  1115.             If x[4] = '0' Then
  1116.             Begin
  1117.                If x[5] = '0' Then
  1118.                Begin
  1119.                   If x[6] = '0' Then g := 17 Else g := 18;
  1120.                End
  1121.                Else
  1122.                Begin
  1123.                   If x[6] = '0' Then g := 19 Else g := 20;
  1124.                End
  1125.             End
  1126.             Else
  1127.             Begin
  1128.                If x[5] = '0' Then
  1129.                Begin
  1130.                   If x[6] = '0' Then g := 21 Else g := 22;
  1131.                End
  1132.                Else
  1133.                Begin
  1134.                   If x[6] = '0' Then g := 23 Else g := 24;
  1135.                End
  1136.             End
  1137.          End
  1138.          Else
  1139.          Begin
  1140.             If x[4] = '0' Then
  1141.             Begin
  1142.                If x[5] = '0' Then
  1143.                Begin
  1144.                   If x[6] = '0' Then g := 25 Else g := 26;
  1145.                End
  1146.                Else
  1147.                Begin
  1148.                   If x[6] = '0' Then g := 27 Else g := 28;
  1149.                End
  1150.             End
  1151.             Else
  1152.             Begin
  1153.                If x[5] = '0' Then
  1154.                Begin
  1155.                   If x[6] = '0' Then g := 29 Else g := 30;
  1156.                End
  1157.                Else
  1158.                Begin
  1159.                   If x[6] = '0' Then g := 31 Else g := 32;
  1160.                End
  1161.             End
  1162.          End
  1163.       End
  1164.    End
  1165.    Else
  1166.    Begin
  1167.       If x[2] = '0' Then
  1168.       Begin
  1169.          If x[3] = '0' Then
  1170.          Begin
  1171.             If x[4] = '0' Then
  1172.             Begin
  1173.                If x[5] = '0' Then
  1174.                Begin
  1175.                   If x[6] = '0' Then g := 33 Else g := 34;
  1176.                End
  1177.                Else
  1178.                Begin
  1179.                   If x[6] = '0' Then g := 35 Else g := 36;
  1180.                End
  1181.             End
  1182.             Else
  1183.             Begin
  1184.                If x[5] = '0' Then
  1185.                Begin
  1186.                   If x[6] = '0' Then g := 37 Else g := 38;
  1187.                End
  1188.                Else
  1189.                Begin
  1190.                   If x[6] = '0' Then g := 39 Else g := 40;
  1191.                End
  1192.             End
  1193.          End
  1194.          Else
  1195.          Begin
  1196.             If x[4] = '0' Then
  1197.             Begin
  1198.                If x[5] = '0' Then
  1199.                Begin
  1200.                   If x[6] = '0' Then g := 41 Else g := 42;
  1201.                End
  1202.                Else
  1203.                Begin
  1204.                   If x[6] = '0' Then g := 43 Else g := 44;
  1205.                End
  1206.             End
  1207.             Else
  1208.             Begin
  1209.                If x[5] = '0' Then
  1210.                Begin
  1211.                   If x[6] = '0' Then g := 45 Else g := 46;
  1212.                End
  1213.                Else
  1214.                Begin
  1215.                   If x[6] = '0' Then g := 47 Else g := 48;
  1216.                End
  1217.             End
  1218.          End
  1219.       End
  1220.       Else
  1221.       Begin
  1222.          If x[3] = '0' Then
  1223.          Begin
  1224.             If x[4] = '0' Then
  1225.             Begin
  1226.                If x[5] = '0' Then
  1227.                Begin
  1228.                   If x[6] = '0' Then g := 49 Else g := 50;
  1229.                End
  1230.                Else
  1231.                Begin
  1232.                   If x[6] = '0' Then g := 51 Else g := 52;
  1233.                End
  1234.             End
  1235.             Else
  1236.             Begin
  1237.                If x[5] = '0' Then
  1238.                Begin
  1239.                   If x[6] = '0' Then g := 53 Else g := 54;
  1240.                End
  1241.                Else
  1242.                Begin
  1243.                   If x[6] = '0' Then g := 55 Else g := 56;
  1244.                End
  1245.             End
  1246.          End
  1247.          Else
  1248.          Begin
  1249.             If x[4] = '0' Then
  1250.             Begin
  1251.                If x[5] = '0' Then
  1252.                Begin
  1253.                   If x[6] = '0' Then g := 57 Else g := 58;
  1254.                End
  1255.                Else
  1256.                Begin
  1257.                   If x[6] = '0' Then g := 59 Else g := 60;
  1258.                End
  1259.             End
  1260.             Else
  1261.             Begin
  1262.                If x[5] = '0' Then
  1263.                Begin
  1264.                   If x[6] = '0' Then g := 61 Else g := 62;
  1265.                End
  1266.                Else
  1267.                Begin
  1268.                   If x[6] = '0' Then g := 63 Else g := 64;
  1269.                End
  1270.             End
  1271.          End
  1272.       End
  1273.    End
  1274. End;
  1275. Procedure initialize8(Var trans : Array Of String);
  1276. Var
  1277.    c1, c2, c3, c4, c5, c6, c7, c8 : integer;
  1278.    x : String;
  1279.    g : char;
  1280. Begin
  1281.    For c1 := 0 To 1 Do
  1282.       For c2 := 0 To 1 Do
  1283.          For c3 := 0 To 1 Do
  1284.             For c4 := 0 To 1 Do
  1285.                For c5 := 0 To 1 Do
  1286.                   For c6 := 0 To 1 Do
  1287.                      For c7 := 0 To 1 Do
  1288.                         For c8 := 0 To 1 Do
  1289.                         Begin
  1290.                            x := '';
  1291.                            x := inttostr(c1) + inttostr(c2) + inttostr(c3) + inttostr(c4) + inttostr(c5) + inttostr(c6) + inttostr(c7) + inttostr(c8);
  1292.                            zeronetochar8(g, x);
  1293.                            trans[ord(g)] := x;
  1294.                         End;
  1295. End;
  1296. Procedure initialize6(Var trans : Array Of String);
  1297. Var
  1298.    c1, c2, c3, c4, c5, c6 : integer;
  1299.    x : String;
  1300.    g : integer;
  1301. Begin
  1302.    For c1 := 0 To 1 Do
  1303.       For c2 := 0 To 1 Do
  1304.          For c3 := 0 To 1 Do
  1305.             For c4 := 0 To 1 Do
  1306.                For c5 := 0 To 1 Do
  1307.                   For c6 := 0 To 1 Do
  1308.                   Begin
  1309.                      x := '';
  1310.                      x := inttostr(c1) + inttostr(c2) + inttostr(c3) + inttostr(c4) + inttostr(c5) + inttostr(c6);
  1311.                      zeronetochar6(g, x);
  1312.                      trans[ord(chr64[g])] := x;
  1313.                   End;
  1314. End;
  1315. // Convert 8 bit strings to 6 bit strings and visa versa
  1316. Procedure Convert8to6bit(str8 : String; Var str6 : String);
  1317. Var
  1318.    temp : String;
  1319.    trans : Array[0..255] Of String;
  1320.    i, len6 : longint;
  1321.    g : integer;
  1322. Begin
  1323.    initialize8(trans);
  1324.    temp := '';
  1325.    For i := 1 To length(str8) Do temp := temp + trans[ord(str8[i])];
  1326.    While (length(temp) Mod 6) <> 0 Do temp := temp + '0';
  1327.    len6 := length(temp) Div 6;
  1328.    str6 := '';
  1329.    For i := 1 To len6 Do
  1330.    Begin
  1331.       zeronetochar6(g, copy(temp, 1, 6));
  1332.       str6 := str6 + chr64[g];
  1333.       delete(temp, 1, 6);
  1334.    End;
  1335. End;
  1336. Procedure Convert6to8bit(str6 : String; Var str8 : String);
  1337. Var
  1338.    temp : String;
  1339.    trans : Array[0..255] Of String;
  1340.    i, len8 : longint;
  1341.    g : char;
  1342. Begin
  1343.    initialize6(trans);
  1344.    temp := '';
  1345.    For i := 1 To length(str6) Do temp := temp + trans[ord(str6[i])];
  1346.    str8 := '';
  1347.    len8 := length(temp) Div 8;
  1348.    For i := 1 To len8 Do
  1349.    Begin
  1350.       zeronetochar8(g, copy(temp, 1, 8));
  1351.       str8 := str8 + g;
  1352.       delete(temp, 1, 8);
  1353.    End;
  1354. End;
  1355. // Convert 8 & 6 bit strings to 1 bit strings and visa versa
  1356. Procedure Convert8to1bit(str8 : String; Var str1 : String);
  1357. Var
  1358.    trans : Array[0..255] Of String;
  1359.    i : longint;
  1360. Begin
  1361.    str1 := '';
  1362.    initialize8(trans);
  1363.    For i := 1 To length(str8) Do str1 := str1 + trans[ord(str8[i])];
  1364. End;
  1365. Procedure Convert6to1bit(str6 : String; Var str1 : String);
  1366. Var
  1367.    trans : Array[0..255] Of String;
  1368.    i : longint;
  1369. Begin
  1370.    str1 := '';
  1371.    initialize6(trans);
  1372.    For i := 1 To length(str6) Do str1 := str1 + trans[ord(str6[i])];
  1373. End;
  1374. Procedure Convert1to8bit(str1 : String; Var str8 : String);
  1375. Var
  1376.    i, len8 : longint;
  1377.    g : char;
  1378. Begin
  1379.    str8 := '';
  1380.    While (length(str1) Mod 8) <> 0 Do str1 := '0' + str1;
  1381.    len8 := length(str1) Div 8;
  1382.    For i := 1 To len8 Do
  1383.    Begin
  1384.       zeronetochar8(g, copy(str1, 1, 8));
  1385.       str8 := str8 + g;
  1386.       delete(str1, 1, 8);
  1387.    End;
  1388. End;
  1389. Procedure Convert1to6bit(str1 : String; Var str6 : String);
  1390. Var
  1391.    i, len6 : longint;
  1392.    g : integer;
  1393. Begin
  1394.    str6 := '';
  1395.    While (length(str1) Mod 6) <> 0 Do str1 := '0' + str1;
  1396.    len6 := length(str1) Div 6;
  1397.    For i := 1 To len6 Do
  1398.    Begin
  1399.       zeronetochar6(g, copy(str1, 1, 6));
  1400.       str6 := str6 + chr64[g];
  1401.       delete(str1, 1, 6);
  1402.    End;
  1403. End;
  1404. // convert a base 10 string to a GInt and visa versa
  1405. Procedure DecStrToGInt(GIntstr : String; Var GInt : TGInt);
  1406. Var
  1407.    temp1, temp2 : TGInt;
  1408.    p : Tsign;
  1409. Begin
  1410.    While Not (GIntstr[1] In ['-', '0'..'9']) Do delete(GIntstr, 1, 1);
  1411.    If GIntstr[1] = '-' Then
  1412.    Begin
  1413.       delete(GIntstr, 1, 1);
  1414.       p := negative;
  1415.    End
  1416.    Else p := positive;
  1417.    While (GIntstr[1] = '0') And (length(GIntstr) > 1) Do delete(GIntstr, 1, 1);
  1418.    new(temp2);
  1419.    temp2^.next := Nil;
  1420.    If (length(GIntstr) Mod 4) = 0 Then
  1421.    Begin
  1422.       temp2^.value := strtoint(copy(GIntstr, 1, 4));
  1423.       delete(GIntstr, 1, 4);
  1424.    End
  1425.    Else
  1426.    Begin
  1427.       temp2^.value := strtoint(copy(GIntstr, 1, (length(GIntstr) Mod 4)));
  1428.       delete(GIntstr, 1, (length(GIntstr) Mod 4));
  1429.    End;
  1430.    While length(GIntstr) > 0 Do
  1431.    Begin
  1432.       new(temp1);
  1433.       temp1^.next := temp2;
  1434.       temp2^.prev := temp1;
  1435.       temp1^.value := strtoint(copy(GIntstr, 1, 4));
  1436.       delete(GIntstr, 1, 4);
  1437.       temp2 := temp1;
  1438.    End;
  1439.    temp2^.prev := Nil;
  1440.    temp2^.sign := p;
  1441.    GInt := temp2;
  1442. End;
  1443. Procedure GIntToDecStr(Var GIntstr : String; GInt : TGInt);
  1444. Var
  1445.    s : String;
  1446.    p : TSign;
  1447. Begin
  1448.    GIntstr := '';
  1449.    p := GInt^.sign;
  1450.    s := inttostr(GInt^.value);
  1451.    While length(s) < 4 Do s := '0' + s;
  1452.    GIntstr := s + GIntstr;
  1453.    While GInt^.next <> Nil Do
  1454.    Begin
  1455.       GInt := GInt^.next;
  1456.       s := inttostr(abs(GInt^.value));
  1457.       While length(s) < 4 Do s := '0' + s;
  1458.       GIntstr := s + GIntstr;
  1459.    End;
  1460.    While (GIntstr[1] = '0') And (length(GIntstr) > 1) Do delete(GIntstr, 1, 1);
  1461.    If p = negative Then GIntstr := '-' + GIntstr;
  1462. End;
  1463. // Convert an integer to a GInt
  1464. Procedure IntToGInt(Int : integer; Var GInt : TGInt);
  1465. Begin
  1466.    DecstrtoGInt(inttostr(Int), GInt);
  1467. End;
  1468. // Destroy a GInt, in order to free memory
  1469. Procedure GIntDestroy(Var GInt : TGInt);
  1470. Begin
  1471.    While GInt^.next <> Nil Do GInt := GInt^.next;
  1472.    While GInt^.prev <> Nil Do
  1473.    Begin
  1474.       GInt := GInt^.prev;
  1475.       dispose(GInt^.next);
  1476.    End;
  1477.    dispose(GInt);
  1478. End;
  1479. // Make a copy of a GInt
  1480. Procedure GIntCopy(GInt1 : TGInt; Var GInt2 : TGInt);
  1481. Var
  1482.    temp1, temp2 : TGInt;
  1483. Begin
  1484.    new(GInt2);
  1485.    GInt2^.sign := GInt1^.sign;
  1486.    GInt2^.prev := Nil;
  1487.    GInt2^.value := GInt1^.value;
  1488.    temp1 := GInt2;
  1489.    While GInt1^.next <> Nil Do
  1490.    Begin
  1491.       GInt1 := GInt1^.next;
  1492.       new(temp2);
  1493.       temp2^.value := GInt1^.value;
  1494.       temp2^.prev := temp1;
  1495.       temp1^.next := temp2;
  1496.       temp1 := temp2;
  1497.    End;
  1498.    temp1^.next := Nil;
  1499. End;
  1500. // Divide a GInt by an integer, GInt = res * by + m
  1501. Procedure GIntDivByInt(GInt : TGInt; Var res : TGInt; by : longint; Var m : longint);
  1502. Var
  1503.    S, S1 : String;
  1504. Begin
  1505.    If (by Div 10000) = 0 Then
  1506.    Begin
  1507.       S := '';
  1508.       While GInt^.next <> Nil Do GInt := GInt^.next;
  1509.       S := inttostr(GInt^.value Div by);
  1510.       m := (GInt^.value Mod by);
  1511.       While GInt^.prev <> Nil Do
  1512.       Begin
  1513.          m := m * 10000;
  1514.          GInt := GInt^.prev;
  1515.          S1 := inttostr((GInt^.value + m) Div by);
  1516.          While length(S1) < 4 Do S1 := '0' + S1;
  1517.          S := S + S1;
  1518.          m := ((GInt^.value + m) Mod by);
  1519.       End;
  1520.       decstrtogint(S, res);
  1521.    End;
  1522. End;
  1523. // GInt modulo an integer, GInt mod by = m
  1524. Procedure GIntModByInt(GInt : TGInt; by : longint; Var m : longint);
  1525. Begin
  1526.    If (by Div 10000) = 0 Then
  1527.    Begin
  1528.       While GInt^.next <> Nil Do GInt := GInt^.next;
  1529.       m := (GInt^.value Mod by);
  1530.       While GInt^.prev <> Nil Do
  1531.       Begin
  1532.          m := m * 10000;
  1533.          GInt := GInt^.prev;
  1534.          m := ((GInt^.value + m) Mod by);
  1535.       End;
  1536.    End;
  1537. End;
  1538. // Compare two GInts in absolute value, GInt1 < : St, > : Lt, = : Eq, Error : Er GInt2
  1539. Function GIntCompareAbs(GInt1, GInt2 : TGInt) : TCompare;
  1540. Begin
  1541.    GIntCompareAbs := Er;
  1542.    While (GInt1^.next <> Nil) And (GInt2^.next <> Nil) Do
  1543.    Begin
  1544.       GInt1 := GInt1^.next;
  1545.       GInt2 := GInt2^.next;
  1546.    End;
  1547.    If (GInt1^.next = Nil) And (GInt2^.next <> Nil) Then GIntCompareAbs := St;
  1548.    If (GInt2^.next = Nil) And (GInt1^.next <> Nil) Then GIntCompareAbs := Lt;
  1549.    If (GInt1^.next = Nil) And (GInt2^.next = Nil) Then
  1550.    Begin
  1551.       While (GInt1^.value = GInt2^.value) And (GInt1^.prev <> Nil) Do
  1552.       Begin
  1553.          GInt1 := GInt1^.prev;
  1554.          GInt2 := GInt2^.prev;
  1555.       End;
  1556.       If (GInt1^.value > GInt2^.value) Then GIntCompareAbs := Lt
  1557.       Else If (GInt1^.value < GInt2^.value) Then GIntCompareAbs := St Else GIntCompareAbs := Eq;
  1558.    End
  1559. End;
  1560. // Change the sign of a GInt
  1561. Procedure GIntChangeSign(Var GInt : TGInt);
  1562. Begin
  1563.    If GInt^.sign = negative Then GInt^.sign := positive Else GInt^.sign := negative;
  1564. End;
  1565. // Returns the GInt in its absolute value
  1566. Procedure GIntAbs(Var GInt : TGInt);
  1567. Begin
  1568.    GInt^.sign := positive;
  1569. End;
  1570. // Add 2 GInts, GInt1 + GInt2 = sum
  1571. Procedure GIntAdd(GInt1, GInt2 : TGInt; Var sum : TGInt);
  1572. Var
  1573.    temp1, temp2 : TGInt;
  1574.    rest : integer;
  1575.    Tres : Longint;
  1576. Begin
  1577.    If (GInt1^.sign = GInt2^.sign) Then
  1578.    Begin
  1579.       new(temp2);
  1580.       temp2^.prev := Nil;
  1581.       Tres := GInt1^.value + GInt2^.value;
  1582.       temp2^.value := Tres Mod 10000;
  1583.       temp2^.sign := GInt1^.sign;
  1584.       If Tres >= 10000 Then rest := 1 Else rest := 0;
  1585.       While (GInt1^.next <> Nil) And (GInt2^.next <> Nil) Do
  1586.       Begin
  1587.          GInt1 := GInt1^.next;
  1588.          GInt2 := GInt2^.next;
  1589.          new(temp1);
  1590.          Tres := GInt1^.value + GInt2^.value + rest;
  1591.          temp1^.value := Tres Mod 10000;
  1592.          If Tres >= 10000 Then rest := 1 Else rest := 0;
  1593.          temp1^.prev := temp2;
  1594.          temp2^.next := temp1;
  1595.          temp2 := temp1;
  1596.       End;
  1597.       While (GInt1^.next) <> Nil Do
  1598.       Begin
  1599.          GInt1 := GInt1^.next;
  1600.          new(temp1);
  1601.          Tres := GInt1^.value + rest;
  1602.          temp1^.value := Tres Mod 10000;
  1603.          If Tres >= 10000 Then rest := 1 Else rest := 0;
  1604.          temp1^.prev := temp2;
  1605.          temp2^.next := temp1;
  1606.          temp2 := temp1;
  1607.       End;
  1608.       While (GInt2^.next) <> Nil Do
  1609.       Begin
  1610.          GInt2 := GInt2^.next;
  1611.          new(temp1);
  1612.          Tres := GInt2^.value + rest;
  1613.          temp1^.value := Tres Mod 10000;
  1614.          If Tres >= 10000 Then rest := 1 Else rest := 0;
  1615.          temp1^.prev := temp2;
  1616.          temp2^.next := temp1;
  1617.          temp2 := temp1;
  1618.       End;
  1619.       If rest <> 0 Then
  1620.       Begin
  1621.          new(temp1);
  1622.          temp1^.value := (rest) Mod 10000;
  1623.          temp1^.prev := temp2;
  1624.          temp2^.next := temp1;
  1625.          temp2 := temp1;
  1626.       End;
  1627.       temp2^.next := Nil;
  1628.       sum := temp2;
  1629.       While sum^.prev <> Nil Do sum := sum^.prev;
  1630.    End
  1631.    Else
  1632.    Begin
  1633.       If (GIntCompareAbs(GInt1, GInt2) = Lt) Or (GIntCompareAbs(GInt1, GInt2) = Eq) Then
  1634.       Begin
  1635.          new(temp2);
  1636.          temp2^.prev := Nil;
  1637.          temp2^.sign := GInt1^.sign;
  1638.          Tres := 10000 + GInt1^.value - GInt2^.value;
  1639.          temp2^.value := Tres Mod 10000;
  1640.          If (GInt1^.value - GInt2^.value) < 0 Then rest := -1 Else rest := 0;
  1641.          While (GInt1^.next <> Nil) And (GInt2^.next <> Nil) Do
  1642.          Begin
  1643.             GInt1 := GInt1^.next;
  1644.             GInt2 := GInt2^.next;
  1645.             new(temp1);
  1646.             Tres := GInt1^.value - GInt2^.value + rest;
  1647.             temp1^.value := (10000 + Tres) Mod 10000;
  1648.             If Tres < 0 Then rest := -1 Else rest := 0;
  1649.             temp1^.prev := temp2;
  1650.             temp2^.next := temp1;
  1651.             temp2 := temp1;
  1652.          End;
  1653.          While (GInt1^.next) <> Nil Do
  1654.          Begin
  1655.             GInt1 := GInt1^.next;
  1656.             new(temp1);
  1657.             Tres := GInt1^.value + rest;
  1658.             temp1^.value := (10000 + Tres) Mod 10000;
  1659.             If Tres < 0 Then rest := -1 Else rest := 0;
  1660.             temp1^.prev := temp2;
  1661.             temp2^.next := temp1;
  1662.             temp2 := temp1;
  1663.          End;
  1664.          If rest <> 0 Then
  1665.          Begin
  1666.             new(temp1);
  1667.             temp1^.value := (10000 + rest) Mod 10000;
  1668.             temp1^.prev := temp2;
  1669.             temp2^.next := temp1;
  1670.             temp2 := temp1;
  1671.          End;
  1672.          While (temp2^.value = 0) And (temp2^.prev <> Nil) Do
  1673.          Begin
  1674.             temp2 := temp2^.prev;
  1675.             dispose(temp2^.next);
  1676.             temp2^.next := Nil;
  1677.          End;
  1678.          temp2^.next := Nil;
  1679.          sum := temp2;
  1680.          While sum^.prev <> Nil Do sum := sum^.prev;
  1681.       End
  1682.       Else
  1683.          GIntadd(GInt2, GInt1, sum);
  1684.    End
  1685. End;
  1686. // Subtract 2 GInts, GInt1 - GInt2 = dif
  1687. Procedure GIntSub(GInt1, GInt2 : TGInt; Var dif : TGInt);
  1688. Begin
  1689.    GIntchangesign(GInt2);
  1690.    GIntadd(GInt1, GInt2, dif);
  1691.    GIntchangesign(GInt2);
  1692. End;
  1693. // Multiply 2 GInts, GInt1 * GInt2 = prod
  1694. Procedure GIntMul(GInt1, GInt2 : TGInt; Var prod : TGInt);
  1695. Var
  1696.    zero, temp1, temp2, temp : TGInt;
  1697.    sign : Tsign;
  1698.    rest, Trest : longint;
  1699. Begin
  1700.    decstrtogint('0', zero);
  1701.    If Not ((GIntcompareabs(zero, GInt1) = Eq) Or (GIntcompareabs(zero, GInt2) = Eq)) Then
  1702.    Begin
  1703.       If GInt1^.sign = GInt2^.sign Then sign := positive Else sign := negative;
  1704.       temp1 := GInt1;
  1705.       new(temp2);
  1706.       temp2^.sign := sign;
  1707.       temp2^.prev := Nil;
  1708.       temp2^.value := (GInt2^.value * temp1^.value) Mod 10000;
  1709.       rest := (GInt2^.value * temp1^.value) Div 10000;
  1710.       temp2^.next := Nil;
  1711.       prod := temp2;
  1712.       While temp1^.next <> Nil Do
  1713.       Begin
  1714.          temp1 := temp1^.next;
  1715.          new(temp);
  1716.          temp^.value := (GInt2^.value * temp1^.value + rest) Mod 10000;
  1717.          rest := (GInt2^.value * temp1^.value + rest) Div 10000;
  1718.          temp^.next := Nil;
  1719.          temp2^.next := temp;
  1720.          temp^.prev := temp2;
  1721.          temp2 := temp2^.next;
  1722.       End;
  1723.       If rest <> 0 Then
  1724.       Begin
  1725.          new(temp);
  1726.          temp^.value := rest;
  1727.          temp^.next := Nil;
  1728.          temp^.prev := temp2;
  1729.          temp2^.next := temp;
  1730.       End;
  1731.       While GInt2^.next <> Nil Do
  1732.       Begin
  1733.          If prod^.next = Nil Then
  1734.          Begin
  1735.             new(temp2);
  1736.             temp2^.value := 0;
  1737.             temp2^.prev := prod;
  1738.             prod^.next := temp2;
  1739.             temp2^.next := Nil;
  1740.          End;
  1741.          prod := prod^.next;
  1742.          GInt2 := GInt2^.next;
  1743.          temp1 := GInt1;
  1744.          temp2 := prod;
  1745.          rest := (GInt2^.value * temp1^.value + temp2^.value) Div 10000;
  1746.          temp2^.value := (GInt2^.value * temp1^.value + temp2^.value) Mod 10000;
  1747.          While temp1^.next <> Nil Do
  1748.          Begin
  1749.             temp1 := temp1^.next;
  1750.             If temp2^.next = Nil Then
  1751.             Begin
  1752.                new(temp);
  1753.                temp^.value := 0;
  1754.                temp^.next := Nil;
  1755.             End
  1756.             Else temp := temp2^.next;
  1757.             trest := (GInt2^.value * temp1^.value + rest + temp^.value) Div 10000;
  1758.             temp^.value := (GInt2^.value * temp1^.value + rest + temp^.value) Mod 10000;
  1759.             rest := trest;
  1760.             temp2^.next := temp;
  1761.             temp^.prev := temp2;
  1762.             temp2 := temp2^.next;
  1763.          End;
  1764.          If rest <> 0 Then
  1765.          Begin
  1766.             If temp2^.next = Nil Then
  1767.             Begin
  1768.                new(temp);
  1769.                temp^.value := 0;
  1770.                temp^.next := Nil;
  1771.             End
  1772.             Else temp := temp2^.next;
  1773.             temp^.value := temp^.value + rest;
  1774.             temp^.next := Nil;
  1775.             temp^.prev := temp2;
  1776.             temp2^.next := temp;
  1777.          End;
  1778.       End;
  1779.       While prod^.prev <> Nil Do prod := prod^.prev;
  1780.    End
  1781.    Else decstrtogint('0', prod);
  1782.    GIntdestroy(zero);
  1783. End;
  1784. // Prod = GInt1 * By, By < 10000
  1785. Procedure GIntMulByInt(GInt1 : TGInt; By : Longint; Var prod : TGInt);
  1786. Var
  1787.    temp2, temp : TGInt;
  1788.    sign : Tsign;
  1789.    rest : longint;
  1790. Begin
  1791.    If By < 0 Then sign := negative Else sign := positive;
  1792.    If GInt1^.sign = sign Then sign := positive Else sign := negative;
  1793.    by := abs(by);
  1794.    new(temp2);
  1795.    temp2^.sign := sign;
  1796.    temp2^.prev := Nil;
  1797.    temp2^.value := (GInt1^.value * by) Mod 10000;
  1798.    rest := (GInt1^.value * by) Div 10000;
  1799.    temp2^.next := Nil;
  1800.    prod := temp2;
  1801.    While GInt1^.next <> Nil Do
  1802.    Begin
  1803.       GInt1 := GInt1^.next;
  1804.       new(temp);
  1805.       temp^.value := (GInt1^.value * By + rest) Mod 10000;
  1806.       rest := (GInt1^.value * By + rest) Div 10000;
  1807.       temp^.next := Nil;
  1808.       temp2^.next := temp;
  1809.       temp^.prev := temp2;
  1810.       temp2 := temp2^.next;
  1811.    End;
  1812.    If rest <> 0 Then
  1813.    Begin
  1814.       new(temp);
  1815.       temp^.value := rest;
  1816.       temp^.next := Nil;
  1817.       temp^.prev := temp2;
  1818.       temp2^.next := temp;
  1819.    End;
  1820.    While prod^.prev <> Nil Do prod := prod^.prev;
  1821. End;
  1822. // GInt = GInt * By, By < 10000
  1823. Procedure GIntMulByIntBis(Var GInt : TGInt; By : Longint);
  1824. Var
  1825.    temp1, temp : TGInt;
  1826.    sign : Tsign;
  1827.    rest, TRest : longint;
  1828. Begin
  1829.    If By < 0 Then sign := negative Else sign := positive;
  1830.    If GInt^.sign = sign Then sign := positive Else sign := negative;
  1831.    by := abs(by);
  1832.    GInt^.sign := sign;
  1833.    Trest := GInt^.value * By;
  1834.    GInt^.value := Trest Mod 10000;
  1835.    rest := Trest Div 10000;
  1836.    temp1 := GInt;
  1837.    While GInt^.next <> Nil Do
  1838.    Begin
  1839.       GInt := GInt^.next;
  1840.       Trest := GInt^.value * By + rest;
  1841.       GInt^.value := Trest Mod 10000;
  1842.       rest := Trest Div 10000;
  1843.    End;
  1844.    If rest <> 0 Then
  1845.    Begin
  1846.       new(temp);
  1847.       temp^.value := rest;
  1848.       temp^.next := Nil;
  1849.       temp^.prev := GInt;
  1850.       GInt^.next := temp;
  1851.    End;
  1852.    GInt := temp1;
  1853. End;
  1854. // Square a GInt, GInt^2 = Square
  1855. Procedure GIntSquare(GInt : TGInt; Var Square : TGInt);
  1856. Begin
  1857.    GIntMul(GInt, GInt, square);
  1858. End;
  1859. // Convert a GInt to a binary string (base 2) & visa versa
  1860. Procedure GIntToBinStr(GInt : TGint; Var S : String);
  1861. Var
  1862.    zero, temp, temp1 : TGInt;
  1863.    i : integer;
  1864. Begin
  1865.    DecStrToGInt('0', zero);
  1866.    GIntCopy(GInt, temp);
  1867.    S := '';
  1868.    While GIntCompareAbs(zero, temp) <> Eq Do
  1869.    Begin
  1870.       GIntDivByInt(temp, temp1, 2, i);
  1871.       S := inttostr(i) + S;
  1872.       GIntDestroy(temp);
  1873.       temp := temp1;
  1874.    End;
  1875.    If S = '' Then S := '0';
  1876.    GIntDestroy(temp);
  1877.    GIntDestroy(zero);
  1878. End;
  1879. Procedure BinStrToGInt(S : String; Var GInt : TGInt);
  1880. Var
  1881.    temp, temp2 : TGInt;
  1882.    i : longint;
  1883. Begin
  1884.    While copy(S, 1, 1) = '0' Do delete(S, 1, 1);
  1885.    decstrtogint('0', GInt);
  1886.    decstrtogint('1', temp);
  1887.    For i := length(S) Downto 1 Do
  1888.    Begin
  1889.       If S[i] = '1' Then
  1890.       Begin
  1891.          GIntadd(GInt, temp, temp2);
  1892.          GIntdestroy(GInt);
  1893.          GInt := temp2;
  1894.       End;
  1895.       GIntmulByIntBis(temp, 2);
  1896.    End;
  1897.    GIntdestroy(temp);
  1898. End;
  1899. // Convert a GInt to an 8 bit string & visa versa
  1900. Procedure GIntToStr(GInt : TGInt; Var str : String);
  1901. Var
  1902.    temp1 : String;
  1903.    i, len8 : longint;
  1904.    g : char;
  1905. Begin
  1906.    GInttobinstr(GInt, temp1);
  1907.    While (length(temp1) Mod 8) <> 0 Do temp1 := '0' + temp1;
  1908.    len8 := length(temp1) Div 8;
  1909.    str := '';
  1910.    For i := 1 To len8 Do
  1911.    Begin
  1912.       zeronetochar8(g, copy(temp1, 1, 8));
  1913.       str := str + g;
  1914.       delete(temp1, 1, 8);
  1915.    End;
  1916. End;
  1917. Procedure StrToGInt(str : String; Var GInt : TGInt);
  1918. Var
  1919.    temp1 : String;
  1920.    i : longint;
  1921.    trans : Array[0..255] Of String;
  1922. Begin
  1923.    temp1 := '';
  1924.    initialize8(trans);
  1925.    For i := 1 To length(str) Do temp1 := temp1 + trans[ord(str[i])];
  1926.    While temp1[1] = '0' Do delete(temp1, 1, 1);
  1927.    binstrtoGInt(temp1, GInt);
  1928. End;
  1929. // Exponentiate a GInt, GInt^exp = res
  1930. Procedure GIntExp(GInt, exp : TGInt; Var res : TGInt);
  1931. Var
  1932.    temp2, temp3 : TGInt;
  1933.    S : String;
  1934.    i : longint;
  1935. Begin
  1936.    GInttobinstr(exp, S);
  1937.    If S[length(S)] = '0' Then decstrtogint('1', res) Else GIntcopy(GInt, res);
  1938.    GIntcopy(GInt, temp2);
  1939.    If length(S) > 1 Then
  1940.       For i := (length(S) - 1) Downto 1 Do
  1941.       Begin
  1942.          GIntSquare(temp2, temp3);
  1943.          GIntdestroy(temp2);
  1944.          temp2 := temp3;
  1945.          If S[i] = '1' Then
  1946.          Begin
  1947.             GIntmul(res, temp2, temp3);
  1948.             GIntdestroy(res);
  1949.             res := temp3;
  1950.          End;
  1951.       End;
  1952. End;
  1953. // Compute GInt! = GInt * (GInt - 1) * (GInt - 2) * ... * 3 * 2 * 1
  1954. Procedure GIntFac(GInt : TGInt; Var res : TGint);
  1955. Var
  1956.    one, temp, temp1 : TGInt;
  1957. Begin
  1958.    GIntcopy(GInt, temp);
  1959.    decstrtogint('1', res);
  1960.    decstrtogint('1', one);
  1961.    While Not ((temp^.next = Nil) And (temp^.value = 1)) Do
  1962.    Begin
  1963.       GIntmul(temp, res, temp1);
  1964.       GIntdestroy(res);
  1965.       res := temp1;
  1966.       GIntsub(temp, one, temp1);
  1967.       GIntdestroy(temp);
  1968.       temp := temp1;
  1969.    End;
  1970.    GIntdestroy(one);
  1971.    GIntdestroy(temp);
  1972. End;
  1973. // Divide 2 GInts, GInt1 = GInt2 * divres + modres, modres is always positive
  1974. Procedure GIntDivMod(GInt1, GInt2 : TGInt; Var divres, modres : TGInt);
  1975. Var
  1976.    s1, s2 : TSign;
  1977.    Tempstr1, tempstr2, tempstr, QStr : String;
  1978.    lend, k, i : longint;
  1979.    temp1, temp2, one, zero, temp : TGInt;
  1980.    QCnt : integer;
  1981. Begin
  1982.    s1 := GInt1^.sign;
  1983.    s2 := GInt2^.sign;
  1984.    GIntabs(GInt1);
  1985.    GIntabs(GInt2);
  1986.    GInttodecstr(tempstr1, GInt1);
  1987.    GInttodecstr(tempstr2, GInt2);
  1988.    lend := length(tempstr2);
  1989.    QStr := '0';
  1990.    decstrtogint('0', zero);
  1991.    If Not ((GInt1^.value = 0) And (GInt1^.next = Nil)) Then
  1992.    Begin
  1993.       GIntcopy(GInt1, temp);
  1994.       tempstr := tempstr1;
  1995.       k := lend;
  1996.       While (GIntcompareabs(temp, GInt2) <> St) Do
  1997.       Begin
  1998.          GIntDestroy(temp);
  1999.          tempstr := copy(tempstr1, 1, k);
  2000.          delete(tempstr1, 1, k);
  2001.          While (length(tempstr) < lend) And (length(tempstr1) > 0) Do
  2002.          Begin
  2003.             tempstr := tempstr + copy(tempstr1, 1, 1);
  2004.             delete(tempstr1, 1, 1);
  2005.             QStr := QStr + '0';
  2006.          End;
  2007.          decstrtoGInt(tempstr, temp1);
  2008.          QCnt := 0;
  2009.          While GIntcompareabs(temp1, GInt2) <> St Do
  2010.          Begin
  2011.             GIntSub(temp1, GInt2, temp2);
  2012.             GIntdestroy(temp1);
  2013.             temp1 := temp2;
  2014.             QCnt := QCnt + 1;
  2015.          End;
  2016.          QStr := QStr + inttostr(QCnt);
  2017.          GInttodecstr(tempstr, temp1);
  2018.          k := length(tempstr) + 1;
  2019.          tempstr1 := tempstr + tempstr1;
  2020.          GIntdestroy(temp1);
  2021.          DecStrToGInt(tempstr1, temp);
  2022.       End;
  2023.       If (GIntcompareabs(temp, GInt2) = St) And ((k - 1) <> length(tempstr1)) Then
  2024.          For i := 1 To (length(tempstr1) - k + 1) Do QStr := QStr + '0';
  2025.       GIntDestroy(temp);
  2026.       DecstrtoGInt(tempstr1, modres);
  2027.       DecstrtoGInt(QStr, divres);
  2028.       decstrtogint('1', one);
  2029.       If s1 = negative Then
  2030.       Begin
  2031.          If GIntcompareabs(modres, zero) <> Eq Then
  2032.          Begin
  2033.             GIntadd(divres, one, temp1);
  2034.             GIntdestroy(divres);
  2035.             divres := temp1;
  2036.             GIntAbs(GInt2);
  2037.             GIntsub(GInt2, modres, temp1);
  2038.             GIntdestroy(modres);
  2039.             GInt2^.sign := s2;
  2040.             modres := temp1;
  2041.          End;
  2042.          If s2 = positive Then divres^.sign := negative;
  2043.       End
  2044.       Else divres^.sign := s2;
  2045.       GIntdestroy(one);
  2046.    End
  2047.    Else
  2048.    Begin
  2049.       GIntcopy(zero, divres);
  2050.       GIntcopy(zero, modres);
  2051.    End;
  2052.    GIntdestroy(zero);
  2053.    GInt1^.sign := s1;
  2054.    GInt2^.sign := s2;
  2055. End;
  2056. // Same as above but doesn't compute modres
  2057. Procedure GIntDiv(GInt1, GInt2 : TGInt; Var divres : TGInt);
  2058. Var
  2059.    s1, s2 : TSign;
  2060.    Tempstr1, tempstr2, tempstr, QStr : String;
  2061.    lend, k, i : longint;
  2062.    temp1, temp2, one, zero, temp, modres : TGInt;
  2063.    QCnt : integer;
  2064. Begin
  2065.    s1 := GInt1^.sign;
  2066.    s2 := GInt2^.sign;
  2067.    GIntabs(GInt1);
  2068.    GIntabs(GInt2);
  2069.    GInttodecstr(tempstr1, GInt1);
  2070.    GInttodecstr(tempstr2, GInt2);
  2071.    lend := length(tempstr2);
  2072.    QStr := '0';
  2073.    decstrtogint('0', zero);
  2074.    If Not ((GInt1^.value = 0) And (GInt1^.next = Nil)) Then
  2075.    Begin
  2076.       GIntcopy(GInt1, temp);
  2077.       tempstr := tempstr1;
  2078.       k := lend;
  2079.       While (GIntcompareabs(temp, GInt2) <> St) Do
  2080.       Begin
  2081.          GIntDestroy(temp);
  2082.          tempstr := copy(tempstr1, 1, k);
  2083.          delete(tempstr1, 1, k);
  2084.          While (length(tempstr) < lend) And (length(tempstr1) > 0) Do
  2085.          Begin
  2086.             tempstr := tempstr + copy(tempstr1, 1, 1);
  2087.             delete(tempstr1, 1, 1);
  2088.             QStr := QStr + '0';
  2089.          End;
  2090.          decstrtoGInt(tempstr, temp1);
  2091.          QCnt := 0;
  2092.          While GIntcompareabs(temp1, GInt2) <> St Do
  2093.          Begin
  2094.             GIntSub(temp1, GInt2, temp2);
  2095.             GIntdestroy(temp1);
  2096.             temp1 := temp2;
  2097.             QCnt := QCnt + 1;
  2098.          End;
  2099.          QStr := QStr + inttostr(QCnt);
  2100.          GInttodecstr(tempstr, temp1);
  2101.          k := length(tempstr) + 1;
  2102.          tempstr1 := tempstr + tempstr1;
  2103.          GIntdestroy(temp1);
  2104.          DecStrToGInt(tempstr1, temp);
  2105.       End;
  2106.       If (GIntcompareabs(temp, GInt2) = St) And ((k - 1) <> length(tempstr1)) Then
  2107.          For i := 1 To (length(tempstr1) - k + 1) Do QStr := QStr + '0';
  2108.       GIntDestroy(temp);
  2109.       DecstrtoGInt(tempstr1, modres);
  2110.       DecstrtoGInt(QStr, divres);
  2111.       decstrtogint('1', one);
  2112.       If s1 = negative Then
  2113.       Begin
  2114.          If GIntcompareabs(modres, zero) <> Eq Then
  2115.          Begin
  2116.             GIntadd(divres, one, temp1);
  2117.             GIntdestroy(divres);
  2118.             divres := temp1;
  2119.             GIntAbs(GInt2);
  2120.             GIntsub(GInt2, modres, temp1);
  2121.             GIntdestroy(modres);
  2122.             GInt2^.sign := s2;
  2123.             modres := temp1;
  2124.          End;
  2125.          If s2 = positive Then divres^.sign := negative;
  2126.       End
  2127.       Else divres^.sign := s2;
  2128.       GIntdestroy(one);
  2129.    End
  2130.    Else
  2131.    Begin
  2132.       GIntcopy(zero, divres);
  2133.       GIntcopy(zero, modres);
  2134.    End;
  2135.    GIntdestroy(zero);
  2136.    GInt1^.sign := s1;
  2137.    GInt2^.sign := s2;
  2138.    GIntDestroy(modres);
  2139. End;
  2140. // Same as above but computes modres and not divres
  2141. Procedure GIntMod(GInt1, GInt2 : TGInt; Var modres : TGInt);
  2142. Var
  2143.    s1, s2 : TSign;
  2144.    Tempstr1, tempstr2, tempstr, QStr : String;
  2145.    lend, k : longint;
  2146.    temp1, temp2, zero, temp : TGInt;
  2147. Begin
  2148.    s1 := GInt1^.sign;
  2149.    s2 := GInt2^.sign;
  2150.    GIntabs(GInt1);
  2151.    GIntabs(GInt2);
  2152.    GInttodecstr(tempstr1, GInt1);
  2153.    GInttodecstr(tempstr2, GInt2);
  2154.    lend := length(tempstr2);
  2155.    QStr := '0';
  2156.    decstrtogint('0', zero);
  2157.    If Not ((GInt1^.value = 0) And (GInt1^.next = Nil)) Then
  2158.    Begin
  2159.       GIntcopy(GInt1, temp);
  2160.       tempstr := tempstr1;
  2161.       k := lend;
  2162.       While (GIntcompareabs(temp, GInt2) <> St) Do
  2163.       Begin
  2164.          GIntDestroy(temp);
  2165.          tempstr := copy(tempstr1, 1, k);
  2166.          delete(tempstr1, 1, k);
  2167.          While (length(tempstr) < lend) And (length(tempstr1) > 0) Do
  2168.          Begin
  2169.             tempstr := tempstr + copy(tempstr1, 1, 1);
  2170.             delete(tempstr1, 1, 1);
  2171.          End;
  2172.          decstrtoGInt(tempstr, temp1);
  2173.          While GIntcompareabs(temp1, GInt2) <> St Do
  2174.          Begin
  2175.             GIntSub(temp1, GInt2, temp2);
  2176.             GIntdestroy(temp1);
  2177.             temp1 := temp2;
  2178.          End;
  2179.          GInttodecstr(tempstr, temp1);
  2180.          k := length(tempstr) + 1;
  2181.          tempstr1 := tempstr + tempstr1;
  2182.          GIntdestroy(temp1);
  2183.          DecStrToGInt(tempstr1, temp);
  2184.       End;
  2185.       GIntDestroy(temp);
  2186.       DecstrtoGInt(tempstr1, modres);
  2187.       If s1 = negative Then
  2188.       Begin
  2189.          If GIntcompareabs(modres, zero) <> Eq Then
  2190.          Begin
  2191.             GIntAbs(GInt2);
  2192.             GIntsub(GInt2, modres, temp1);
  2193.             GIntdestroy(modres);
  2194.             GInt2^.sign := s2;
  2195.             modres := temp1;
  2196.          End;
  2197.       End;
  2198.    End
  2199.    Else
  2200.    Begin
  2201.       GIntcopy(zero, modres);
  2202.    End;
  2203.    GIntdestroy(zero);
  2204.    GInt1^.sign := s1;
  2205.    GInt2^.sign := s2;
  2206. End;
  2207. // Square a GInt modulo Modb, GInt^2 mod Modb = GIntSM
  2208. Procedure GIntSquareMod(GInt, Modb : TGInt; Var GIntSM : TGInt);
  2209. Var
  2210.    temp : TGInt;
  2211. Begin
  2212.    GIntSquare(GInt, temp);
  2213.    GIntMod(temp, Modb, GIntSM);
  2214.    GIntDestroy(temp);
  2215. End;
  2216. // Add 2 GInts modulo base, (GInt1 + GInt2) mod base = GIntres
  2217. Procedure GIntAddMod(GInt1, GInt2, base : TGInt; Var GIntres : TGInt);
  2218. Var
  2219.    temp : TGInt;
  2220. Begin
  2221.    GIntadd(GInt1, GInt2, temp);
  2222.    GIntMod(temp, base, GIntres);
  2223.    GIntdestroy(temp);
  2224. End;
  2225. // Multiply 2 GInts modulo base, (GInt1 * GInt2) mod base = GIntres
  2226. Procedure GIntMulMod(GInt1, GInt2, base : TGInt; Var GIntres : TGInt);
  2227. Var
  2228.    temp : TGInt;
  2229. Begin
  2230.    GIntMul(GInt1, GInt2, temp);
  2231.    GIntMod(temp, base, GIntres);
  2232.    GIntdestroy(temp);
  2233. End;
  2234. // Exponentiate 2 GInts modulo base, (GInt1 ^ GInt2) mod modb = res
  2235. Procedure GIntModExp(GInt, exp, modb : TGInt; Var res : TGInt);
  2236. Var
  2237.    temp2, temp3 : TGInt;
  2238.    S : String;
  2239.    i : longint;
  2240. Begin
  2241.    GInttobinstr(exp, S);
  2242.    If S[length(S)] = '0' Then decstrtogint('1', res) Else GIntcopy(GInt, res);
  2243.    GIntcopy(GInt, temp2);
  2244.    If length(S) > 1 Then
  2245.       For i := (length(S) - 1) Downto 1 Do
  2246.       Begin
  2247.          GIntSquareMod(temp2, Modb, temp3);
  2248.          GIntdestroy(temp2);
  2249.          temp2 := temp3;
  2250.          If S[i] = '1' Then
  2251.          Begin
  2252.             GIntmulMod(res, temp2, modb, temp3);
  2253.             GIntdestroy(res);
  2254.             res := temp3;
  2255.          End;
  2256.       End;
  2257. End;
  2258. // Compute the Greatest Common Divisor of 2 GInts
  2259. Procedure GIntGCD(GInt1, GInt2 : TGint; Var GCD : TGInt);
  2260. Var
  2261.    k : TCompare;
  2262.    zero, temp1, temp2, temp3 : TGInt;
  2263. Begin
  2264.    k := GIntcompareabs(GInt1, GInt2);
  2265.    If (k = Eq) Then GIntCopy(GInt1, GCD) Else
  2266.       If (k = St) Then GIntGCD(GInt2, GInt1, GCD) Else
  2267.       Begin
  2268.          decstrtogint('0', zero);
  2269.          GIntCopy(GInt1, temp1);
  2270.          GIntCopy(GInt2, temp2);
  2271.          While GIntcompareabs(temp2, zero) <> Eq Do
  2272.          Begin
  2273.             GIntmod(temp1, temp2, temp3);
  2274.             GIntdestroy(temp1);
  2275.             temp1 := temp2;
  2276.             temp2 := temp3;
  2277.          End;
  2278.          GCD := temp1;
  2279.          GIntdestroy(temp2);
  2280.          GIntdestroy(zero);
  2281.       End;
  2282. End;
  2283. // Compute the Least Common Multiple of 2 GInts
  2284. Procedure GIntLCM(GInt1, GInt2 : TGInt; Var LCM : TGInt);
  2285. Var
  2286.    temp1, temp2 : TGInt;
  2287. Begin
  2288.    GIntGCD(GInt1, GInt2, temp1);
  2289.    GIntmul(GInt1, GInt2, temp2);
  2290.    GIntdiv(temp2, temp1, LCM);
  2291.    GIntDestroy(temp1);
  2292.    GIntDestroy(temp2);
  2293. End;
  2294. // Trialdivision of a GInt upto 8192 and stopping when a divisor is found, returning ok=false
  2295. Procedure GIntTrialDiv9999(GInt : TGInt; Var ok : boolean);
  2296. Var
  2297.    i, j : integer;
  2298. Begin
  2299.    If ((GInt^.value Mod 2) = 0) Or ((GInt^.value Mod 5) = 0) Then ok := false
  2300.    Else
  2301.    Begin
  2302.       i := 0;
  2303.       ok := true;
  2304.       While ok And (i < 1227) Do
  2305.       Begin
  2306.          i := i + 1;
  2307.          GIntmodbyint(GInt, primes[i], j);
  2308.          If j = 0 Then ok := false;
  2309.       End;
  2310.    End;
  2311. End;
  2312. // A prng
  2313. Procedure GIntRandom1(Seed : TGInt; Var RandomGInt : TGInt);
  2314. Var
  2315.    temp, base : TGInt;
  2316. Begin
  2317.    decstrtoGInt('281474976710656', base);
  2318.    decstrtoGInt('44485709377909', temp);
  2319.    GIntMulMod(seed, temp, base, RandomGInt);
  2320.    GIntdestroy(temp);
  2321.    GIntdestroy(base);
  2322. End;
  2323. // Perform a Rabin Miller Primality Test nrtest times on GIntp, returns ok=true when GIntp passes the test
  2324. Procedure GIntRabinMiller(GIntp : TGInt; nrtest : integer; Var ok : boolean);
  2325. Var
  2326.    j, b, i : longint;
  2327.    m, z, temp1, temp2, temp3, zero, one, two, pmin1 : TGInt;
  2328.    ok1, ok2 : boolean;
  2329. Begin
  2330.    randomize;
  2331.    j := 0;
  2332.    b := 0;
  2333.    decstrtogint('0', zero);
  2334.    decstrtogint('1', one);
  2335.    decstrtogint('2', two);
  2336.    GIntsub(GIntp, one, temp1);
  2337.    GIntsub(GIntp, one, pmin1);
  2338.    While (temp1^.value Mod 2) = 0 Do
  2339.    Begin
  2340.       b := b + 1;
  2341.       GIntdivbyint(temp1, temp2, 2, i);
  2342.       GIntdestroy(temp1);
  2343.       temp1 := temp2;
  2344.    End;
  2345.    m := temp1;
  2346.    i := 0;
  2347.    ok := true;
  2348.    Randomize;
  2349.    While (i < nrtest) And ok Do
  2350.    Begin
  2351.       i := i + 1;
  2352.       DecStrToGInt(inttostr(Primes[Random(1227) + 1]), temp2);
  2353.       GIntmodexp(temp2, m, GIntp, z);
  2354.       GIntdestroy(temp2);
  2355.       ok1 := (GIntcompareabs(z, one) = Eq);
  2356.       ok2 := (GIntcompareabs(z, pmin1) = Eq);
  2357.       If Not (ok1 Or ok2) Then
  2358.       Begin
  2359.          While (ok And (j < b)) Do
  2360.          Begin
  2361.             If (j > 0) And ok1 Then ok := false
  2362.             Else
  2363.             Begin
  2364.                j := j + 1;
  2365.                If (j < b) And (Not ok2) Then
  2366.                Begin
  2367.                   GIntSquaremod(z, GIntp, temp3);
  2368.                   GIntdestroy(z);
  2369.                   z := temp3;
  2370.                   ok1 := (GIntcompareabs(z, one) = Eq);
  2371.                   ok2 := (GIntcompareabs(z, pmin1) = Eq);
  2372.                   If ok2 Then j := b;
  2373.                End
  2374.                Else If (Not ok2) And (j >= b) Then ok := false;
  2375.             End;
  2376.          End;
  2377.       End
  2378.    End;
  2379.    GIntdestroy(zero);
  2380.    GIntdestroy(one);
  2381.    GIntdestroy(two);
  2382.    GIntdestroy(m);
  2383.    GIntdestroy(z);
  2384.    GIntdestroy(pmin1);
  2385. End;
  2386. // Compute the coefficients from the Bezout Bachet theorem, GInt1 * a + GInt2 * b = GCD(GInt1, GInt2)
  2387. Procedure GIntBezoutBachet(GInt1, GInt2 : TGInt; Var a, b : TGInt);
  2388. Var
  2389.    zero, r1, r2, r3, ta, gcd, temp, temp1, temp2 : TGInt;
  2390. Begin
  2391.    If GIntcompareabs(GInt1, GInt2) <> St Then
  2392.    Begin
  2393.       GIntcopy(GInt1, r1);
  2394.       GIntcopy(GInt2, r2);
  2395.       decstrtogint('0', zero);
  2396.       decstrtogint('1', a);
  2397.       decstrtogint('0', ta);
  2398.       Repeat
  2399.          GIntdivmod(r1, r2, temp, r3);
  2400.          GIntdestroy(r1);
  2401.          r1 := r2;
  2402.          r2 := r3;
  2403.          GIntmul(ta, temp, temp1);
  2404.          GIntsub(a, temp1, temp2);
  2405.          GIntdestroy(a);
  2406.          GIntdestroy(temp1);
  2407.          a := ta;
  2408.          ta := temp2;
  2409.          GIntdestroy(temp);
  2410.       Until GIntcompareabs(r3, zero) = Eq;
  2411.       GIntGCD(GInt1, GInt2, gcd);
  2412.       GIntmul(a, GInt1, temp1);
  2413.       GIntsub(gcd, temp1, temp2);
  2414.       GIntDestroy(temp1);
  2415.       GIntdiv(temp2, GInt2, b);
  2416.       GIntDestroy(temp2);
  2417.       GIntdestroy(ta);
  2418.       GIntdestroy(r1);
  2419.       GIntdestroy(r2);
  2420.       GIntdestroy(gcd);
  2421.    End
  2422.    Else GIntBezoutBachet(GInt2, GInt1, b, a);
  2423. End;
  2424. // Find the (multiplicative) Modular inverse of a GInt in a finite ring of additive order base
  2425. Procedure GIntModInv(GInt1, base : TGInt; Var Inverse : TGInt);
  2426. Var
  2427.    zero, one, r1, r2, r3, tb, gcd, temp, temp1, temp2 : TGInt;
  2428. Begin
  2429.    decstrtogint('1', one);
  2430.    GIntGCD(GInt1, base, gcd);
  2431.    If GIntcompareabs(one, gcd) = Eq Then
  2432.    Begin
  2433.       GIntcopy(base, r1);
  2434.       GIntcopy(GInt1, r2);
  2435.       decstrtogint('0', zero);
  2436.       decstrtogint('0', inverse);
  2437.       decstrtogint('1', tb);
  2438.       Repeat
  2439.          GIntdivmod(r1, r2, temp, r3);
  2440.          GIntdestroy(r1);
  2441.          r1 := r2;
  2442.          r2 := r3;
  2443.          GIntmul(tb, temp, temp1);
  2444.          GIntsub(inverse, temp1, temp2);
  2445.          GIntdestroy(inverse);
  2446.          GIntdestroy(temp1);
  2447.          inverse := tb;
  2448.          tb := temp2;
  2449.          GIntdestroy(temp);
  2450.       Until GIntcompareabs(r3, zero) = Eq;
  2451.       If inverse^.sign = negative Then
  2452.       Begin
  2453.          GIntadd(base, inverse, temp);
  2454.          GIntdestroy(inverse);
  2455.          inverse := temp;
  2456.       End;
  2457.       GIntdestroy(tb);
  2458.       GIntdestroy(r1);
  2459.       GIntdestroy(r2);
  2460.    End;
  2461.    GIntdestroy(gcd);
  2462.    GIntdestroy(one);
  2463. End;
  2464. // Perform a (combined) primality test on GIntp consisting of a trialdivision upto 8192,
  2465. // if the GInt passes perform nrRMtests Rabin Miller primality tests, returns ok when a
  2466. // GInt is probably prime
  2467. Procedure GIntPrimetest(GIntp : TGInt; nrRMtests : integer; Var ok : boolean);
  2468. Begin
  2469.    GIntTrialdiv9999(GIntp, ok);
  2470.    If ok Then GIntRabinMiller(GIntp, nrRMtests, ok);
  2471. End;
  2472. // Computes the Legendre symbol for a any number and
  2473. // p a prime, returns 0 if p divides a, 1 if a is a
  2474. // quadratic residu mod p, -1 if a is a quadratic
  2475. // nonresidu mod p
  2476. Procedure GIntLegendreSymbol(a, p : TGInt; Var L : integer);
  2477. Var
  2478.    temp1, temp2, temp3, temp4, temp5, zero, one : TGInt;
  2479.    i : integer;
  2480.    ok1, ok2 : boolean;
  2481. Begin
  2482.    DecStrToGInt('0', zero);
  2483.    DecStrToGInt('1', one);
  2484.    GIntMod(a, p, temp1);
  2485.    If GIntCompareabs(zero, temp1) = Eq Then
  2486.    Begin
  2487.       GIntDestroy(temp1);
  2488.       L := 0;
  2489.    End
  2490.    Else
  2491.    Begin
  2492.       GIntDestroy(temp1);
  2493.       GIntCopy(p, temp1);
  2494.       GIntCopy(a, temp2);
  2495.       L := 1;
  2496.       While GIntCompareAbs(temp2, one) <> Eq Do
  2497.       Begin
  2498.          If (temp2^.value Mod 2) = 0 Then
  2499.          Begin
  2500.             GIntSquare(temp1, temp3);
  2501.             GIntSub(temp3, one, temp4);
  2502.             GIntDestroy(temp3);
  2503.             GIntDivByInt(temp4, temp3, 8, i);
  2504.             If (temp3^.value Mod 2) = 0 Then ok1 := false Else ok1 := true;
  2505.             GIntDestroy(temp3);
  2506.             GIntDestroy(temp4);
  2507.             If ok1 = true Then L := L * (-1);
  2508.             GIntDivByInt(temp2, temp3, 2, i);
  2509.             GIntDestroy(temp2);
  2510.             temp2 := temp3;
  2511.          End
  2512.          Else
  2513.          Begin
  2514.             GIntSub(temp1, one, temp3);
  2515.             GIntSub(temp2, one, temp4);
  2516.             GIntMul(temp3, temp4, temp5);
  2517.             GIntDestroy(temp3);
  2518.             GIntDestroy(temp4);
  2519.             GIntDivByInt(temp5, temp3, 4, i);
  2520.             If (temp3^.value Mod 2) = 0 Then ok2 := false Else ok2 := true;
  2521.             GIntDestroy(temp5);
  2522.             GIntDestroy(temp3);
  2523.             If ok2 = true Then L := L * (-1);
  2524.             GIntMod(temp1, temp2, temp3);
  2525.             GIntDestroy(temp1);
  2526.             temp1 := temp2;
  2527.             temp2 := temp3;
  2528.          End;
  2529.       End;
  2530.       GIntDestroy(temp1);
  2531.       GIntDestroy(temp2);
  2532.    End;
  2533.    GIntDestroy(zero);
  2534.    GIntDestroy(one);
  2535. End;
  2536. End.