nussbaumer_mul.c
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:2k
源码类别:

数学计算

开发平台:

Unix_Linux

  1. /* mpn_nussbaumer_mul -- Multiply {ap,an} and {bp,bn} using
  2.    Nussbaumer's negacyclic convolution.
  3.    Contributed to the GNU project by Marco Bodrato.
  4.    THE FUNCTION IN THIS FILE IS INTERNAL WITH A MUTABLE INTERFACE.  IT IS ONLY
  5.    SAFE TO REACH IT THROUGH DOCUMENTED INTERFACES.  IN FACT, IT IS ALMOST
  6.    GUARANTEED THAT IT WILL CHANGE OR DISAPPEAR IN A FUTURE GNU MP RELEASE.
  7. Copyright 2009 Free Software Foundation, Inc.
  8. This file is part of the GNU MP Library.
  9. The GNU MP Library is free software; you can redistribute it and/or modify
  10. it under the terms of the GNU Lesser General Public License as published by
  11. the Free Software Foundation; either version 3 of the License, or (at your
  12. option) any later version.
  13. The GNU MP Library is distributed in the hope that it will be useful, but
  14. WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  15. or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  16. License for more details.
  17. You should have received a copy of the GNU Lesser General Public License
  18. along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
  19. #include "gmp.h"
  20. #include "gmp-impl.h"
  21. /* Multiply {ap,an} by {bp,bn}, and put the result in {pp, an+bn} */
  22. void
  23. mpn_nussbaumer_mul (mp_ptr pp,
  24.     mp_srcptr ap, mp_size_t an,
  25.     mp_srcptr bp, mp_size_t bn)
  26. {
  27.   mp_size_t rn;
  28.   mp_ptr tp;
  29.   TMP_DECL;
  30.   ASSERT (an >= bn);
  31.   ASSERT (bn > 0);
  32.   TMP_MARK;
  33.   if ((ap == bp) && (an == bn))
  34.     {
  35.       rn = mpn_sqrmod_bnm1_next_size (2*an);
  36.       tp = TMP_ALLOC_LIMBS (mpn_sqrmod_bnm1_itch (rn, an));
  37.       mpn_sqrmod_bnm1 (pp, rn, ap, an, tp);
  38.     }
  39.   else
  40.     {
  41.       rn = mpn_mulmod_bnm1_next_size (an + bn);
  42.       tp = TMP_ALLOC_LIMBS (mpn_mulmod_bnm1_itch (rn, an, bn));
  43.       mpn_mulmod_bnm1 (pp, rn, ap, an, bp, bn, tp);
  44.     }
  45.   TMP_FREE;
  46. }