hilbert.cpp 853 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include "stdafx.h"
  2. //-----------------------------------------------------------------------------
  3. //
  4. // Create a Hilbert matrix
  5. //
  6. // Input: Dimension on stack
  7. //
  8. // Output: Hilbert matrix on stack
  9. //
  10. // Example:
  11. //
  12. // > hilbert(5)
  13. // ((1,1/2,1/3,1/4),(1/2,1/3,1/4,1/5),(1/3,1/4,1/5,1/6),(1/4,1/5,1/6,1/7))
  14. //
  15. //-----------------------------------------------------------------------------
  16. #include "defs.h"
  17. #define A p1
  18. #define N p2
  19. #define AELEM(i, j) A->u.tensor->elem[i * n + j]
  20. void
  21. hilbert(void)
  22. {
  23. int i, j, n;
  24. save();
  25. N = pop();
  26. push(N);
  27. n = pop_integer();
  28. if (n < 2) {
  29. push_symbol(HILBERT);
  30. push(N);
  31. list(2);
  32. restore();
  33. return;
  34. }
  35. push_zero_matrix(n, n);
  36. A = pop();
  37. for (i = 0; i < n; i++) {
  38. for (j = 0; j < n; j++) {
  39. push_integer(i + j + 1);
  40. inverse();
  41. AELEM(i, j) = pop();
  42. }
  43. }
  44. push(A);
  45. restore();
  46. }