www.usr.com/support/gpl/USR9107_release.1.4.tar.gz
[bcm963xx.git] / userapps / opensource / sshd / libtommath / bn_mp_div_3.c
index 524531e..7cbafc1 100755 (executable)
@@ -1,64 +1,75 @@
-/* LibTomMath, multiple-precision integer library -- Tom St Denis\r
- *\r
- * LibTomMath is library that provides for multiple-precision\r
- * integer arithmetic as well as number theoretic functionality.\r
- *\r
- * The library is designed directly after the MPI library by\r
- * Michael Fromberger but has been written from scratch with\r
- * additional optimizations in place.\r
- *\r
- * The library is free for all purposes without any express\r
- * guarantee it works.\r
- *\r
- * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org\r
- */\r
-#include <tommath.h>\r
-\r
-/* divide by three (based on routine from MPI and the GMP manual) */\r
-int\r
-mp_div_3 (mp_int * a, mp_int *c, mp_digit * d)\r
-{\r
-  mp_int   q;\r
-  mp_word  w, t;\r
-  mp_digit b;\r
-  int      res, ix;\r
-  \r
-  /* b = 2**DIGIT_BIT / 3 */\r
-  b = (((mp_word)1) << ((mp_word)DIGIT_BIT)) / ((mp_word)3);\r
-\r
-  if ((res = mp_init_size(&q, a->used)) != MP_OKAY) {\r
-     return res;\r
-  }\r
-  \r
-  q.used = a->used;\r
-  q.sign = a->sign;\r
-  w = 0;\r
-  for (ix = a->used - 1; ix >= 0; ix--) {\r
-     w = (w << ((mp_word)DIGIT_BIT)) | ((mp_word)a->dp[ix]);\r
-     \r
-     if (w >= 3) {\r
-        t = (w * ((mp_word)b)) >> ((mp_word)DIGIT_BIT);\r
-        w -= (t << ((mp_word)1)) + t;\r
-        while (w >= 3) {\r
-           t += 1;\r
-           w -= 3;\r
-        }\r
-      } else {\r
-        t = 0;\r
-      }\r
-      q.dp[ix] = (mp_digit)t;\r
-  }\r
-  \r
-  if (d != NULL) {\r
-     *d = (mp_digit)w;\r
-  }\r
-  \r
-  if (c != NULL) {\r
-     mp_clamp(&q);\r
-     mp_exch(&q, c);\r
-  }\r
-  mp_clear(&q);\r
-  \r
-  return res;\r
-}\r
-\r
+#include <tommath.h>
+#ifdef BN_MP_DIV_3_C
+/* LibTomMath, multiple-precision integer library -- Tom St Denis
+ *
+ * LibTomMath is a library that provides multiple-precision
+ * integer arithmetic as well as number theoretic functionality.
+ *
+ * The library was designed directly after the MPI library by
+ * Michael Fromberger but has been written from scratch with
+ * additional optimizations in place.
+ *
+ * The library is free for all purposes without any express
+ * guarantee it works.
+ *
+ * Tom St Denis, tomstdenis@iahu.ca, http://math.libtomcrypt.org
+ */
+
+/* divide by three (based on routine from MPI and the GMP manual) */
+int
+mp_div_3 (mp_int * a, mp_int *c, mp_digit * d)
+{
+  mp_int   q;
+  mp_word  w, t;
+  mp_digit b;
+  int      res, ix;
+  
+  /* b = 2**DIGIT_BIT / 3 */
+  b = (((mp_word)1) << ((mp_word)DIGIT_BIT)) / ((mp_word)3);
+
+  if ((res = mp_init_size(&q, a->used)) != MP_OKAY) {
+     return res;
+  }
+  
+  q.used = a->used;
+  q.sign = a->sign;
+  w = 0;
+  for (ix = a->used - 1; ix >= 0; ix--) {
+     w = (w << ((mp_word)DIGIT_BIT)) | ((mp_word)a->dp[ix]);
+
+     if (w >= 3) {
+        /* multiply w by [1/3] */
+        t = (w * ((mp_word)b)) >> ((mp_word)DIGIT_BIT);
+
+        /* now subtract 3 * [w/3] from w, to get the remainder */
+        w -= t+t+t;
+
+        /* fixup the remainder as required since
+         * the optimization is not exact.
+         */
+        while (w >= 3) {
+           t += 1;
+           w -= 3;
+        }
+      } else {
+        t = 0;
+      }
+      q.dp[ix] = (mp_digit)t;
+  }
+
+  /* [optional] store the remainder */
+  if (d != NULL) {
+     *d = (mp_digit)w;
+  }
+
+  /* [optional] store the quotient */
+  if (c != NULL) {
+     mp_clamp(&q);
+     mp_exch(&q, c);
+  }
+  mp_clear(&q);
+  
+  return res;
+}
+
+#endif