ReducedRowEchelonFormTest.php 29 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091
  1. <?php
  2. namespace MathPHP\Tests\LinearAlgebra\Reduction;
  3. use MathPHP\LinearAlgebra\MatrixFactory;
  4. use MathPHP\LinearAlgebra\NumericMatrix;
  5. use MathPHP\LinearAlgebra\Reduction;
  6. use MathPHP\Tests;
  7. class ReducedRowEchelonFormTest extends \PHPUnit\Framework\TestCase
  8. {
  9. use Tests\LinearAlgebra\Fixture\MatrixDataProvider;
  10. /**
  11. * @test RREF
  12. * @dataProvider dataProviderForRref
  13. * @param array $A
  14. * @param array $R
  15. * @throws \Exception
  16. */
  17. public function testRref(array $A, array $R)
  18. {
  19. // Given
  20. $A = MatrixFactory::create($A);
  21. $R = MatrixFactory::create($R);
  22. // When
  23. $rref = $A->rref();
  24. // Then
  25. $this->assertEqualsWithDelta($R->getMatrix(), $rref->getMatrix(), 0.000001);
  26. $this->assertTrue($rref->isRref());
  27. $this->assertTrue($rref->isRef());
  28. }
  29. /**
  30. * @test RREF directly
  31. * @dataProvider dataProviderForRref
  32. * @param array $A
  33. * @param array $R
  34. * @throws \Exception
  35. */
  36. public function testRrefDirectly(array $A, array $R)
  37. {
  38. // Given
  39. $A = MatrixFactory::create($A);
  40. $R = MatrixFactory::create($R);
  41. // When
  42. $rref = Reduction\ReducedRowEchelonForm::reduce($A);
  43. // Then
  44. $this->assertEqualsWithDelta($R->getMatrix(), $rref->getMatrix(), 0.000001);
  45. $this->assertTrue($rref->isRref());
  46. $this->assertTrue($rref->isRef());
  47. }
  48. /**
  49. * @return array
  50. */
  51. public function dataProviderForRref(): array
  52. {
  53. return [
  54. [
  55. [
  56. [1, 2, 3],
  57. [2, 3, 4],
  58. [3, 4, 5],
  59. ],
  60. [
  61. [1, 0, -1],
  62. [0, 1, 2],
  63. [0, 0, 0],
  64. ],
  65. ],
  66. [
  67. [
  68. [1, 3, -1],
  69. [0, 1, 7],
  70. ],
  71. [
  72. [1, 0, -22],
  73. [0, 1, 7],
  74. ],
  75. ],
  76. [
  77. [
  78. [1, 2, 1],
  79. [-2, -3, 1],
  80. [3, 5, 0],
  81. ],
  82. [
  83. [1, 0, -5],
  84. [0, 1, 3],
  85. [0, 0, 0],
  86. ],
  87. ],
  88. [
  89. [
  90. [0, 3, -6, 6, 4, -5],
  91. [3, -7, 8, -5, 8, 9],
  92. [3, -9, 12, -9, 6, 15],
  93. ],
  94. [
  95. [1, 0, -2, 3, 0, -24],
  96. [0, 1, -2, 2, 0, -7],
  97. [0, 0, 0, 0, 1, 4],
  98. ],
  99. ],
  100. [
  101. [
  102. [0, 2, 8, -7],
  103. [2, -2, 4, 0],
  104. [-3, 4, -2, -5],
  105. ],
  106. [
  107. [1, 0, 6, 0],
  108. [0, 1, 4, 0],
  109. [0, 0, 0, 1],
  110. ],
  111. ],
  112. [
  113. [
  114. [1, -2, 3, 9],
  115. [-1, 3, 0, -4],
  116. [2, -5, 5, 17],
  117. ],
  118. [
  119. [1, 0, 0, 1],
  120. [0, 1, 0, -1],
  121. [0, 0, 1, 2],
  122. ],
  123. ],
  124. [
  125. [
  126. [1, 0, -2, 1, 0],
  127. [0, -1, -3, 1, 3],
  128. [-2, -1, 1, -1, 3],
  129. [0, 3, 9, 0, -12],
  130. ],
  131. [
  132. [1, 0, -2, 0, 1],
  133. [0, 1, 3, 0, -4],
  134. [0, 0, 0, 1, -1],
  135. [0, 0, 0, 0, 0],
  136. ],
  137. ],
  138. [
  139. [
  140. [1, 1, 4, 1, 2],
  141. [0, 1, 2, 1, 1],
  142. [0, 0, 0, 1, 2],
  143. [1, -1, 0, 0, 2],
  144. [2, 1, 6, 0, 1],
  145. ],
  146. [
  147. [1, 0, 2, 0, 1],
  148. [0, 1, 2, 0, -1],
  149. [0, 0, 0, 1, 2],
  150. [0, 0, 0, 0, 0],
  151. [0, 0, 0, 0, 0],
  152. ],
  153. ],
  154. [
  155. [
  156. [1, 2, 0, -1, 1, -10],
  157. [1, 3, 1, 1, -1, -9],
  158. [2, 5, 1, 0, 0, -19],
  159. [3, 6, 0, 0, -6, -27],
  160. [1, 5, 3, 5, -5, -7],
  161. ],
  162. [
  163. [1, 0, -2, 0, -10, -7],
  164. [0, 1, 1, 0, 4, -1],
  165. [0, 0, 0, 1, -3, 1],
  166. [0, 0, 0, 0, 0, 0],
  167. [0, 0, 0, 0, 0, 0],
  168. ],
  169. ],
  170. [
  171. [
  172. [-4, 3, 1, 5, -8],
  173. [6, 0, 9, 2, 6],
  174. [-1, 4, 4, 0, 2],
  175. [8, -1, 3, 4, 0],
  176. [5, 9, -7, -7, 1],
  177. ],
  178. [
  179. [1, 0, 0, 0, 0],
  180. [0, 1, 0, 0, 0],
  181. [0, 0, 1, 0, 0],
  182. [0, 0, 0, 1, 0],
  183. [0, 0, 0, 0, 1],
  184. ],
  185. ],
  186. [
  187. [
  188. [4, 7],
  189. [2, 6],
  190. ],
  191. [
  192. [1, 0],
  193. [0, 1],
  194. ],
  195. ],
  196. [
  197. [
  198. [4, 3],
  199. [3, 2],
  200. ],
  201. [
  202. [1, 0],
  203. [0, 1],
  204. ],
  205. ],
  206. [
  207. [
  208. [1, 2],
  209. [3, 4],
  210. ],
  211. [
  212. [1, 0],
  213. [0, 1],
  214. ],
  215. ],
  216. [
  217. [
  218. [3, 1],
  219. [3, 4],
  220. ],
  221. [
  222. [1, 0],
  223. [0, 1],
  224. ],
  225. ],
  226. [
  227. [
  228. [1, 2, 3],
  229. [0, 4, 5],
  230. [1, 0, 6],
  231. ],
  232. [
  233. [1, 0, 0],
  234. [0, 1, 0],
  235. [0, 0, 1],
  236. ],
  237. ],
  238. [
  239. [
  240. [7, 2, 1],
  241. [0, 3, -1],
  242. [-3, 4, -2],
  243. ],
  244. [
  245. [1, 0, 0],
  246. [0, 1, 0],
  247. [0, 0, 1],
  248. ],
  249. ],
  250. [
  251. [
  252. [3, 6, 6, 8],
  253. [4, 5, 3, 2],
  254. [2, 2, 2, 3],
  255. [6, 8, 4, 2],
  256. ],
  257. [
  258. [1, 0, 0, 0],
  259. [0, 1, 0, 0],
  260. [0, 0, 1, 0],
  261. [0, 0, 0, 1],
  262. ],
  263. ],
  264. [
  265. [
  266. [0, 0],
  267. [0, 1],
  268. ],
  269. [
  270. [0, 1],
  271. [0, 0],
  272. ],
  273. ],
  274. [
  275. [
  276. [1, 1, 1, 1, 1],
  277. [0, 1, 1, 1, 1],
  278. [0, 0, 0, 0, 1],
  279. ],
  280. [
  281. [1, 0, 0, 0, 0],
  282. [0, 1, 1, 1, 0],
  283. [0, 0, 0 ,0, 1],
  284. ],
  285. ],
  286. [
  287. [
  288. [0, 0],
  289. [1, 1],
  290. [-1, 0],
  291. [0, -1],
  292. [0, 0],
  293. [0, 0],
  294. [0, 0],
  295. [0, 0],
  296. [1, 1],
  297. ],
  298. [
  299. [1, 0],
  300. [0, 1],
  301. [0, 0],
  302. [0, 0],
  303. [0, 0],
  304. [0, 0],
  305. [0, 0],
  306. [0, 0],
  307. [0, 0],
  308. ],
  309. ],
  310. [
  311. [
  312. [1, 2, 3, 4, 3, 1],
  313. [2, 4, 6, 2, 6, 2],
  314. [3, 6, 18, 9, 9, -6],
  315. [4, 8, 12, 10, 12, 4],
  316. [5, 10, 24, 11, 15, -4],
  317. ],
  318. [
  319. [1, 2, 0, 0, 3, 4],
  320. [0, 0, 1, 0, 0, -1],
  321. [0, 0, 0, 1, 0, 0],
  322. [0, 0, 0, 0, 0, 0],
  323. [0, 0, 0, 0, 0, 0],
  324. ],
  325. ],
  326. [
  327. [
  328. [1, 2, 3, 4, 3, 1],
  329. [2, 4, 6, 2, 6, 2],
  330. [3, 6, 18, 9, 9, -6],
  331. [4, 8, 12, 10, 12, 4],
  332. [5, 10, 24, 11, 15, -4]
  333. ],
  334. [
  335. [1, 2, 0, 0, 3, 4],
  336. [0, 0, 1, 0, 0, -1],
  337. [0, 0, 0, 1, 0, 0],
  338. [0, 0, 0, 0, 0, 0],
  339. [0, 0, 0, 0, 0, 0],
  340. ],
  341. ],
  342. [
  343. [
  344. [0, 1],
  345. [1, 2],
  346. [0, 5],
  347. ],
  348. [
  349. [1, 0],
  350. [0, 1],
  351. [0, 0],
  352. ],
  353. ],
  354. [
  355. [
  356. [1, 0, 1, 0, 1, 0],
  357. [1, 0, 1, 0, 0, 1],
  358. [1, 0, 0, 1, 1, 0],
  359. [1, 0, 0, 1, 0, 1],
  360. [0, 1, 0, 1, 1, 0],
  361. [0, 1, 0, 1, 0, 1],
  362. [0, 1, 1, 0, 1, 0],
  363. [0, 1, 1, 0, 0, 1],
  364. ],
  365. [
  366. [1, 0, 0, 1, 0, 1],
  367. [0, 1, 0, 1, 0, 1],
  368. [0, 0, 1, -1, 0, 0],
  369. [0, 0, 0, 0, 1, -1],
  370. [0, 0, 0, 0, 0, 0],
  371. [0, 0, 0, 0, 0, 0],
  372. [0, 0, 0, 0, 0, 0],
  373. [0, 0, 0, 0, 0, 0],
  374. ],
  375. ],
  376. [
  377. [
  378. [3, -4, 2],
  379. [-2, 6, 2],
  380. [4, 2, 10],
  381. ],
  382. [
  383. [1, 0, 2],
  384. [0, 1, 1],
  385. [0, 0, 0],
  386. ],
  387. ],
  388. [
  389. [
  390. [3, 4, 2],
  391. [-2, 6, 2],
  392. [4, 2, 10],
  393. ],
  394. [
  395. [1, 0, 0],
  396. [0, 1, 0],
  397. [0, 0, 1],
  398. ],
  399. ],
  400. [
  401. [
  402. [3, -4, 2],
  403. [2, 6, 2],
  404. [4, 2, 10],
  405. ],
  406. [
  407. [1, 0, 0],
  408. [0, 1, 0],
  409. [0, 0, 1],
  410. ],
  411. ],
  412. [
  413. [
  414. [3, -4, 2],
  415. [2, 6, 2],
  416. [-4, 2, 10],
  417. ],
  418. [
  419. [1, 0, 0],
  420. [0, 1, 0],
  421. [0, 0, 1],
  422. ],
  423. ],
  424. [
  425. [
  426. [3, -4, 2],
  427. [-2, 6, 2],
  428. [-4, 2, 10],
  429. ],
  430. [
  431. [1, 0, 0],
  432. [0, 1, 0],
  433. [0, 0, 1],
  434. ],
  435. ],
  436. [
  437. [
  438. [-3, -4, 2],
  439. [-2, 6, 2],
  440. [4, 2, 10],
  441. ],
  442. [
  443. [1, 0, 0],
  444. [0, 1, 0],
  445. [0, 0, 1],
  446. ],
  447. ],
  448. [
  449. [
  450. [2, 0, -1, 0, 0],
  451. [1, 0, 0, -1, 0],
  452. [3, 0, 0, -2, -1],
  453. [0, 1, 0, 0, -2],
  454. [0, 1, -1, 0, 0]
  455. ],
  456. [
  457. [1, 0, 0, 0, -1],
  458. [0, 1, 0, 0, -2],
  459. [0, 0, 1, 0, -2],
  460. [0, 0, 0, 1, -1],
  461. [0, 0, 0, 0, 0],
  462. ],
  463. ],
  464. [
  465. [
  466. [2, -1, 4, 3, 2, 3, 4, 4],
  467. [-1, 2, 3, 2, 1, 2, 3, 3],
  468. [4, 3, 2, 1, 2, 3, 4, 4],
  469. [2, 1, 2, 1, 2, 1, 2, 2],
  470. [3, 2, 3, 2, 1, 2, 3, 3],
  471. [3, 2, 3, 2, 1, 2, 1, 2],
  472. [4, 3, 4, 3, 2, 1, 2, 2],
  473. [4, 3, 4, 3, 2, 2, 2, 2],
  474. ],
  475. [
  476. [1, 0, 0, 0, 0, 0, 0, 0],
  477. [0, 1, 0, 0, 0, 0, 0, 0],
  478. [0, 0, 1, 0, 0, 0, 0, 0],
  479. [0, 0, 0, 1, 0, 0, 0, 0],
  480. [0, 0, 0, 0, 1, 0, 0, 0],
  481. [0, 0, 0, 0, 0, 1, 0, 0],
  482. [0, 0, 0, 0, 0, 0, 1, 0],
  483. [0, 0, 0, 0, 0, 0, 0, 1],
  484. ],
  485. ],
  486. [
  487. [
  488. [5, -7, 6],
  489. [-9, 5, 5],
  490. [1, 3, 11],
  491. ],
  492. [
  493. [1, 0, 0],
  494. [0, 1, 0],
  495. [0, 0, 1],
  496. ],
  497. ],
  498. [
  499. [
  500. [1, 2, 3, 0, 0, 0],
  501. [0, 0, 1, 1, 0, 1],
  502. [0, 0, 0, 1, 1, 1],
  503. ],
  504. [
  505. [1, 2, 0, 0, 3, 0],
  506. [0, 0, 1, 0, -1, 0],
  507. [0, 0, 0, 1, 1, 1],
  508. ],
  509. ],
  510. [
  511. [
  512. [1, 2, 1],
  513. [-2, -3, 1],
  514. [3, 5, 0]
  515. ],
  516. [
  517. [1, 0, -5],
  518. [0, 1, 3],
  519. [0, 0, 0],
  520. ],
  521. ],
  522. [
  523. [
  524. [-7, -6, -12, -33],
  525. [5, 5, 7, 24],
  526. [1, 0, 4, 5],
  527. ],
  528. [
  529. [1, 0, 0, -3],
  530. [0, 1, 0, 5],
  531. [0, 0, 1, 2],
  532. ],
  533. ],
  534. [
  535. [
  536. [1, -1, 2, 1],
  537. [2, 1, 1, 8],
  538. [1, 1, 0, 5],
  539. ],
  540. [
  541. [1, 0, 1, 3],
  542. [0, 1, -1, 2],
  543. [0, 0, 0, 0],
  544. ],
  545. ],
  546. [
  547. [
  548. [2, 1, 7, -7, 2],
  549. [-3, 4, -5, -6, 3],
  550. [1, 1, 4, -5, 2],
  551. ],
  552. [
  553. [1, 0, 3, -2, 0],
  554. [0, 1, 1, -3, 0],
  555. [0, 0, 0, 0, 1],
  556. ],
  557. ],
  558. [
  559. [
  560. [2, -3, 1, 7, 14],
  561. [2, 8, -4, 5, -1],
  562. [1, 3, -3, 0, 4],
  563. [-5, 2, 3, 4, -19],
  564. ],
  565. [
  566. [1, 0, 0, 0, 1],
  567. [0, 1, 0, 0, -3],
  568. [0, 0, 1, 0, -4],
  569. [0, 0, 0, 1, 1],
  570. ],
  571. ],
  572. [
  573. [
  574. [3, 4, -1, 2, 6],
  575. [1, -2, 3, 1, 2],
  576. [0, 10, -10, -1, 1],
  577. ],
  578. [
  579. [1, 0, 1, 4 / 5, 0],
  580. [0, 1, -1, -1 / 10, 0],
  581. [0, 0, 0, 0, 1],
  582. ],
  583. ],
  584. [
  585. [
  586. [2, 4, 5, 7, -26],
  587. [1, 2, 1, -1, -4],
  588. [-2, -4, 1, 11, -10],
  589. ],
  590. [
  591. [1, 2, 0, -4, 2],
  592. [0, 0, 1, 3, -6],
  593. [0, 0, 0, 0 ,0],
  594. ],
  595. ],
  596. [
  597. [
  598. [1, 2, 8, -7, -2],
  599. [3, 2, 12, -5, 6],
  600. [-1, 1, 1, -5, -10],
  601. ],
  602. [
  603. [1, 0, 2, 1, 0],
  604. [0, 1, 3, -4, 0],
  605. [0, 0, 0, 0, 1],
  606. ],
  607. ],
  608. [
  609. [
  610. [2, 1, 7, -2, 4],
  611. [3, -2, 0, 11, 13],
  612. [1, 1, 5, -3, 1],
  613. ],
  614. [
  615. [1, 0, 2, 1, 3],
  616. [0, 1, 3, -4, -2],
  617. [0, 0, 0, 0, 0],
  618. ],
  619. ],
  620. [
  621. [
  622. [2, 3, -1, -9, -16],
  623. [1, 2, 1, 0, 0],
  624. [-1, 2, 3, 4, 8],
  625. ],
  626. [
  627. [1, 0, 0, 2, 3],
  628. [0, 1, 0, -3, -5],
  629. [0, 0, 1, 4, 7],
  630. ],
  631. ],
  632. [
  633. [
  634. [2, 3, 19, -4, 2],
  635. [1, 2, 12, -3, 1],
  636. [-1, 2, 8, -5, 1],
  637. ],
  638. [
  639. [1, 0, 2, 1, 0],
  640. [0, 1, 5, -2, 0],
  641. [0, 0, 0 ,0, 1],
  642. ],
  643. ],
  644. [
  645. [
  646. [-1, 5, 0, 0, -8],
  647. [-2, 5, 5, 2, 9],
  648. [-3, -1, 3, 1, 3],
  649. [7, 6, 5, 1, 30],
  650. ],
  651. [
  652. [1, 0, 0, 0, 3],
  653. [0, 1, 0, 0, -1],
  654. [0, 0, 1, 0, 2],
  655. [0, 0, 0, 1, 5],
  656. ],
  657. ],
  658. [
  659. [
  660. [1, 2, -4, -1, 0, 32],
  661. [1, 3, -7, 0, -1, 33],
  662. [1, 0, 2, -2, 3, 22],
  663. ],
  664. [
  665. [1, 0, 2, 0, 5, 6],
  666. [0, 1, -3, 0, -2, 9],
  667. [0, 0, 0, 1, 1, -8],
  668. ],
  669. ],
  670. [
  671. [
  672. [2, 1, 6],
  673. [-1, -1, -2],
  674. [3, 4, 4],
  675. [3, 5, 2],
  676. ],
  677. [
  678. [1, 0, 4],
  679. [0, 1, -2],
  680. [0, 0, 0],
  681. [0, 0, 0],
  682. ],
  683. ],
  684. [
  685. [
  686. [2, 1, 5, 10],
  687. [1, -3, -1, -2],
  688. [4, -2, 6, 12],
  689. ],
  690. [
  691. [1, 0, 2, 4],
  692. [0, 1, 1, 2],
  693. [0, 0, 0, 0],
  694. ],
  695. ],
  696. [
  697. [
  698. [1, 2, -4],
  699. [-3, -1, -3],
  700. [-2, 1, -7],
  701. ],
  702. [
  703. [1, 0, 2],
  704. [0, 1, -3],
  705. [0, 0, 0],
  706. ],
  707. ],
  708. [
  709. [
  710. [1, 1, 1],
  711. [-4, -3, -2],
  712. [3, 2, 1],
  713. ],
  714. [
  715. [1, 0, -1],
  716. [0, 1, 2],
  717. [0, 0, 0],
  718. ],
  719. ],
  720. [
  721. [
  722. [1, 2, -1, -1],
  723. [2, 4, -1, 4],
  724. [-1, -2, 3, 5],
  725. ],
  726. [
  727. [1, 2, 0, 0],
  728. [0, 0, 1, 0],
  729. [0, 0, 0, 1],
  730. ],
  731. ],
  732. [
  733. [
  734. [1, 1, -1, 1],
  735. [2, 1, -1, 3],
  736. [1, 4, -4, -2],
  737. [2, 0, 1, 2],
  738. ],
  739. [
  740. [1, 0, 0, 2],
  741. [0, 1, 0, -3],
  742. [0, 0, 1, -2],
  743. [0, 0, 0, 0],
  744. ],
  745. ],
  746. [
  747. [
  748. [4, 4, 2, 108],
  749. [1, 1, 1, 30],
  750. [2, -1, 0, 0],
  751. ],
  752. [
  753. [1, 0, 0, 8],
  754. [0, 1, 0, 16],
  755. [0, 0, 1, 6],
  756. ],
  757. ],
  758. [
  759. [
  760. [1, 1, 1, 1, 66],
  761. [1, -4, 0, 0, 0],
  762. [4, 4, 2, 2, 252],
  763. ],
  764. [
  765. [1, 0, 0, 0, 48],
  766. [0, 1, 0, 0, 12],
  767. [0, 0, 1, 1, 6],
  768. ],
  769. ],
  770. [
  771. [
  772. [5, 0, 0, 0],
  773. [-6, 1, 0, 0],
  774. [4, 6, 8, 0],
  775. [6, 7, 7, -1],
  776. ],
  777. [
  778. [1, 0, 0, 0],
  779. [0, 1, 0, 0],
  780. [0, 0, 1, 0],
  781. [0, 0, 0, 1],
  782. ],
  783. ],
  784. [
  785. [
  786. [5, -6, 4, 6],
  787. [0, 1, 6, 7],
  788. [0, 0, 8, 7],
  789. [0, 0, 0, -1]
  790. ],
  791. [
  792. [1, 0, 0, 0],
  793. [0, 1, 0, 0],
  794. [0, 0, 1, 0],
  795. [0, 0, 0, 1],
  796. ],
  797. ],
  798. [
  799. [
  800. [25, -30, 20, 30],
  801. [-30, 37, -18, -29],
  802. [20, -18, 116, 122],
  803. [30, -29, 122, 135],
  804. ],
  805. [
  806. [1, 0, 0, 0],
  807. [0, 1, 0, 0],
  808. [0, 0, 1, 0],
  809. [0, 0, 0, 1],
  810. ]
  811. ],
  812. [
  813. [
  814. [113, 60, 74, -6],
  815. [60, 86, 97, -7],
  816. [74, 97, 113, -7],
  817. [-6, -7, -7, 1],
  818. ],
  819. [
  820. [1, 0, 0, 0],
  821. [0, 1, 0, 0],
  822. [0, 0, 1, 0],
  823. [0, 0, 0, 1],
  824. ],
  825. ],
  826. [
  827. [
  828. [5, 0, 0, 0],
  829. [-6, 1, 0, 0],
  830. [4, 6, 0, 0],
  831. [6, 7, 7, -1],
  832. ],
  833. [
  834. [1, 0, 0, 0],
  835. [0, 1, 0, 0],
  836. [0, 0, 1, -1 / 7],
  837. [0, 0, 0, 0],
  838. ],
  839. ],
  840. [
  841. [
  842. [5, -6, 4, 6],
  843. [0, 1, 6, 7],
  844. [0, 0, 0, 7],
  845. [0, 0, 0, -1]
  846. ],
  847. [
  848. [1, 0, 8, 0],
  849. [0, 1, 6, 0],
  850. [0, 0, 0, 1],
  851. [0, 0, 0, 0],
  852. ],
  853. ],
  854. [
  855. [
  856. [113, 60, 42, -6],
  857. [60, 86, 49, -7],
  858. [42, 49, 49, -7],
  859. [-6, -7, -7, 1],
  860. ],
  861. [
  862. [1, 0, 0, 0],
  863. [0, 1, 0, 0],
  864. [0, 0, 1, -1 / 7],
  865. [0, 0, 0, 0],
  866. ],
  867. ],
  868. [
  869. [
  870. [25, -30, 20, 30],
  871. [-30, 37, -18, -29],
  872. [20, -18, 52, 66],
  873. [30, -29, 66, 135],
  874. ],
  875. [
  876. [1, 0, 8, 0],
  877. [0, 1, 6, 0],
  878. [0, 0, 0, 1],
  879. [0, 0, 0, 0],
  880. ],
  881. ],
  882. [
  883. [
  884. [172, 124, 45, 0],
  885. [124, 92, 30, 0],
  886. [45, 30, 25, 0],
  887. [0, 0, 0, 0],
  888. ],
  889. [
  890. [1, 0, 0, 0],
  891. [0, 1, 0, 0],
  892. [0, 0, 1, 0],
  893. [0, 0, 0, 0],
  894. ],
  895. ],
  896. [
  897. [
  898. [18, 36, 54, 41],
  899. [36, 81, 126, 83],
  900. [54, 126, 198, 125],
  901. [41, 83, 125, 102],
  902. ],
  903. [
  904. [1, 0, -1, 0],
  905. [0, 1, 2, 0],
  906. [0, 0, 0, 1],
  907. [0, 0, 0, 0],
  908. ],
  909. ],
  910. [
  911. [
  912. [82, 98, 110, 48],
  913. [98, 118, 133, 60],
  914. [110, 133, 151, 66],
  915. [48, 60, 66, 48],
  916. ],
  917. [
  918. [1, 0, 0, -6],
  919. [0, 1, 0, 10],
  920. [0, 0, 1, -4],
  921. [0, 0, 0, 0],
  922. ]
  923. ],
  924. [
  925. [
  926. [0, 0, 0],
  927. [0, 0, 0],
  928. [0, 0, 0],
  929. ],
  930. [
  931. [0, 0, 0],
  932. [0, 0, 0],
  933. [0, 0, 0],
  934. ],
  935. ],
  936. [
  937. [
  938. [-10, 5, 5],
  939. [5, -10, 5],
  940. [5, 5, -10],
  941. ],
  942. [
  943. [1, 0, -1],
  944. [0, 1, -1],
  945. [0, 0, 0],
  946. ],
  947. ],
  948. [
  949. [
  950. [5, 5, 5],
  951. [5, 5, 5],
  952. [5, 5, 5],
  953. ],
  954. [
  955. [1, 1, 1],
  956. [0, 0, 0],
  957. [0, 0, 0],
  958. ],
  959. ],
  960. [
  961. [
  962. [-12, 3, 3, 3, 3],
  963. [3, -12, 3, 3, 3],
  964. [3, 3, -12, 3, 3],
  965. [3, 3, 3, -12, 3],
  966. [3, 3, 3, 3, -12],
  967. ],
  968. [
  969. [1, 0, 0, 0, -1],
  970. [0, 1, 0, 0, -1],
  971. [0, 0, 1, 0, -1],
  972. [0, 0, 0, 1, -1],
  973. [0, 0, 0, 0, 0],
  974. ],
  975. ],
  976. [
  977. [
  978. [3, 3, 3, 3, 3],
  979. [3, 3, 3, 3, 3],
  980. [3, 3, 3, 3, 3],
  981. [3, 3, 3, 3, 3],
  982. [3, 3, 3, 3, 3],
  983. ],
  984. [
  985. [1, 1, 1, 1, 1],
  986. [0, 0, 0, 0, 0],
  987. [0, 0, 0, 0, 0],
  988. [0, 0, 0, 0, 0],
  989. [0, 0, 0, 0, 0],
  990. ],
  991. ],
  992. [
  993. [
  994. [1, 1, 1],
  995. [1, 1, -2],
  996. ],
  997. [
  998. [1, 1, 0],
  999. [0, 0, 1],
  1000. ],
  1001. ],
  1002. [
  1003. [
  1004. [1, 1, 1, 1, 1],
  1005. [1, 1, 1, 1, -4],
  1006. ],
  1007. [
  1008. [1, 1, 1, 1, 0],
  1009. [0, 0, 0, 0, 1],
  1010. ],
  1011. ],
  1012. [
  1013. [
  1014. [1, 1, 1, 0, 0],
  1015. [0, 0, 0, 1, 0],
  1016. [0, 0, 0, 0, 1],
  1017. [1, 1, -2, 0, 0],
  1018. ],
  1019. [
  1020. [1, 1, 0, 0, 0],
  1021. [0, 0, 1, 0, 0],
  1022. [0, 0, 0, 1, 0],
  1023. [0, 0, 0, 0, 1],
  1024. ],
  1025. ],
  1026. [
  1027. [
  1028. [1, 1, 1, 1, 1],
  1029. [1, 1, 1, 1, 1],
  1030. [1, 1, 1, 1, 1],
  1031. ],
  1032. [
  1033. [1, 1, 1, 1, 1],
  1034. [0, 0, 0, 0, 0],
  1035. [0, 0, 0, 0, 0],
  1036. ],
  1037. ],
  1038. ];
  1039. }
  1040. /**
  1041. * @test isRref on rref matrix should return true
  1042. * @dataProvider dataProviderForNonsingularMatrix
  1043. * @param array $A
  1044. * @throws \Exception
  1045. */
  1046. public function testRrefIsRref(array $A)
  1047. {
  1048. // Given
  1049. $A = MatrixFactory::create($A);
  1050. // When
  1051. $rref = $A->rref();
  1052. // Then
  1053. $this->assertTrue($rref->isRref());
  1054. $this->assertTrue($rref->isRef());
  1055. }
  1056. /**
  1057. * @test rref lazy load is the same as the computed and returned value.
  1058. * @throws \Exception
  1059. */
  1060. public function testRrefAlreadyComputed()
  1061. {
  1062. // Given
  1063. $A = new NumericMatrix([
  1064. [ 4, 1, 2, -3],
  1065. [-3, 3, -1, 4],
  1066. [-1, 2, 5, 1],
  1067. [ 5, 4, 3, -1],
  1068. ]);
  1069. // When
  1070. $rref1 = $A->rref(); // computes rref
  1071. $rref2 = $A->rref(); // simply gets already-computed rref
  1072. // Then
  1073. $this->assertEquals($rref1, $rref2);
  1074. }
  1075. }