is.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473
  1. #include "stdafx.h"
  2. #include "defs.h"
  3. int
  4. iszero(U *p)
  5. {
  6. int i;
  7. switch (p->k) {
  8. case NUM:
  9. if (MZERO(p->u.q.a))
  10. return 1;
  11. break;
  12. case DOUBLE:
  13. if (p->u.d == 0.0)
  14. return 1;
  15. break;
  16. case TENSOR:
  17. for (i = 0; i < p->u.tensor->nelem; i++)
  18. if (!iszero(p->u.tensor->elem[i]))
  19. return 0;
  20. return 1;
  21. default:
  22. break;
  23. }
  24. return 0;
  25. }
  26. int
  27. isnegativenumber(U *p)
  28. {
  29. switch (p->k) {
  30. case NUM:
  31. if (MSIGN(p->u.q.a) == -1)
  32. return 1;
  33. break;
  34. case DOUBLE:
  35. if (p->u.d < 0.0)
  36. return 1;
  37. break;
  38. default:
  39. break;
  40. }
  41. return 0;
  42. }
  43. int
  44. isplusone(U *p)
  45. {
  46. switch (p->k) {
  47. case NUM:
  48. if (MEQUAL(p->u.q.a, 1) && MEQUAL(p->u.q.b, 1))
  49. return 1;
  50. break;
  51. case DOUBLE:
  52. if (p->u.d == 1.0)
  53. return 1;
  54. break;
  55. default:
  56. break;
  57. }
  58. return 0;
  59. }
  60. int
  61. isminusone(U *p)
  62. {
  63. switch (p->k) {
  64. case NUM:
  65. if (MEQUAL(p->u.q.a, -1) && MEQUAL(p->u.q.b, 1))
  66. return 1;
  67. break;
  68. case DOUBLE:
  69. if (p->u.d == -1.0)
  70. return 1;
  71. break;
  72. default:
  73. break;
  74. }
  75. return 0;
  76. }
  77. int
  78. isinteger(U *p)
  79. {
  80. if (p->k == NUM && MEQUAL(p->u.q.b, 1))
  81. return 1;
  82. else
  83. return 0;
  84. }
  85. int
  86. isnonnegativeinteger(U *p)
  87. {
  88. if (isrational(p) && MEQUAL(p->u.q.b, 1) && MSIGN(p->u.q.a) == 1)
  89. return 1;
  90. else
  91. return 0;
  92. }
  93. int
  94. isposint(U *p)
  95. {
  96. if (isinteger(p) && MSIGN(p->u.q.a) == 1)
  97. return 1;
  98. else
  99. return 0;
  100. }
  101. int
  102. ispoly(U *p, U *x)
  103. {
  104. if (find(p, x))
  105. return ispoly_expr(p, x);
  106. else
  107. return 0;
  108. }
  109. int
  110. ispoly_expr(U *p, U *x)
  111. {
  112. if (car(p) == symbol(ADD)) {
  113. p = cdr(p);
  114. while (iscons(p)) {
  115. if (!ispoly_term(car(p), x))
  116. return 0;
  117. p = cdr(p);
  118. }
  119. return 1;
  120. } else
  121. return ispoly_term(p, x);
  122. }
  123. int
  124. ispoly_term(U *p, U *x)
  125. {
  126. if (car(p) == symbol(MULTIPLY)) {
  127. p = cdr(p);
  128. while (iscons(p)) {
  129. if (!ispoly_factor(car(p), x))
  130. return 0;
  131. p = cdr(p);
  132. }
  133. return 1;
  134. } else
  135. return ispoly_factor(p, x);
  136. }
  137. int
  138. ispoly_factor(U *p, U *x)
  139. {
  140. if (equal(p, x))
  141. return 1;
  142. if (car(p) == symbol(POWER) && equal(cadr(p), x)) {
  143. if (isposint(caddr(p)))
  144. return 1;
  145. else
  146. return 0;
  147. }
  148. if (find(p, x))
  149. return 0;
  150. else
  151. return 1;
  152. }
  153. int
  154. isnegativeterm(U *p)
  155. {
  156. if (isnegativenumber(p))
  157. return 1;
  158. else if (car(p) == symbol(MULTIPLY) && isnegativenumber(cadr(p)))
  159. return 1;
  160. else
  161. return 0;
  162. }
  163. int
  164. isimaginarynumber(U *p)
  165. {
  166. if ((car(p) == symbol(MULTIPLY)
  167. && length(p) == 3
  168. && isnum(cadr(p))
  169. && equal(caddr(p), imaginaryunit))
  170. || equal(p, imaginaryunit))
  171. return 1;
  172. else
  173. return 0;
  174. }
  175. int
  176. iscomplexnumber(U *p)
  177. {
  178. if ((car(p) == symbol(ADD)
  179. && length(p) == 3
  180. && isnum(cadr(p))
  181. && isimaginarynumber(caddr(p)))
  182. || isimaginarynumber(p))
  183. return 1;
  184. else
  185. return 0;
  186. }
  187. int
  188. iseveninteger(U *p)
  189. {
  190. if (isinteger(p) && (p->u.q.a[0] & 1) == 0)
  191. return 1;
  192. else
  193. return 0;
  194. }
  195. int
  196. isnegative(U *p)
  197. {
  198. if (car(p) == symbol(ADD) && isnegativeterm(cadr(p)))
  199. return 1;
  200. else if (isnegativeterm(p))
  201. return 1;
  202. else
  203. return 0;
  204. }
  205. // returns 1 if there's a symbol somewhere
  206. int
  207. issymbolic(U *p)
  208. {
  209. if (issymbol(p))
  210. return 1;
  211. else {
  212. while (iscons(p)) {
  213. if (issymbolic(car(p)))
  214. return 1;
  215. p = cdr(p);
  216. }
  217. return 0;
  218. }
  219. }
  220. // i.e. 2, 2^3, etc.
  221. int
  222. isintegerfactor(U *p)
  223. {
  224. if (isinteger(p) || car(p) == symbol(POWER)
  225. && isinteger(cadr(p))
  226. && isinteger(caddr(p)))
  227. return 1;
  228. else
  229. return 0;
  230. }
  231. int
  232. isoneover(U *p)
  233. {
  234. if (car(p) == symbol(POWER)
  235. && isminusone(caddr(p)))
  236. return 1;
  237. else
  238. return 0;
  239. }
  240. int
  241. isfraction(U *p)
  242. {
  243. if (p->k == NUM && !MEQUAL(p->u.q.b, 1))
  244. return 1;
  245. else
  246. return 0;
  247. }
  248. int
  249. equaln(U *p, int n)
  250. {
  251. switch (p->k) {
  252. case NUM:
  253. if (MEQUAL(p->u.q.a, n) && MEQUAL(p->u.q.b, 1))
  254. return 1;
  255. break;
  256. case DOUBLE:
  257. if (p->u.d == (double) n)
  258. return 1;
  259. break;
  260. default:
  261. break;
  262. }
  263. return 0;
  264. }
  265. int
  266. equalq(U *p, int a, int b)
  267. {
  268. switch (p->k) {
  269. case NUM:
  270. if (MEQUAL(p->u.q.a, a) && MEQUAL(p->u.q.b, b))
  271. return 1;
  272. break;
  273. case DOUBLE:
  274. if (p->u.d == (double) a / b)
  275. return 1;
  276. break;
  277. default:
  278. break;
  279. }
  280. return 0;
  281. }
  282. // p == 1/sqrt(2) ?
  283. int
  284. isoneoversqrttwo(U *p)
  285. {
  286. if (car(p) == symbol(POWER)
  287. && equaln(cadr(p), 2)
  288. && equalq(caddr(p), -1, 2))
  289. return 1;
  290. else
  291. return 0;
  292. }
  293. // p == -1/sqrt(2) ?
  294. int
  295. isminusoneoversqrttwo(U *p)
  296. {
  297. if (car(p) == symbol(MULTIPLY)
  298. && equaln(cadr(p), -1)
  299. && isoneoversqrttwo(caddr(p))
  300. && length(p) == 3)
  301. return 1;
  302. else
  303. return 0;
  304. }
  305. int
  306. isfloating(U *p)
  307. {
  308. if (p->k == DOUBLE)
  309. return 1;
  310. while (iscons(p)) {
  311. if (isfloating(car(p)))
  312. return 1;
  313. p = cdr(p);
  314. }
  315. return 0;
  316. }
  317. int
  318. isimaginaryunit(U *p)
  319. {
  320. if (equal(p, imaginaryunit))
  321. return 1;
  322. else
  323. return 0;
  324. }
  325. // n/2 * i * pi ?
  326. // return value:
  327. // 0 no
  328. // 1 1
  329. // 2 -1
  330. // 3 i
  331. // 4 -i
  332. int
  333. isquarterturn(U *p)
  334. {
  335. int n, minussign = 0;
  336. if (car(p) != symbol(MULTIPLY))
  337. return 0;
  338. if (equal(cadr(p), imaginaryunit)) {
  339. if (caddr(p) != symbol(PI))
  340. return 0;
  341. if (length(p) != 3)
  342. return 0;
  343. return 2;
  344. }
  345. if (!isnum(cadr(p)))
  346. return 0;
  347. if (!equal(caddr(p), imaginaryunit))
  348. return 0;
  349. if (cadddr(p) != symbol(PI))
  350. return 0;
  351. if (length(p) != 4)
  352. return 0;
  353. push(cadr(p));
  354. push_integer(2);
  355. multiply();
  356. n = pop_integer();
  357. if (n == (int) 0x80000000)
  358. return 0;
  359. if (n < 1) {
  360. minussign = 1;
  361. n = -n;
  362. }
  363. switch (n % 4) {
  364. case 0:
  365. n = 1;
  366. break;
  367. case 1:
  368. if (minussign)
  369. n = 4;
  370. else
  371. n = 3;
  372. break;
  373. case 2:
  374. n = 2;
  375. break;
  376. case 3:
  377. if (minussign)
  378. n = 3;
  379. else
  380. n = 4;
  381. break;
  382. }
  383. return n;
  384. }
  385. // special multiple of pi?
  386. // returns for the following multiples of pi...
  387. // -4/2 -3/2 -2/2 -1/2 1/2 2/2 3/2 4/2
  388. // 4 1 2 3 1 2 3 4
  389. int
  390. isnpi(U *p)
  391. {
  392. int n;
  393. if (p == symbol(PI))
  394. return 2;
  395. if (car(p) == symbol(MULTIPLY)
  396. && isnum(cadr(p))
  397. && caddr(p) == symbol(PI)
  398. && length(p) == 3)
  399. ;
  400. else
  401. return 0;
  402. push(cadr(p));
  403. push_integer(2);
  404. multiply();
  405. n = pop_integer();
  406. if (n == (int) 0x80000000)
  407. return 0;
  408. if (n < 0)
  409. n = 4 - (-n) % 4;
  410. else
  411. n = 1 + (n - 1) % 4;
  412. return n;
  413. }