Advertisement
Guest User

Untitled

a guest
Dec 21st, 2014
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.10 KB | None | 0 0
  1. var Ver36 = function() {
  2. "use strict";
  3. var N = 18, N2 = N*2;
  4. var d18_op; // D18 group operation table
  5. var d18_inv; // D18 group inverse
  6. var perm; // the permutation decomposed into cycles
  7. var a2i,i2a; // ASCII translation tables
  8. var NA=0xff; // invalid digit marker in ASCII table
  9.  
  10. // initialization code
  11. (function() {
  12. var A8 = typeof Uint8Array != 'undefined' ? Uint8Array : Array;
  13. // prepare Cayley table for D18 group
  14. d18_op = new A8(N2*N2);
  15. var i, j;
  16. for (i = 0; i < N; i++)
  17. for (j = 0; j < N; j++)
  18. d18_op[N2*i+j] = (i + j) % N;
  19. for (i = 0; i < N; i++)
  20. for (j = N; j < N2; j++)
  21. d18_op[N2*i+j] = N + (i + j) % N;
  22. for (i = N; i < N2; i++)
  23. for (j = 0; j < N; j++)
  24. d18_op[N2*i+j] = N + (i - j) % N;
  25. for (i = N; i < N2; i++)
  26. for (j = N; j < N2; j++)
  27. d18_op[N2*i+j] = (N + i - j) % N;
  28. // prepare inverse element table
  29. d18_inv = new A8(N2);
  30. d18_inv[0] = 0;
  31. for (i = 1; i < N; i++)
  32. d18_inv[i] = N - i;
  33. for (i = N; i < N2; i++)
  34. d18_inv[i] = i;
  35. // decompose permutation cycles
  36. perm = new Array(N2);
  37. var p = [ // the permutation
  38. 29,0,32,11,35,20,7,27,2,4,19,28,30,1,5,12,3,9,16,
  39. 22,6,33,8,24,26,21,14,10,34,31,15,25,17,13,23,18
  40. ], b = new A8(N2); // assert p.length == N2
  41. i = 0;
  42. while (i < b.length) {
  43. var h = [null], c = h, l = 0;
  44. while (!b[i]) {
  45. var cc = [null, p[i]];
  46. c[0] = cc; c = cc;
  47. b[i] = true;
  48. i = p[i];
  49. l++;
  50. }
  51. c[0] = h[0];
  52. for (var j = 0; j < l; j++) {
  53. var pp = perm[c[1]] = new A8(l);
  54. for (var k = 0; k < l; k++) {
  55. pp[k] = c[1];
  56. c = c[0];
  57. }
  58. c = c[0];
  59. }
  60. for (i = 0; i < b.length && b[i]; i++) {}
  61. }
  62. // set up translation tables
  63. a2i = new A8(256);
  64. for (i = 0; i < a2i.length; i++) a2i[i] = NA;
  65. for (i = 0x30; i < 0x3a; i++) a2i[i] = i - 0x30;
  66. for (i = 0x41; i < 0x5b; i++) a2i[i] = i - 0x41 + 10;
  67. for (i = 0x61; i < 0x7b; i++) a2i[i] = i - 0x61 + 10;
  68. i2a = new A8(N2);
  69. for (i = 0; i < 10; i++) i2a[i] = i + 0x30;
  70. for (i = 10; i < N2; i++) i2a[i] = i + 0x41 - 10;
  71. })();
  72.  
  73. // group operation
  74. var op = function(i, j) {
  75. return d18_op[N2*i+j];
  76. }
  77.  
  78. // compute n-th application of the permutation
  79. var nperm = function(i, n) {
  80. return perm[i][n % perm[i].length];
  81. }
  82.  
  83. // verify correctness of check digit
  84. var verify = function(str) {
  85. var i = 0, c = 0, l = str.length;
  86. while (l--) {
  87. var ch = a2i[str.charCodeAt(l) & 0xff];
  88. if (ch != NA)
  89. c = op(c,nperm(ch,i++));
  90. }
  91. return c;
  92. }
  93.  
  94. // Create new check digit
  95. var create = function(str) {
  96. var i = 1, c = 0, l = str.length;
  97. while (l--) {
  98. var ch = a2i[str.charCodeAt(l) & 0xff];
  99. if (ch != NA)
  100. c = op(c,nperm(ch,i++));
  101. }
  102. return i2a[d18_inv[c]];
  103. }
  104.  
  105. // Append check digit to given string
  106. var append = function(str) {
  107. return str + String.fromCharCode(create(str));
  108. }
  109.  
  110. // export functions
  111. return {
  112. 'verify': verify,
  113. 'create': create,
  114. 'append': append
  115. };
  116. }();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement