Advertisement
Guest User

Untitled

a guest
Oct 25th, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.96 KB | None | 0 0
  1. import Kernel, except: [+: 1, +: 2, -: 1, -: 2, *: 2, /: 2]
  2. defprotocol Arithmetic do
  3. def left + right
  4. def left - right
  5. def left * right
  6. def left / right
  7. def +value
  8. def -value
  9. end
  10.  
  11. defimpl Arithmetic, for: Integer do
  12. def left + right, do: Kernel.+(left , right)
  13. def left - right, do: Kernel.-(left , right)
  14. def left * right, do: Kernel.*(left , right)
  15. def left / right, do: Kernel./(left , right)
  16. def +value, do: Kernel.+(value)
  17. def -value, do: Kernel.-(value)
  18. end
  19.  
  20. defimpl Arithmetic, for: Integer do
  21. def left + right, do: Kernel.+(left , right)
  22. def left - right, do: Kernel.-(left , right)
  23. def left * right, do: Kernel.*(left , right)
  24. def left / right, do: Kernel./(left , right)
  25. def +value, do: Kernel.+(value)
  26. def -value, do: Kernel.-(value)
  27. end
  28.  
  29. defmodule DualNumber do
  30. import Arithmetic
  31. defstruct a: 0, b: 0
  32.  
  33. def conj(d) do
  34. %DualNumber{ a: d.a, b: -d.b}
  35. end
  36.  
  37. defimpl Inspect do
  38. def inspect(%DualNumber{a: a, b: b}, _opts) do
  39. "#{a}+#{b}ล’ยต"
  40. end
  41. end
  42. end
  43.  
  44. defimpl Arithmetic, for: DualNumber do
  45. def left + right do
  46. %DualNumber{ a: Kernel.+(left.a, right.a),
  47. b: Kernel.+(left.b, right.b) }
  48. end
  49.  
  50. def left - right do
  51. %DualNumber{ a: Kernel.-(left.a, right.a),
  52. b: Kernel.-(left.b, right.b) }
  53. end
  54.  
  55. def left * right do
  56. %DualNumber{ a: Kernel.*(left.a, right.a),
  57. b: Kernel.+(Kernel.*(left.a, right.b), Kernel.*(left.b, right.a)) }
  58.  
  59. end
  60.  
  61. def left / right do
  62. (left * %DualNumber{a: right.a, b: Kernel.-(right.b)}) / %DualNumber{a: Kernel.*(right.a, right.a), b: 0}
  63. end
  64.  
  65. def +value, do: value
  66. def -value, do: %DualNumber{a: Kernel.-(value.a), b: Kernel.-(value.b)}
  67. end
  68.  
  69. defmodule Test do
  70. import Arithmetic
  71. import DualNumber
  72. def f(x) do
  73. (%DualNumber{a: 4, b: 0} * x + %DualNumber{a: 3, b: 0}) * x + %DualNumber{a: 2, b: 0}
  74. end
  75.  
  76. def df(x) do
  77. %DualNumber{a: 8, b: 0} * x + %DualNumber{a: 3, b: 0}
  78. end
  79.  
  80. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement