You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

44 lines
987 B

25 years ago
25 years ago
  1. // cl_trialdivision().
  2. // General includes.
  3. #include "cl_sysdep.h"
  4. // Specification.
  5. #include "cl_IF.h"
  6. // Implementation.
  7. #include "cl_I.h"
  8. #if !(intDsize >= 16)
  9. #error "intDsize too small for trialdivision!"
  10. #endif
  11. namespace cln {
  12. uint32 cl_trialdivision (const cl_I& n, uint32 d1, uint32 d2)
  13. {
  14. var uintL i = cl_small_prime_table_search(d1);
  15. var const uint16 * ptr = &cl_small_prime_table[i];
  16. var const uint16 * ptr_limit = &cl_small_prime_table[cl_small_prime_table_search(d2+1)];
  17. // Unpack n.
  18. CL_ALLOCA_STACK;
  19. var const uintD* n_MSDptr;
  20. var uintC n_len;
  21. I_to_NDS_nocopy(n, n_MSDptr=,n_len=,,cl_false,);
  22. if (mspref(n_MSDptr,0)==0) { msshrink(n_MSDptr); n_len--; }
  23. // Make room for a quotient.
  24. var uintD* q_MSDptr;
  25. num_stack_alloc(n_len,q_MSDptr=,);
  26. // Division loop.
  27. for ( ; ptr < ptr_limit; ptr++) {
  28. var uint32 prime = *ptr;
  29. var uintD r = divucopy_loop_msp(prime,n_MSDptr,q_MSDptr,n_len);
  30. if (r == 0)
  31. return prime;
  32. }
  33. return 0;
  34. }
  35. } // namespace cln