{"id":2384,"date":"2026-03-06T14:22:39","date_gmt":"2026-03-06T14:22:39","guid":{"rendered":"https:\/\/www.mathros.net.ua\/ru\/?page_id=2384"},"modified":"2026-03-06T14:22:19","modified_gmt":"2026-03-06T14:22:19","slug":"psevdoobratnaya-matrica-onlayn","status":"publish","type":"page","link":"https:\/\/www.mathros.net.ua\/ru\/psevdoobratnaya-matrica-onlayn","title":{"rendered":"\u041f\u0441\u0435\u0432\u0434\u043e\u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u041e\u043d\u043b\u0430\u0439\u043d: \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0420\u0430\u0441\u0447\u0451\u0442 \u0427\u0435\u0440\u0435\u0437 \u0421\u0438\u043d\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0420\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2384\" class=\"elementor elementor-2384\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8f5a826 e-flex e-con-boxed e-con e-parent\" data-id=\"8f5a826\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8babbec elementor-widget elementor-widget-html\" data-id=\"8babbec\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"h2-title\">\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u041f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0430\u044f \u0438\u043b\u0438 \u0412\u044b\u0440\u043e\u0436\u0434\u0435\u043d\u043d\u0430\u044f? \u041d\u0430\u0448 \u041e\u043d\u043b\u0430\u0439\u043d-\u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440 \u041f\u0441\u0435\u0432\u0434\u043e\u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u041c\u0430\u0442\u0440\u0438\u0446\u044b \u0441 \u041f\u043e\u043c\u043e\u0449\u044c\u044e SVD \u041f\u043e\u043a\u0430\u0436\u0435\u0442 \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0438 \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430<\/h2>\n<style>\n    \/* h2 \u2014 \u0441\u0443\u0447\u0430\u0441\u043d\u0438\u0439, \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u0438\u0439, \u0431\u0435\u0437 \u0440\u0430\u043c\u043e\u043a *\/\n.h2-title {\n  \/* \u0442\u0438\u043f\u043e\u0433\u0440\u0430\u0444\u0456\u043a\u0430 *\/\n  font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif;\n  font-weight: 800;\n  font-size: clamp(1.2rem, 1rem + 1.2vw, 1.65rem); \/* ~19px\u201326px \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e *\/\n  line-height: 1.3;\n  letter-spacing: .005em;\n\n  \/* \u043a\u043e\u043b\u0456\u0440 (\u043a\u0440\u0430\u0449\u0435 \u0437\u0430 \u00ab\u0441\u0456\u0440\u0438\u0439\u00bb \u0437 \u0442\u043e\u0447\u043a\u0438 \u0437\u043e\u0440\u0443 \u043a\u043e\u043d\u0442\u0440\u0430\u0441\u0442\u0443) *\/\n  color: #334155; \/* slate-700 *\/\n\n  \/* \u043c\u0430\u043a\u0435\u0442 \u0456 \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u0456\u0441\u0442\u044c *\/\n  text-align: center;\n  max-width: 800px;              \/* \u0432\u0438\u0440\u0456\u0432\u043d\u044f\u0442\u0438 \u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u0440\u0456\u0448\u0435\u043d\u043d\u044f *\/\n  margin: 10px auto 16px;        \/* \u0446\u0435\u043d\u0442\u0440 \u0456 \u0432\u0456\u0434\u0441\u0442\u0443\u043f\u0438 *\/\n  padding: 0;                    \/* \u0431\u0435\u0437 \u0432\u043d\u0443\u0442\u0440\u0456\u0448\u043d\u0456\u0445 \u0432\u0456\u0434\u0441\u0442\u0443\u043f\u0456\u0432 (\u0440\u0430\u043c\u043a\u0438 \u043d\u0435 \u043f\u043e\u0442\u0440\u0456\u0431\u043d\u0456) *\/\n  text-wrap: balance;            \/* \u0440\u0456\u0432\u043d\u043e\u043c\u0456\u0440\u043d\u0456 \u0440\u044f\u0434\u043a\u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443 *\/\n  hyphens: auto;                 \/* \u043c\u2019\u044f\u043a\u0456 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438 \u0434\u043b\u044f \u0434\u043e\u0432\u0433\u0438\u0445 \u0441\u043b\u0456\u0432 *\/\n  word-break: normal;\n  overflow-wrap: anywhere;       \/* \u043d\u0435 \u0434\u0430\u0454 \u0432\u0438\u043b\u0430\u0437\u0438\u0442\u0438 \u0434\u043e\u0432\u0433\u0438\u043c \u0442\u043e\u043a\u0435\u043d\u0430\u043c *\/\n}\n\n\/* \u0422\u0435\u043c\u043d\u0430 \u0442\u0435\u043c\u0430 *\/\n@media (prefers-color-scheme: dark) {\n  .h2-title {\n    color: #e2e8f0; \/* slate-200 *\/\n  }\n}\n\n\/* \u041f\u043b\u0430\u043d\u0448\u0435\u0442\u0438 *\/\n@media (max-width: 768px) {\n  .h2-title {\n    margin: 8px auto 14px;\n  }\n}\n\n\/* \u0422\u0435\u043b\u0435\u0444\u043e\u043d\u0438 *\/\n@media (max-width: 480px) {\n  .h2-title {\n    font-size: clamp(1.05rem, 0.95rem + 2vw, 1.35rem); \/* \u0442\u0440\u043e\u0445\u0438 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0456\u0448\u0435 *\/\n    line-height: 1.35;\n    margin: 6px auto 12px;\n  }\n}\n\n\/* \u042f\u043a\u0449\u043e \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447 \u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043c\u0435\u043d\u0448\u0435 \u0430\u043d\u0456\u043c\u0430\u0446\u0456\u0439 *\/\n@media (prefers-reduced-motion: reduce) {\n  .h2-title { scroll-behavior: auto; }\n}\n<\/style>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e35132e elementor-widget elementor-widget-html\" data-id=\"e35132e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- MathJax v2 (\u044f\u043a \u0443 \u0432\u0430\u0441) -->\r\n<script type=\"text\/javascript\" async\r\n  src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/mathjax\/2.7.7\/MathJax.js?config=TeX-MML-AM_CHTML\">\r\n<\/script>\r\n\r\n<!-- ======================== HTML ======================== -->\r\n<div class=\"calculator-container inverse-ui\">\r\n  <div class=\"matrix-controls\">\r\n    <!-- \u0421\u0442\u0440\u043e\u043a\u0438 -->\r\n    <div class=\"matrix-controls__item\">\r\n      <label for=\"matrixRows\">\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a<\/label>\r\n      <select id=\"matrixRows\" name=\"matrixRows\">\r\n        <option value=\"2\">2<\/option>\r\n        <option value=\"3\" selected>3<\/option>\r\n        <option value=\"4\">4<\/option>\r\n        <option value=\"5\">5<\/option>\r\n        <option value=\"6\">6<\/option>\r\n        <option value=\"7\">7<\/option>\r\n        <option value=\"8\">8<\/option>\r\n      <\/select>\r\n    <\/div>\r\n\r\n    <!-- \u0421\u0442\u043e\u043b\u0431\u0446\u044b -->\r\n    <div class=\"matrix-controls__item\">\r\n      <label for=\"matrixCols\">\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432<\/label>\r\n      <select id=\"matrixCols\" name=\"matrixCols\">\r\n        <option value=\"2\">2<\/option>\r\n        <option value=\"3\" selected>3<\/option>\r\n        <option value=\"4\">4<\/option>\r\n        <option value=\"5\">5<\/option>\r\n        <option value=\"6\">6<\/option>\r\n        <option value=\"7\">7<\/option>\r\n        <option value=\"8\">8<\/option>\r\n      <\/select>\r\n    <\/div>\r\n\r\n    <!-- \u041f\u043e\u0440\u043e\u0433 \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u0438 tol (select) -->\r\n    <div class=\"matrix-controls__item\">\r\n      <label for=\"svdTol\">\u041f\u043e\u0440\u043e\u0433 \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u0438 (tol)<\/label>\r\n      <select id=\"svdTol\" name=\"svdTol\">\r\n        <option value=\"1e-6\">1e-6 (\u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435)<\/option>\r\n        <option value=\"1e-8\">1e-8<\/option>\r\n        <option value=\"1e-10\" selected>1e-10 (\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f)<\/option>\r\n        <option value=\"1e-12\">1e-12<\/option>\r\n        <option value=\"1e-14\">1e-14 (\u043e\u0447\u0435\u043d\u044c \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e)<\/option>\r\n      <\/select>\r\n      <small class=\"hint\">\u0415\u0441\u043b\u0438 \\(\\sigma_i \\le \\text{tol}\\), \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0447\u0442\u0438 \u043d\u0443\u043b\u0435\u0432\u044b\u043c.<\/small>\r\n    <\/div>\r\n\r\n    <!-- \u041a\u043d\u043e\u043f\u043a\u0438 -->\r\n    <div class=\"matrix-controls__item matrix-controls__item--actions\">\r\n      <label class=\"sr-only\" for=\"fillRandomBtn\">\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f<\/label>\r\n      <div class=\"matrix-actions\">\r\n        <button id=\"clearMatrixBtn\" type=\"button\" class=\"btn-secondary\">\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c<\/button>\r\n        <button id=\"fillRandomBtn\" type=\"button\" class=\"btn-secondary\">\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438<\/button>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f -->\r\n  <details class=\"random-settings\">\r\n    <summary>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/summary>\r\n    <div class=\"random-settings__grid\">\r\n      <div class=\"random-settings__item\">\r\n        <label for=\"randMin\">\u041c\u0438\u043d\u0438\u043c\u0443\u043c<\/label>\r\n        <input id=\"randMin\" type=\"text\" value=\"-5\" inputmode=\"numeric\" \/>\r\n      <\/div>\r\n      <div class=\"random-settings__item\">\r\n        <label for=\"randMax\">\u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c<\/label>\r\n        <input id=\"randMax\" type=\"text\" value=\"5\" inputmode=\"numeric\" \/>\r\n      <\/div>\r\n      <div class=\"random-settings__item\">\r\n        <label for=\"randDecimals\">\u0417\u043d\u0430\u043a\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0447\u043a\u0438\/\u0437\u0430\u043f\u044f\u0442\u043e\u0439<\/label>\r\n        <select id=\"randDecimals\">\r\n          <option value=\"0\" selected>0<\/option>\r\n          <option value=\"1\">1<\/option>\r\n          <option value=\"2\">2<\/option>\r\n          <option value=\"3\">3<\/option>\r\n        <\/select>\r\n      <\/div>\r\n    <\/div>\r\n  <\/details>\r\n\r\n  <table id=\"matrixTable\" aria-label=\"\u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u044b\"><\/table>\r\n\r\n  <button id=\"generate-button\" type=\"button\">\u041d\u0430\u0439\u0442\u0438 \u043f\u0441\u0435\u0432\u0434\u043e\u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443<\/button>\r\n<\/div>\r\n\r\n<div id=\"fcontainer\" class=\"solution-container\" style=\"display:none;\"><\/div>\r\n<div id=\"error-block\" class=\"error-message\" role=\"alert\" aria-live=\"polite\"><\/div>\r\n<div id=\"loading\" class=\"loader\" style=\"display:none;\"><\/div>\r\n\r\n<!-- ======================== CSS ========================= -->\r\n<style>\r\n\/* =========================================================\r\n   Modern, responsive UI for the calculator interface\r\n   Targets ONLY the provided markup:\r\n   .calculator-container, label, select, table#matrixTable, inputs in table,\r\n   #generate-button, #loading.loader, #error-block.error-message\r\n   - Desktop content width: 800px (centered)\r\n   - Clean focus states + dark mode\r\n   - Touch-friendly sizes, better spacing, subtle shadows\r\n   ========================================================= *\/\r\n\r\n\/* ---------- Design Tokens ---------- *\/\r\n:root{\r\n  --ui-bg:            #ffffff;\r\n  --ui-panel:         #f6f9fc;\r\n  --ui-border:        #e2e8f0;\r\n  --ui-text:          #0b2239;\r\n  --ui-text-muted:    #64748b;\r\n  --ui-accent:        #0b638b;\r\n  --ui-accent-weak:   rgba(11,99,139,.12);\r\n  --ui-danger:        #c0392b;\r\n  --ui-radius:        14px;\r\n  --ui-shadow:        0 8px 28px rgba(2, 8, 23, .06);\r\n  --ui-focus:         0 0 0 3px rgba(11, 99, 139, .22);\r\n  --ui-font:          system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif;\r\n  --ui-cell-w:        110px;      \/* width of matrix inputs on desktop *\/\r\n  --ui-input-h:       44px;       \/* control height *\/\r\n  --ui-gap:           10px;       \/* spacing inside form grid *\/\r\n}\r\n\r\n@media (prefers-color-scheme: dark){\r\n  :root{\r\n    --ui-bg:          #0f1a22;\r\n    --ui-panel:       #13202a;\r\n    --ui-border:      #223142;\r\n    --ui-text:        #e6f1f7;\r\n    --ui-text-muted:  #9fb4c6;\r\n    --ui-accent:      #5ac2f2;\r\n    --ui-accent-weak: rgba(90,194,242,.18);\r\n    --ui-danger:      #ff7f7f;\r\n    --ui-shadow:      0 12px 36px rgba(0,0,0,.45);\r\n  }\r\n}\r\n\r\n\/* ---------- Calculator container ---------- *\/\r\n.calculator-container{\r\n  width: 800px;\r\n  max-width: 800px;\r\n  margin: 18px auto;\r\n  padding: 20px 20px 22px;\r\n  background: var(--ui-bg);\r\n  color: var(--ui-text);\r\n  border: 1px solid var(--ui-border);\r\n  border-radius: var(--ui-radius);\r\n  box-shadow: var(--ui-shadow);\r\n  font-family: var(--ui-font);\r\n}\r\n\r\n\/* ---------- Controls: label + select ---------- *\/\r\n.calculator-container label{\r\n  display:block;\r\n  font-weight:700;\r\n  font-size:.98rem;\r\n  letter-spacing:.01em;\r\n  margin: 0 0 8px 2px;\r\n  color: var(--ui-text);\r\n}\r\n\r\n.calculator-container select{\r\n  width: 220px;\r\n  height: var(--ui-input-h);\r\n  padding: 0 12px;\r\n  border-radius: 12px;\r\n  border: 1px solid var(--ui-border);\r\n  background: var(--ui-panel);\r\n  color: var(--ui-text);\r\n  font-weight: 600;\r\n  outline: none;\r\n  transition: box-shadow .15s ease, border-color .15s ease, background-color .2s ease, transform .05s ease;\r\n}\r\n.calculator-container select:hover{\r\n  border-color: var(--ui-accent);\r\n  background: color-mix(in oklab, var(--ui-panel), var(--ui-accent) 6%);\r\n}\r\n.calculator-container select:focus-visible{\r\n  border-color: var(--ui-accent);\r\n  box-shadow: var(--ui-focus);\r\n  background: #fff;\r\n  transform: translateY(-1px);\r\n}\r\n\r\n\/* ---------- Matrix table ---------- *\/\r\n.calculator-container table#matrixTable{\r\n  margin: 16px 0 12px;\r\n  border-left: 1px solid #ddd; \r\n  border-right: 1px solid #ddd;\r\n  border-collapse: collapse;\r\n  width: 100%;\r\n}\r\n.calculator-container table#matrixTable td, \r\n.calculator-container table#matrixTable th,\r\n.calculator-container table#matrixTable tr{\r\n  padding: 3px 3px;\r\n  margin: 0;\r\n  border: 0;\r\n}\r\n\r\n\/* ---------- Matrix inputs ---------- *\/\r\n.calculator-container table#matrixTable input[type=\"text\"]{\r\n  width: 100%;\r\n  max-width: 100%;\r\n  height: var(--ui-input-h);\r\n  box-sizing: border-box;\r\n  padding: 0 10px;\r\n  border: 1px solid var(--ui-border);\r\n  border-radius: 10px;\r\n  background: var(--ui-panel);\r\n  color: var(--ui-text);\r\n  font-weight: 600;\r\n  text-align: center;\r\n  transition: box-shadow .15s ease, border-color .15s ease, background-color .2s ease, transform .05s ease;\r\n  outline: none;\r\n}\r\n.calculator-container table#matrixTable input[type=\"text\"]::placeholder{\r\n  color: var(--ui-text-muted);\r\n  opacity: .75;\r\n}\r\n.calculator-container table#matrixTable input[type=\"text\"]:hover{\r\n  border-color: var(--ui-accent);\r\n  background: color-mix(in oklab, var(--ui-panel), var(--ui-accent) 6%);\r\n}\r\n.calculator-container table#matrixTable input[type=\"text\"]:focus-visible{\r\n  border-color: var(--ui-accent);\r\n  box-shadow: var(--ui-focus);\r\n  background: #fff;\r\n  transform: translateY(-1px);\r\n}\r\n\/* invalid state (if you add validation classes) *\/\r\n.calculator-container table#matrixTable input[type=\"text\"].is-error{\r\n  border-color: var(--ui-danger);\r\n  box-shadow: 0 0 0 2px color-mix(in oklab, var(--ui-danger), white 76%);\r\n}\r\n\r\n.calculator-container table#matrixTable input.input-error{\r\n  outline: 2px solid #d93025;\r\n  border-color: #d93025;\r\n}\r\n\r\n\/* ---------- Solve button ---------- *\/\r\n#generate-button,\r\n.calculator-container input[type=\"button\"]#generate-button{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  gap:8px;\r\n\r\n  width:100%;\r\n  height:48px;\r\n  margin-top:10px;\r\n\r\n  background: var(--ui-accent);\r\n  color:#fff;\r\n  border:1px solid transparent;\r\n  border-radius: 12px;\r\n  font-weight: 800;\r\n  letter-spacing:.02em;\r\n  cursor:pointer;\r\n  transition: transform .05s ease, filter .15s ease, box-shadow .15s ease, background-color .2s ease;\r\n}\r\n#generate-button:hover{\r\n  filter: brightness(1.05);\r\n  box-shadow: 0 10px 30px rgba(11,99,139,.18);\r\n}\r\n#generate-button:active{\r\n  transform: translateY(1px);\r\n}\r\n#generate-button:disabled{\r\n  opacity:.55;\r\n  cursor:not-allowed;\r\n  box-shadow:none;\r\n}\r\n\r\n\/* ---------- Loader ---------- *\/\r\n.loader{\r\n  margin: 20px auto;\r\n  border: 6px solid #e9eef5;\r\n  border-top: 6px solid var(--ui-accent);\r\n  border-radius: 50%;\r\n  width: 75px; height: 75px;\r\n  animation: spin .9s linear infinite;\r\n}\r\n@keyframes spin{ to{ transform: rotate(360deg); } }\r\n\r\n\/* ---------- Error message ---------- *\/\r\n.error-message{\r\n  display:none; \/* toggled with .show *\/\r\n  width: 800px;\r\n  max-width: 800px;\r\n  margin: 14px auto 0;\r\n  background: color-mix(in oklab, var(--ui-danger), white 90%);\r\n  color: var(--ui-danger);\r\n  border: 1px solid color-mix(in oklab, var(--ui-danger), white 68%);\r\n  border-left: 4px solid var(--ui-danger);\r\n  border-radius: 12px;\r\n  padding: 12px 14px;\r\n  box-shadow: var(--ui-shadow);\r\n  font-weight: 600;\r\n  font-family: var(--ui-font);\r\n}\r\n.error-message.show{ display:block; animation: fadeIn .4s ease-in-out; }\r\n@keyframes fadeIn{ from{opacity:0} to{opacity:1} }\r\n\r\n\/* ---------- Global focus-visible helper ---------- *\/\r\n:focus-visible{\r\n  outline: none;\r\n  box-shadow: var(--ui-focus);\r\n}\r\n\r\n\/* =========================================================\r\n   Responsive adaptations\r\n   - Keep a polished look on tablets\/phones\r\n   ========================================================= *\/\r\n\r\n\/* Tablets (<= 1024px): relax fixed width, keep proportions *\/\r\n@media (max-width:1024px){\r\n  .calculator-container,\r\n  .error-message{\r\n    width: min(800px, calc(100% - 48px));\r\n    max-width: 100%;\r\n    margin-left: auto;\r\n    margin-right: auto;\r\n  }\r\n\r\n  .calculator-container select{\r\n    width: 260px; \/* a bit wider for finger comfort *\/\r\n  }\r\n\r\n  .calculator-container table#matrixTable{\r\n    border-spacing: 8px;\r\n  }\r\n  .calculator-container table#matrixTable input[type=\"text\"]{\r\n    width: 100px; \/* slightly narrower to fit *\/\r\n  }\r\n}\r\n\r\n\/* Mobile landscape \/ small tablets (<= 860px) *\/\r\n@media (max-width:860px){\r\n  .calculator-container,\r\n  .error-message{\r\n    width: calc(100% - 32px);\r\n    margin-left:16px; margin-right:16px;\r\n    padding: 18px;\r\n  }\r\n  .calculator-container select{ width: 220px; }\r\n  .calculator-container table#matrixTable input[type=\"text\"]{\r\n    width: 90px; height: 42px; font-size: .98rem;\r\n  }\r\n  #generate-button{ height: 46px; }\r\n}\r\n\r\n\/* Phones (<= 768px): stack tightly, keep tap sizes *\/\r\n@media (max-width:768px){\r\n  :root{ --ui-gap: 8px; --ui-cell-w: 84px; }\r\n\r\n  .calculator-container{ padding:16px; }\r\n  .calculator-container label{ font-size:.95rem; margin-bottom:6px; }\r\n\r\n  .calculator-container select{\r\n    width: 100%;\r\n    height: 44px;\r\n  }\r\n\r\n  .calculator-container table#matrixTable{\r\n    border-spacing: 6px;\r\n  }\r\n  .calculator-container table#matrixTable input[type=\"text\"]{\r\n    width: var(--ui-cell-w);\r\n    height: 42px;\r\n    font-size: .96rem;\r\n    padding: 0 8px;\r\n  }\r\n\r\n  #generate-button{ height: 46px; font-size: 1rem; }\r\n  .error-message{ width: calc(100% - 32px); max-width: none; }\r\n}\r\n\r\n\/* Extra small phones (<= 480px): compact grid cells *\/\r\n@media (max-width:480px){\r\n  :root{ --ui-cell-w: 76px; }\r\n\r\n  .calculator-container{\r\n    padding: 14px;\r\n  }\r\n  .calculator-container table#matrixTable{\r\n    border-spacing: 6px;\r\n  }\r\n  .calculator-container table#matrixTable input[type=\"text\"]{\r\n    width: var(--ui-cell-w);\r\n    height: 40px;\r\n    font-size: .95rem;\r\n  }\r\n}\r\n\r\n\/* =========================================================\r\n   Optional: prefers-reduced-motion\r\n   ========================================================= *\/\r\n@media (prefers-reduced-motion: reduce){\r\n  *{ animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; scroll-behavior: auto !important; }\r\n}\r\n\r\n\r\n\r\n\r\n\/* === \u041f\u041e\u0412\u041d\u0418\u0419 CSS \u0414\u041b\u042f \u0412\u0418\u0412\u0415\u0414\u0415\u041d\u041d\u042f \u0426\u0406\u041b\u041e\u0413\u041e \u0420\u0406\u0428\u0415\u041d\u041d\u042f (\u041c\u0435\u0442\u043e\u0434 \u041a\u0440\u0430\u043c\u0435\u0440\u0430) ===\r\n   \u0426\u0456\u043b\u0456:\r\n   1) \u0410\u043a\u0443\u0440\u0430\u0442\u043d\u0456 \u043a\u0430\u0440\u0442\u043a\u0438-\u043a\u0440\u043e\u043a\u0438 \u0443 \u0442\u0430\u0439\u043c\u043b\u0430\u0439\u043d\u0456.\r\n   2) \u0416\u043e\u0434\u0435\u043d .cramer-step \u043d\u0435 \u0432\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 \u043c\u0435\u0436\u0456 .solution-container.\r\n   3) \u0424\u043e\u0440\u043c\u0443\u043b\u0438 (MathJax\/KaTeX) \u043c\u0430\u044e\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0443 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u0437\u0430\u043c\u0456\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043f\u043e\u0432\u043d\u0435\u043d\u043d\u044f.\r\n*\/\r\n\r\n\/* ===================== \u0411\u0410\u0417\u041e\u0412\u0406 \u0421\u0422\u0418\u041b\u0406 (\u0434\u0435\u0441\u043a\u0442\u043e\u043f, 800px) ===================== *\/\r\n\/* \u041f\u0430\u043b\u0456\u0442\u0440\u0430 (\u0441\u0432\u0456\u0442\u043b\u0430\/\u0442\u0435\u043c\u043d\u0430 \u0442\u0435\u043c\u0430) *\/\r\n:root {\r\n  --cs-bg:            #f7fbff;\r\n  --cs-card:          #ffffff;\r\n  --cs-border:        #d6e7f8;\r\n  --cs-text:          #0b2239;\r\n  --cs-muted:         #5c7286;\r\n  --cs-accent:        #0b638b; \/* Primary blue *\/\r\n  --cs-accent-weak:   rgba(11, 99, 139, 0.12);\r\n  --cs-success:       #107a3c;\r\n  --cs-warn:          #8a5b00;\r\n  --cs-error:         #9b2424;\r\n  --cs-shadow:        0 6px 24px rgba(11, 99, 139, 0.08);\r\n}\r\n\r\n@media (prefers-color-scheme: dark) {\r\n  :root {\r\n    --cs-bg:          #0f1a22;\r\n    --cs-card:        #16232c;\r\n    --cs-border:      #203241;\r\n    --cs-text:        #e6f1f7;\r\n    --cs-muted:       #9eb6c7;\r\n    --cs-accent:      #5ac2f2;\r\n    --cs-accent-weak: rgba(90, 194, 242, 0.16);\r\n    --cs-success:     #4cd17d;\r\n    --cs-warn:        #ffc156;\r\n    --cs-error:       #ff7b7b;\r\n    --cs-shadow:      0 10px 36px rgba(0, 0, 0, 0.35);\r\n  }\r\n}\r\n\r\n\/* \u0424\u0456\u043a\u0441\u043e\u0432\u0430\u043d\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 (\u0414\u0415\u0421\u041a\u0422\u041e\u041f): 800px, \u0431\u0435\u0437 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u0443 *\/\r\n.solution-container {\r\n  width: 100%;\/*800px;*\/\r\n  max-width: 100%;\/*800px;*\/\r\n  min-width: 100%;\/*800px;*\/\r\n  margin: 15px auto;\r\n  padding: 20px;\r\n\r\n  background: #fff;\r\n  color: #333;\r\n  font: 16px\/1.6 system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif;\r\n\r\n  overflow-x: hidden; \/* \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043d\u0435 \u0441\u043a\u0440\u043e\u043b\u0438\u0442\u044c\u0441\u044f \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0456 *\/\r\n  overflow-y: visible;\r\n}\r\n\r\n\/* \u041e\u0431\u0433\u043e\u0440\u0442\u043a\u0430 \u043a\u0440\u043e\u043a\u0456\u0432 *\/\r\n.solution-container .cramer-solution {\r\n  counter-reset: step;\r\n  display: grid;\r\n  gap: 14px;\r\n  margin-top: 8px;\r\n}\r\n\r\n\/* \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0440\u0456\u0448\u0435\u043d\u043d\u044f *\/\r\n.solution-container .cramer-heading{\r\n  display:flex;\r\n  flex-direction:column;\r\n  gap:6px;\r\n  margin: 4px 0 12px;\r\n  padding: 14px 16px;\r\n  \/*border:1px solid var(--cs-border, #d6e7f8);\r\n  border-radius: 14px;\r\n  background: var(--cs-bg, #f7fbff);\r\n  box-shadow: var(--cs-shadow, 0 6px 24px rgba(11,99,139,.08));*\/\r\n}\r\n\r\n.solution-container .cramer-heading__title{\r\n  font-weight: 800;\r\n  font-size: clamp(1.1rem, 1rem + 0.5vw, 1.35rem);\r\n  letter-spacing: .01em;\r\n  color: var(--cs-text, #0b2239);\r\n}\r\n\r\n.solution-container .cramer-heading__meta{\r\n  font-size: .88rem;\r\n  color: var(--cs-muted, #5c7286);\r\n}\r\n\r\n\/* \u0422\u0435\u043c\u043d\u0430 \u0442\u0435\u043c\u0430 \u0437 \u0432\u0430\u0448\u0438\u043c\u0438 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438 *\/\r\n@media (prefers-color-scheme: dark){\r\n  .solution-container .cramer-heading{\r\n    border-color: var(--cs-border, #203241);\r\n    background: var(--cs-card, #16232c);\r\n    box-shadow: var(--cs-shadow, 0 10px 36px rgba(0,0,0,.35));\r\n  }\r\n  .solution-container .cramer-heading__meta{\r\n    color: var(--cs-muted, #9eb6c7);\r\n  }\r\n}\r\n\r\n\/* \u0410\u0434\u0430\u043f\u0442\u0430\u0446\u0456\u044f *\/\r\n@media (max-width: 768px){\r\n  .solution-container .cramer-heading{\r\n    padding: 12px 12px;\r\n    border-radius: 12px;\r\n  }\r\n}\r\n\r\n\r\n\/* \u041a\u0430\u0440\u0442\u043a\u0430 \u043a\u0440\u043e\u043a\u0443 *\/\r\n.solution-container .cramer-step {\r\n  position: relative;\r\n  min-width: 0; \/* \u0434\u043e\u0437\u0432\u043e\u043b\u044f\u0454 \u0432\u043d\u0443\u0442\u0440\u0456\u0448\u043d\u0456\u043c \u0435\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u043a\u0435\u0440\u0443\u0432\u0430\u0442\u0438 \u0441\u0432\u043e\u0457\u043c \u0441\u043a\u0440\u043e\u043b\u043e\u043c *\/\r\n  padding: 16px 16px 16px 60px;\r\n  background: var(--cs-card);\r\n  border: 1px solid var(--cs-border);\r\n  border-radius: 14px;\r\n  box-shadow: var(--cs-shadow);\r\n  color: var(--cs-text);\r\n  line-height: 1.6;\r\n}\r\n\r\n\/* \u041d\u043e\u043c\u0435\u0440 \u043a\u0440\u043e\u043a\u0443 \u0432 \u043a\u0440\u0443\u0436\u0435\u0447\u043a\u0443 *\/\r\n.solution-container .cramer-step::before {\r\n  content: counter(step);\r\n  counter-increment: step;\r\n  position: absolute;\r\n  top: 16px;\r\n  left: 16px;\r\n  width: 28px;\r\n  height: 28px;\r\n  display: grid;\r\n  place-items: center;\r\n  border-radius: 999px;\r\n  background: var(--cs-accent-weak);\r\n  border: 1px solid var(--cs-border);\r\n  color: var(--cs-accent);\r\n  font: 700 0.95rem\/1 system-ui, -apple-system, \"Segoe UI\", Roboto, Arial, sans-serif;\r\n}\r\n\r\n\/* \u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0430 \u043b\u0456\u043d\u0456\u044f-\u0442\u0430\u0439\u043c\u043b\u0430\u0439\u043d *\/\r\n.solution-container .cramer-step::after {\r\n  content: \"\";\r\n  position: absolute;\r\n  left: 30px;\r\n  top: 48px;\r\n  bottom: -14px;\r\n  width: 2px;\r\n  background: linear-gradient(to bottom, var(--cs-accent-weak), transparent 70%);\r\n}\r\n.solution-container .cramer-step:last-child::after { display: none; }\r\n\r\n\/* \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043a\u0440\u043e\u043a\u0443 *\/\r\n.solution-container .cramer-step__title,\r\n.solution-container .cramer-step > h3 {\r\n  margin: 0 0 8px 0;\r\n  font-weight: 700;\r\n  font-size: clamp(1.02rem, 0.95rem + 0.3vw, 1.15rem);\r\n  letter-spacing: .01em;\r\n}\r\n\r\n\/* \u0422\u0435\u043a\u0441\u0442 *\/\r\n.solution-container .cramer-step p {\r\n  margin: 0 0 8px 0;\r\n  color: var(--cs-text);\r\n}\r\n\r\n\/* \u0424\u043e\u0440\u043c\u0443\u043b\u0430: \u0454\u0434\u0438\u043d\u0435 \u043c\u0456\u0441\u0446\u0435, \u0434\u0435 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0454\u0442\u044c\u0441\u044f \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0438\u0439 \u0441\u043a\u0440\u043e\u043b *\/\r\n.solution-container .cramer-step .formula {\r\n  background: #fff;\r\n  border: 1px dashed var(--cs-border);\r\n  border-left: 3px solid var(--cs-accent);\r\n  border-radius: 10px;\r\n  padding: 10px 12px;\r\n  margin-top: 8px;\r\n  \/* font-size: .78rem; *\/\r\n  max-width: 100%;\r\n  min-width: 0;\r\n  overflow-x: auto;    \/* \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430 \u043f\u043e\u043b\u043e\u0441\u0430 \u0441\u043a\u0440\u043e\u043b\u0443 \u043f\u0440\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0456 *\/\r\n  overflow-y: hidden;\r\n  white-space: nowrap; \/* \u043d\u0435 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0438 \u0434\u043e\u0432\u0433\u0456 \u0444\u043e\u0440\u043c\u0443\u043b\u0438 *\/\r\n  -webkit-overflow-scrolling: touch;\r\n\r\n  scrollbar-width: thin;                         \/* Firefox *\/\r\n  scrollbar-color: var(--cs-accent) transparent; \/* Firefox *\/\r\n}\r\n\r\n@media (prefers-color-scheme: dark) {\r\n  .solution-container .cramer-step .formula { background: #0f1a22; }\r\n}\r\n\r\n\/* MathJax\/KaTeX \u2014 \u043d\u0435 \u043b\u0430\u043c\u0430\u0442\u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0438\u0439 \u0441\u043a\u0440\u043e\u043b *\/\r\n.solution-container .cramer-step .formula .mjx-container,\r\n.solution-container .cramer-step .formula .katex-display,\r\n.solution-container .cramer-step .formula .katex {\r\n  display: inline-block !important;\r\n  white-space: nowrap !important;\r\n  max-width: none !important;\r\n}\r\n\r\n\/* \u041a\u0430\u0441\u0442\u043e\u043c\u043d\u0456 \u0441\u043a\u0440\u043e\u043b-\u0431\u0430\u0440\u0438 \u0434\u043b\u044f WebKit *\/\r\n.solution-container .cramer-step .formula::-webkit-scrollbar { height: 8px; }\r\n.solution-container .cramer-step .formula::-webkit-scrollbar-track { background: transparent; }\r\n.solution-container .cramer-step .formula::-webkit-scrollbar-thumb {\r\n  background-color: var(--cs-accent);\r\n  border-radius: 8px;\r\n  background-clip: padding-box;\r\n}\r\n.solution-container .cramer-step .formula::-webkit-scrollbar-thumb:hover { filter: brightness(0.9); }\r\n\r\n\/* \u0411\u0435\u0439\u0434\u0436\u0456 *\/\r\n.solution-container .cramer-badges {\r\n  display: flex;\r\n  flex-wrap: wrap;\r\n  gap: 8px;\r\n  margin: 6px 0 4px 0;\r\n}\r\n.solution-container .cramer-badge {\r\n  display: inline-flex;\r\n  align-items: center;\r\n  gap: 6px;\r\n  border-radius: 999px;\r\n  padding: 4px 10px;\r\n  font-weight: 700;\r\n  font-size: .78rem;\r\n  letter-spacing: .02em;\r\n  border: 1px solid var(--cs-border);\r\n  background: var(--cs-accent-weak);\r\n  color: var(--cs-accent);\r\n}\r\n.solution-container .cramer-badge--ok {\r\n  background: rgba(16, 122, 60, 0.12);\r\n  color: var(--cs-success);\r\n  border-color: rgba(16, 122, 60, 0.22);\r\n}\r\n\r\n\/* \u0414\u0435\u0442\u0430\u043b\u0456\/\u0441\u043f\u043e\u0439\u043b\u0435\u0440\u0438 *\/\r\n.solution-container .cramer-details { margin-top: 8px; }\r\n.solution-container .cramer-details > summary {\r\n  cursor: pointer;\r\n  list-style: none;\r\n  padding: 8px 12px;\r\n  border-radius: 10px;\r\n  border: 1px solid var(--cs-border);\r\n  background: var(--cs-bg);\r\n  color: var(--cs-text);\r\n  font-weight: 600;\r\n  transition: background-color .2s ease, border-color .2s ease;\r\n}\r\n.solution-container .cramer-details > summary::marker { content: \"\"; }\r\n.solution-container .cramer-details > summary::before {\r\n  content: \"\u25b8\";\r\n  display: inline-block;\r\n  margin-right: 8px;\r\n  transition: transform .2s ease;\r\n}\r\n.solution-container .cramer-details[open] > summary::before { transform: rotate(90deg); }\r\n\r\n\/* \u0412\u0438\u0434\u0456\u043b\u0435\u043d\u0438\u0439 \u043f\u0456\u0434\u0441\u0443\u043c\u043a\u043e\u0432\u0438\u0439 \u043a\u0440\u043e\u043a *\/\r\n.solution-container .cramer-step--result { border-left: 4px solid var(--cs-success); }\r\n.solution-container .cramer-step--result::before {\r\n  color: var(--cs-success);\r\n  background: rgba(16, 122, 60, 0.12);\r\n}\r\n\r\n\/* \u041f\u0456\u0434\u0441\u0432\u0456\u0442\u043a\u0438 *\/\r\n.solution-container .cramer-step em,\r\n.solution-container .cramer-step .highlight {\r\n  padding: 0.05rem 0.25rem;\r\n  border-radius: 6px;\r\n  background: var(--cs-accent-weak);\r\n  font-weight: 700;\r\n}\r\n\r\n\/* ===================== \u0410\u0414\u0410\u041f\u0422\u0410\u0426\u0406\u042f: \u041f\u041b\u0410\u041d\u0428\u0415\u0422\u0418 (<= 1024px) ===================== *\/\r\n@media (max-width: 1024px) {\r\n  .solution-container {\r\n    width: min(800px, calc(100% - 40px));\r\n    max-width: 100%;\r\n    min-width: 0;          \/* \u0437\u043d\u044f\u0442\u0438 \u0436\u043e\u0440\u0441\u0442\u043a\u0435 \u043e\u0431\u043c\u0435\u0436\u0435\u043d\u043d\u044f *\/\r\n    margin: 16px auto;\r\n    padding: 18px;\r\n    font-size: 15px;       \/* \u0442\u0440\u043e\u0445\u0438 \u043c\u0435\u043d\u0448\u0438\u0439 \u0431\u0430\u0437\u043e\u0432\u0438\u0439 \u0440\u043e\u0437\u043c\u0456\u0440 *\/\r\n  }\r\n\r\n  .solution-container .cramer-step {\r\n    padding: 14px 14px 14px 56px;\r\n    border-radius: 12px;\r\n  }\r\n\r\n  .solution-container .cramer-step::before {\r\n    width: 26px; height: 26px;\r\n    font-size: 0.9rem;\r\n    top: 14px; left: 14px;\r\n  }\r\n  .solution-container .cramer-step::after { left: 28px; top: 44px; }\r\n\r\n  .solution-container .cramer-step .formula {\r\n    padding: 9px 10px;\r\n    font-size: 0.98em;\r\n  }\r\n\r\n  .solution-container .cramer-badge { font-size: .76rem; }\r\n}\r\n\r\n\/* ===================== \u0410\u0414\u0410\u041f\u0422\u0410\u0426\u0406\u042f: \u041c\u041e\u0411\u0406\u041b\u042c\u041d\u0406 (<= 768px) ===================== *\/\r\n@media (max-width: 768px) {\r\n  .solution-container {\r\n    width: calc(100% - 24px);\r\n    max-width: 100%;\r\n    min-width: 0;\r\n    margin: 12px auto;\r\n    padding: 14px;\r\n    font-size: 14px;\r\n  }\r\n\r\n  .solution-container .cramer-solution { gap: 12px; }\r\n\r\n  .solution-container .cramer-step {\r\n    padding: 12px 12px 12px 52px;\r\n    border-radius: 12px;\r\n  }\r\n\r\n  \/* \u0417\u043c\u0435\u043d\u0448\u0438\u0442\u0438\/\u0441\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u0438 \u043c\u0430\u0440\u043a\u0435\u0440\u0438 \u043a\u0440\u043e\u043a\u0456\u0432 \u0456 \u0442\u0430\u0439\u043c\u043b\u0430\u0439\u043d *\/\r\n  .solution-container .cramer-step::before {\r\n    width: 24px; height: 24px;\r\n    font-size: 0.85rem;\r\n    top: 12px; left: 12px;\r\n  }\r\n  .solution-container .cramer-step::after {\r\n    left: 26px;\r\n    top: 40px;\r\n    bottom: -12px;\r\n  }\r\n\r\n  .solution-container .cramer-step__title,\r\n  .solution-container .cramer-step > h3 {\r\n    font-size: 1rem; \/* \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0456\u0448\u0435 \u043d\u0430 \u043c\u043e\u0431\u0456\u043b\u044c\u043d\u043e\u043c\u0443 *\/\r\n    margin-bottom: 6px;\r\n  }\r\n\r\n  .solution-container .cramer-step p { margin-bottom: 6px; }\r\n\r\n  .solution-container .cramer-step .formula {\r\n    padding: 8px 10px;\r\n    font-size: 0.96em; \/* \u0442\u0440\u0456\u0448\u043a\u0438 \u0437\u043c\u0435\u043d\u0448\u0438\u0442\u0438 \u0449\u0456\u043b\u044c\u043d\u0456\u0441\u0442\u044c *\/\r\n  }\r\n\r\n  \/* \u0417\u043c\u0435\u043d\u0448\u0435\u043d\u0456 \u0431\u0435\u0439\u0434\u0436\u0456 *\/\r\n  .solution-container .cramer-badge {\r\n    padding: 3px 8px;\r\n    font-size: .74rem;\r\n    border-radius: 999px;\r\n  }\r\n\r\n  \/* \u0429\u043e\u0431 \u0434\u0440\u0456\u0431\u043d\u0456 \u0435\u043a\u0440\u0430\u043d\u0438 \u043d\u0435 \u043e\u0442\u0440\u0438\u043c\u0443\u0432\u0430\u043b\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0438\u0439 \u201c\u0448\u0442\u0438\u0440\u201d \u0442\u0430\u0439\u043c\u043b\u0430\u0439\u043d\u0443 \u0434\u0443\u0436\u0435 \u0434\u043e\u0432\u0433\u0438\u043c *\/\r\n  .solution-container .cramer-step:last-child::after { display: none; }\r\n}\r\n\r\n\/* ========== \u0414\u0423\u0416\u0415 \u041c\u0410\u041b\u0406 \u041c\u041e\u0411\u0406\u041b\u042c\u041d\u0406 (<= 480px): \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e ========== *\/\r\n@media (max-width: 480px) {\r\n  .solution-container {\r\n    width: calc(100% - 16px);\r\n    margin: 10px auto;\r\n    padding: 12px;\r\n    font-size: 13.5px;\r\n  }\r\n\r\n  .solution-container .cramer-step {\r\n    padding: 10px 10px 10px 46px;\r\n    border-radius: 10px;\r\n  }\r\n\r\n  .solution-container .cramer-step::before {\r\n    width: 22px; height: 22px;\r\n    font-size: 0.8rem;\r\n    top: 10px; left: 10px;\r\n  }\r\n  .solution-container .cramer-step::after { display: none; } \/* \u043f\u0440\u0438\u0431\u0440\u0430\u0442\u0438 \u043b\u0456\u043d\u0456\u044e \u0434\u043b\u044f \u043f\u043e\u0432\u0456\u0442\u0440\u044f *\/\r\n\r\n  .solution-container .cramer-step__title,\r\n  .solution-container .cramer-step > h3 {\r\n    font-size: .98rem;\r\n    margin-bottom: 4px;\r\n  }\r\n\r\n  .solution-container .cramer-step .formula {\r\n    padding: 6px 8px;\r\n    font-size: 0.94em;\r\n    \/* \u0437\u0430\u043b\u0438\u0448\u0430\u0454\u043c\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0438\u0439 \u0441\u043a\u0440\u043e\u043b \u0434\u043b\u044f \u0434\u043e\u0432\u0433\u0438\u0445 \u0444\u043e\u0440\u043c\u0443\u043b *\/\r\n  }\r\n\r\n  .solution-container .cramer-badges { gap: 6px; }\r\n  .solution-container .cramer-badge { font-size: .72rem; padding: 3px 8px; }\r\n\r\n  .solution-container .cramer-details > summary {\r\n    padding: 7px 10px;\r\n    border-radius: 8px;\r\n  }\r\n}\r\n\r\n\/* ===================== \u0414\u0420\u0423\u041a ===================== *\/\r\n@media print {\r\n  .solution-container,\r\n  .solution-container .cramer-step {\r\n    box-shadow: none;\r\n    background: #fff;\r\n  }\r\n  .solution-container .cramer-step::before,\r\n  .solution-container .cramer-step::after { display: none; }\r\n}\r\n\r\n\/* ===== \u0414\u0415\u041b\u042c\u0422\u0410-\u0421\u0422\u0418\u041b\u0406 (\u0434\u043e\u0434\u0430\u044e\u0442\u044c\u0441\u044f \u0434\u043e \u0432\u0430\u0448\u043e\u0433\u043e CSS) ===== *\/\r\n.matrix-controls{\r\n  display:flex;\r\n  gap:12px;\r\n  flex-wrap:wrap;\r\n  align-items:flex-end;\r\n}\r\n.matrix-controls__item{ display:flex; flex-direction:column; gap:8px; }\r\n.matrix-controls__item--actions{ margin-left:auto; }\r\n.matrix-actions{ display:flex; gap:10px; flex-wrap:wrap; }\r\n\r\n\/* \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0454\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u0432\u2019\u044f\u0437\u0430\u0442\u0438 \u0434\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\u0430, \u0449\u043e\u0431 \u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0431\u0438\u0442\u0438 \u0442\u0435\u043c\u0443 *\/\r\n.calculator-container .btn-secondary{\r\n  height:44px;\r\n  padding:0 14px;\r\n  border-radius:12px;\r\n  border:1px solid var(--ui-border);\r\n  background: var(--ui-panel);\r\n  color: var(--ui-text);\r\n  font-weight:800;\r\n  cursor:pointer;\r\n\r\n  appearance:none;\r\n  -webkit-appearance:none;\r\n  -webkit-tap-highlight-color: transparent;\r\n\r\n  outline: none; \/* \u0442\u0435\u043c\u0430 \u0447\u0430\u0441\u0442\u043e \u0434\u043e\u0434\u0430\u0454 outline + \u0444\u043e\u043d *\/\r\n  transition: box-shadow .15s ease, border-color .15s ease, transform .05s ease, filter .15s ease, background-color .2s ease, color .2s ease;\r\n}\r\n\r\n\/* Hover \/ focus-visible \u2014 \u043a\u0440\u0430\u0441\u0438\u0432\u0438\u0439 \u201c\u0430\u043a\u0446\u0435\u043d\u0442\u043d\u0438\u0439\u201d \u0441\u0442\u0430\u043d *\/\r\n.calculator-container .btn-secondary:hover,\r\n.calculator-container .btn-secondary:focus-visible{\r\n  border-color: var(--ui-accent);\r\n  background: var(--ui-accent);\r\n  color:#fff;\r\n  filter: brightness(1.02);\r\n  box-shadow: 0 10px 24px rgba(11,99,139,.12);\r\n}\r\n\r\n\/* \u041e\u0441\u044c \u043a\u043b\u044e\u0447: \u043f\u0456\u0441\u043b\u044f \u043a\u043b\u0456\u043a\u0443 \u043a\u043d\u043e\u043f\u043a\u0430 \u0443 \u0444\u043e\u043a\u0443\u0441\u0456 \u2014 \u041d\u0415 \u0434\u043e\u0437\u0432\u043e\u043b\u044f\u0454\u043c\u043e \u0442\u0435\u043c\u043d\u043e-\u0441\u0456\u0440\u0438\u0439 \u0444\u043e\u043d *\/\r\n.calculator-container .btn-secondary:focus{\r\n  background: var(--ui-panel) !important;\r\n  color: var(--ui-text) !important;\r\n  border-color: var(--ui-border) !important;\r\n  box-shadow: none !important;\r\n}\r\n\r\n\/* \u041d\u0430\u0442\u0438\u0441\u043a\u0430\u043d\u043d\u044f *\/\r\n.calculator-container .btn-secondary:active{\r\n  background: var(--ui-accent) !important; \/* \u0449\u043e\u0431 \u043d\u0435 \u201c\u0441\u0456\u0440\u0456\u043b\u043e\u201d *\/\r\n  color:#fff !important;\r\n  filter: brightness(0.95); \r\n  transform: translateY(1px);\r\n}\r\n\r\n\/* \u0412\u0438\u043c\u043a\u043d\u0435\u043d\u0438\u0439 \u0441\u0442\u0430\u043d *\/\r\n.calculator-container .btn-secondary:disabled{\r\n  opacity:.55;\r\n  cursor:not-allowed;\r\n  box-shadow:none !important;\r\n  filter:none;\r\n  transform:none;\r\n}\r\n\r\n\/* \u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f \u0440\u0430\u043d\u0434\u043e\u043c\u0443 *\/\r\n.random-settings{\r\n  margin-top: 12px;\r\n  border: 1px solid var(--ui-border);\r\n  border-radius: 12px;\r\n  background: var(--ui-panel);\r\n  padding: 10px 12px;\r\n}\r\n.random-settings > summary{\r\n  cursor:pointer;\r\n  font-weight:800;\r\n  color: var(--ui-text);\r\n  list-style:none;\r\n}\r\n.random-settings > summary::-webkit-details-marker{ display:none; }\r\n.random-settings > summary::before{\r\n  content:\"\u25b8\";\r\n  display:inline-block;\r\n  margin-right:8px;\r\n  transition: transform .2s ease;\r\n}\r\n.random-settings[open] > summary::before{ transform: rotate(90deg); }\r\n\r\n.random-settings__grid{\r\n  margin-top: 12px;\r\n  display:grid;\r\n  grid-template-columns: repeat(3, minmax(160px, 1fr));\r\n  gap: 12px;\r\n}\r\n.random-settings__item{ display:flex; flex-direction:column; gap:6px; }\r\n\r\n.random-settings__item input[type=\"text\"],\r\n.random-settings__item select{\r\n  height:44px;\r\n  border-radius:12px;\r\n  border:1px solid var(--ui-border);\r\n  background: #fff;\r\n  color: var(--ui-text);\r\n  padding: 0 12px;\r\n  font-weight:700;\r\n  outline:none;\r\n}\r\n@media (prefers-color-scheme: dark){\r\n  .random-settings__item input[type=\"text\"],\r\n  .random-settings__item select{ background: #0f1a22; }\r\n}\r\n@media (max-width:768px){\r\n  .matrix-controls__item--actions{ margin-left:0; width:100%; }\r\n  .matrix-actions{ width:100%; }\r\n  .btn-secondary{ width:100%; }\r\n  .random-settings__grid{ grid-template-columns: 1fr; }\r\n}\r\n\r\n\/* sr-only *\/\r\n.sr-only{\r\n  position:absolute !important;\r\n  width:1px; height:1px;\r\n  padding:0; margin:-1px;\r\n  overflow:hidden; clip:rect(0,0,0,0);\r\n  border:0;\r\n}\r\n\r\n\/* ===== Toggle \u044f\u043a select#matrixSize: \u0442\u0430 \u0441\u0430\u043c\u0430 \u0448\u0438\u0440\u0438\u043d\u0430\/\u0432\u0438\u0441\u043e\u0442\u0430\/\u0432\u0438\u0440\u0456\u0432\u043d\u044e\u0432\u0430\u043d\u043d\u044f ===== *\/\r\n\r\n\/* \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0442\u0443\u043c\u0431\u043b\u0435\u0440\u0430 = 1:1 \u044f\u043a select (\u0448\u0438\u0440\u0438\u043d\u0430 + \u0432\u0438\u0441\u043e\u0442\u0430) *\/\r\n.matrix-controls__item .toggle{\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: space-between;\r\n  gap: 10px;\r\n\r\n  width: 220px;                 \/* \u044f\u043a \u0443 .calculator-container select *\/\r\n  height: var(--ui-input-h);    \/* \u044f\u043a \u0443 select *\/\r\n  padding: 0 12px;              \/* \u044f\u043a \u0443 select *\/\r\n\r\n  border-radius: 12px;\r\n  border: 1px solid var(--ui-border);\r\n  background: var(--ui-panel);\r\n  color: var(--ui-text);\r\n  font-weight: 600;             \/* \u044f\u043a \u0443 select *\/\r\n\r\n  box-sizing: border-box;\r\n  cursor: pointer;\r\n\r\n  transition: box-shadow .15s ease, border-color .15s ease, background-color .2s ease, transform .05s ease;\r\n}\r\n\r\n\/* \u0445\u043e\u0432\u0430\u0454\u043c\u043e input, \u0430\u043b\u0435 \u043d\u0435 \u043b\u0430\u043c\u0430\u0454\u043c\u043e layout *\/\r\n.matrix-controls__item .toggle input{\r\n  position: absolute;\r\n  opacity: 0;\r\n  pointer-events: none;\r\n}\r\n\r\n\/* \u0422\u0440\u0435\u043a \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0438\u0439, \u0449\u043e\u0431 \u043d\u0435 \u201c\u0440\u043e\u0437\u043f\u0438\u0440\u0430\u0442\u0438\u201d \u0431\u043b\u043e\u043a *\/\r\n.matrix-controls__item .toggle__track{\r\n  flex: 0 0 auto;\r\n  width: 44px;\r\n  height: 24px;\r\n  border-radius: 999px;\r\n  border: 1px solid var(--ui-border);\r\n  background: color-mix(in oklab, var(--ui-panel), var(--ui-text) 6%);\r\n  position: relative;\r\n  transition: background-color .2s ease, border-color .2s ease;\r\n}\r\n\r\n.matrix-controls__item .toggle__track::after{\r\n  content:\"\";\r\n  position: absolute;\r\n  top: 50%;\r\n  left: 3px;\r\n  width: 18px;\r\n  height: 18px;\r\n  border-radius: 999px;\r\n  transform: translateY(-50%);\r\n  background: #fff;\r\n  border: 1px solid var(--ui-border);\r\n  box-shadow: 0 3px 10px rgba(2,8,23,.12);\r\n  transition: left .2s ease;\r\n}\r\n\r\n\/* \u0422\u0435\u043a\u0441\u0442 \u2014 \u044f\u043a \u0443 select, \u0437 \u043e\u0431\u0440\u0456\u0437\u0430\u043d\u043d\u044f\u043c *\/\r\n.matrix-controls__item .toggle__label{\r\n  flex: 1 1 auto;\r\n  min-width: 0;\r\n  white-space: nowrap;\r\n  overflow: hidden;\r\n  text-overflow: ellipsis;\r\n}\r\n\r\n\/* hover\/focus \u044f\u043a \u0443 select *\/\r\n.matrix-controls__item .toggle:hover{\r\n  border-color: var(--ui-accent);\r\n  background: color-mix(in oklab, var(--ui-panel), var(--ui-accent) 6%);\r\n}\r\n.matrix-controls__item .toggle:has(input:focus-visible){\r\n  border-color: var(--ui-accent);\r\n  box-shadow: var(--ui-focus);\r\n  background: #fff;\r\n  transform: translateY(-1px);\r\n}\r\n\r\n\/* checked *\/\r\n.matrix-controls__item .toggle input:checked + .toggle__track{\r\n  background: color-mix(in oklab, var(--ui-accent), white 70%);\r\n  border-color: var(--ui-accent);\r\n}\r\n.matrix-controls__item .toggle input:checked + .toggle__track::after{\r\n  left: calc(100% - 21px);\r\n}\r\n\r\n\/* \u0442\u0435\u043c\u043d\u0430 \u0442\u0435\u043c\u0430: \u0444\u043e\u043d \u201c\u043f\u0456\u0434 select\u201d *\/\r\n@media (prefers-color-scheme: dark){\r\n  .matrix-controls__item .toggle:has(input:focus-visible){\r\n    background: var(--ui-panel);\r\n  }\r\n  .matrix-controls__item .toggle__track::after{\r\n    background: #0f1a22;\r\n  }\r\n}\r\n\r\n\/* \u043d\u0430 \u043c\u043e\u0431\u0456\u043b\u044c\u043d\u043e\u043c\u0443 \u2014 \u044f\u043a select: 100% *\/\r\n@media (max-width:768px){\r\n  .matrix-controls__item .toggle{\r\n    width: 100%;\r\n  }\r\n}\r\n\r\n\/* 1) \u0412\u0438\u0440\u0456\u0432\u043d\u044e\u0454\u043c\u043e \u0432\u0441\u0456 \u0431\u043b\u043e\u043a\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0456\u0432 \u043f\u043e \u0432\u0435\u0440\u0445\u043d\u044c\u043e\u043c\u0443 \u043a\u0440\u0430\u044e *\/\r\n.matrix-controls{\r\n  align-items: flex-start; \/* \u0431\u0443\u043b\u043e flex-end *\/\r\n}\r\n\r\n\/* 2) \u041e\u0434\u043d\u0430\u043a\u043e\u0432\u0430 \u201c\u0433\u0435\u043e\u043c\u0435\u0442\u0440\u0456\u044f\u201d \u0434\u043b\u044f label \u0443 \u0432\u0441\u0456\u0445 item *\/\r\n.matrix-controls__item label{\r\n  line-height: 1.2;        \/* \u0456\u043d\u043a\u043e\u043b\u0438 label \u201c\u043f\u0456\u0434\u0441\u0442\u0440\u0438\u0431\u0443\u0454\u201d \u0447\u0435\u0440\u0435\u0437 line-height *\/\r\n  margin-bottom: 8px;      \/* \u044f\u043a \u0443 \u0432\u0430\u0448\u0438\u0445 \u0431\u0430\u0437\u043e\u0432\u0438\u0445 \u0441\u0442\u0438\u043b\u044f\u0445 select *\/\r\n}\r\n\r\n\/* 3) \u0422\u0443\u043c\u0431\u043b\u0435\u0440 \u044f\u043a control: \u0441\u0442\u0430\u0432\u0438\u043c\u043e \u0439\u043e\u0433\u043e \u0447\u0456\u0442\u043a\u043e \u043f\u0456\u0434 label *\/\r\n.matrix-controls__item .toggle{\r\n  margin-top: 0;           \/* \u043d\u0430 \u0432\u0438\u043f\u0430\u0434\u043e\u043a \u044f\u043a\u0449\u043e \u0434\u0435\u0441\u044c \u0431\u0443\u043b\u043e *\/\r\n}\r\n\r\n\/* 4) \u042f\u043a\u0449\u043e \u0443 \u0432\u0430\u0441 label \u0434\u043b\u044f \u0442\u0443\u043c\u0431\u043b\u0435\u0440\u0430 \u2014 sr-only, \u0442\u043e \u0432\u0456\u0434\u0441\u0442\u0443\u043f\u0443 \u043f\u0456\u0434 \u043d\u044c\u043e\u0433\u043e \u043d\u0435\u043c\u0430.\r\n      \u0422\u043e\u0434\u0456 \u0434\u043e\u0434\u0430\u0454\u043c\u043e \u201c\u0448\u0442\u0443\u0447\u043d\u0438\u0439\u201d \u0432\u0456\u0434\u0441\u0442\u0443\u043f, \u0449\u043e\u0431 \u0441\u043f\u0456\u0432\u043f\u0430\u043b\u043e \u0437 select *\/\r\n.matrix-controls__item .toggle--like-select{\r\n  margin-top: 8px;         \/* \u0456\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e \u0432\u0456\u0434\u0441\u0442\u0443\u043f\u0443 \u043f\u0456\u0434 label \u0443 select *\/\r\n}\r\n\r\n\/* FIX: error badge \u044f\u043a \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0438\u0439 \u0431\u043b\u043e\u043a + \u043a\u043e\u0440\u0435\u043a\u0442\u043d\u0456 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438 *\/\r\n.solution-container p.cramer-badge.cramer-badge--error{\r\n  display: block !important;\r\n  width: 100%;\r\n  max-width: 100%;\r\n  box-sizing: border-box;\r\n\r\n  padding: 12px 14px;\r\n  margin: 10px 0;\r\n\r\n  border-radius: 12px;\r\n  border: 1px solid color-mix(in oklab, var(--cs-error), white 70%);\r\n  border-left: 4px solid var(--cs-error);\r\n\r\n  background: color-mix(in oklab, var(--cs-error), white 90%);\r\n  color: var(--cs-error);\r\n\r\n  font-weight: 700;\r\n  line-height: 1.55;\r\n\r\n  \/* \u0433\u043e\u043b\u043e\u0432\u043d\u0435: \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u043d\u043e\u0441 *\/\r\n  white-space: normal !important;\r\n  overflow-wrap: anywhere;\r\n  word-break: break-word;\r\n}\r\n\r\n\/* MathJax inline \u0432\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0456 p: \u043d\u0435 \u0440\u0432\u0435 \u0440\u044f\u0434\u043e\u043a \u0456 \u043d\u0435 \u0432\u0438\u043f\u0438\u0440\u0430\u0454 *\/\r\n.solution-container p.cramer-badge.cramer-badge--error .MathJax,\r\n.solution-container p.cramer-badge.cramer-badge--error .mjx-container{\r\n  display: inline !important;\r\n  max-width: 100% !important;\r\n  white-space: normal !important;\r\n}\r\n\r\n\/* \u0442\u0435\u043c\u043d\u0430 \u0442\u0435\u043c\u0430 *\/\r\n@media (prefers-color-scheme: dark){\r\n  .solution-container p.cramer-badge.cramer-badge--error{\r\n    background: rgba(155, 36, 36, 0.18);\r\n    border-color: rgba(255, 123, 123, 0.28);\r\n    color: var(--cs-error);\r\n  }\r\n}\r\n\r\n\r\n<\/style>\r\n\r\n<!-- ======================== JS ========================= -->\r\n<script>\r\n\/* =========================================================\r\n   UI \u0434\u043b\u044f AJAX-\u0441\u043d\u0456\u043f\u0435\u0442\u0430:\r\n   action = calculate_pseudoinverse_matrix_svd\r\n   POST:\r\n     - matrix: JSON\r\n     - tol: string\/number (\u0431\u0435\u0440\u0435\u043c\u043e \u0437\u0456 select #svdTol)\r\n   \u041e\u0442\u0440\u0438\u043c\u0443\u0454\u043c\u043e:\r\n     solution[0], solution[1] (latex), solution[2] (html)\r\n========================================================= *\/\r\n\r\nlet activeController = null;\r\n\r\nconst AJAX_URL = (typeof window !== 'undefined' && window.ajaxurl)\r\n  ? window.ajaxurl\r\n  : '\/ru\/wp-admin\/admin-ajax.php';\r\n\r\nfunction setLoading(isLoading){\r\n  const loading = document.getElementById('loading');\r\n  if (loading) loading.style.display = isLoading ? 'block' : 'none';\r\n}\r\nfunction setGenerateDisabled(disabled){\r\n  const btn = document.getElementById('generate-button');\r\n  if (btn) btn.disabled = !!disabled;\r\n}\r\nfunction showError(message){\r\n  const el = document.getElementById('error-block');\r\n  if (!el) return;\r\n  el.textContent = message || '\u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430.';\r\n  el.classList.add('show');\r\n}\r\nfunction clearError(){\r\n  const el = document.getElementById('error-block');\r\n  if (!el) return;\r\n  el.textContent = '';\r\n  el.classList.remove('show');\r\n}\r\n\r\nfunction escapeHtml(s){\r\n  return String(s ?? '').replace(\/[&<>\"']\/g, m => ({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[m]));\r\n}\r\n\r\n\/* ===== MathJax v2 ===== *\/\r\nfunction renderMathJax(container, tries = 12){\r\n  const el = container || document.getElementById('fcontainer');\r\n  if (!el) return;\r\n\r\n  if (window.MathJax && window.MathJax.Hub && MathJax.Hub.Queue){\r\n    MathJax.Hub.Queue([\"Typeset\", MathJax.Hub, el]);\r\n    return;\r\n  }\r\n  if (tries > 0){\r\n    setTimeout(() => renderMathJax(el, tries - 1), 120);\r\n  }\r\n}\r\n\r\n\/* ===== \u041d\u043e\u0440\u043c\u0430\u043b\u0456\u0437\u0430\u0446\u0456\u044f \u0447\u0438\u0441\u043b\u0430 \u0432 input ===== *\/\r\nfunction normalizeNumberInput(value){\r\n  let s = String(value ?? '').trim();\r\n  if (!s) return '';\r\n  s = s.replace(\/\\s+\/g, '').replace(',', '.');\r\n  s = s.replace(\/[^0-9eE+\\-.]\/g, '');\r\n  s = s.replace(\/(?!^)-\/g, '');\r\n  const parts = s.split('.');\r\n  if (parts.length > 2) s = parts[0] + '.' + parts.slice(1).join('');\r\n  return s;\r\n}\r\n\r\nfunction parseNumberSafe(val){\r\n  const v = normalizeNumberInput(val);\r\n  if (v === '') return 0;\r\n  if (v === '-' || v === '.' || v === '-.' || v === 'e' || v === 'E') return null;\r\n  const n = Number(v);\r\n  return Number.isFinite(n) ? n : null;\r\n}\r\n\r\n\/* ===== tol \u0437\u0456 select ===== *\/\r\nfunction parseTolFromSelect(){\r\n  const el = document.getElementById('svdTol');\r\n  const raw = String(el ? el.value : '1e-10').trim();\r\n  const n = Number(raw);\r\n  if (!Number.isFinite(n) || n <= 0) return null;\r\n  return n;\r\n}\r\n\r\n\/* ===== \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043f\u0435\u0440\u0435\u0434 \u043a\u0440\u043e\u043a\u0430\u043c\u0438 ===== *\/\r\nfunction buildHeadingHTML(){\r\n  const rows = Number(document.getElementById('matrixRows')?.value || 3);\r\n  const cols = Number(document.getElementById('matrixCols')?.value || 3);\r\n  const tol  = String(document.getElementById('svdTol')?.value || '1e-10').trim();\r\n\r\n  return `\r\n    <h2 class=\"cramer-heading\" role=\"heading\" aria-level=\"2\">\r\n      <span class=\"cramer-heading__title\">\u041f\u0441\u0435\u0432\u0434\u043e\u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u2014 SVD<\/span>\r\n      <span class=\"cramer-heading__meta\">\r\n        A\u207a \u0434\u043b\u044f A \u2208 \u211d<sup>${rows}\u00d7${cols}<\/sup> \u2022 \u0441\u0442\u0440\u043e\u0438\u043c A\u1d40\u22c5A, \u043d\u0430\u0445\u043e\u0434\u0438\u043c V \u0438 \u03c3\u1d62, \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c U \u2022 tol=${escapeHtml(tol)}\r\n      <\/span>\r\n    <\/h2>\r\n  `;\r\n}\r\n\r\n\/* ===== Grid: m\u00d7n ===== *\/\r\nfunction clearResult(){\r\n  const resultC = document.getElementById('fcontainer');\r\n  if (resultC){\r\n    resultC.innerHTML = '';\r\n    resultC.style.display = 'none';\r\n  }\r\n}\r\nfunction removeInputErrorStyles(){\r\n  const table = document.getElementById('matrixTable');\r\n  if (!table) return;\r\n  table.querySelectorAll('input.input-error').forEach(inp => inp.classList.remove('input-error'));\r\n}\r\n\r\nfunction changeMatrixSize(){\r\n  const rows = Number(document.getElementById('matrixRows')?.value || 3) || 3;\r\n  const cols = Number(document.getElementById('matrixCols')?.value || 3) || 3;\r\n\r\n  clearResult();\r\n  clearError();\r\n  removeInputErrorStyles();\r\n\r\n  const table = document.getElementById('matrixTable');\r\n  if (!table) return;\r\n  while (table.rows.length > 0) table.deleteRow(0);\r\n\r\n  for (let i = 0; i < rows; i++){\r\n    const row = table.insertRow(-1);\r\n    for (let j = 0; j < cols; j++){\r\n      const cell = row.insertCell(-1);\r\n      const input = document.createElement('input');\r\n\r\n      input.type = 'text';\r\n      input.name = `A[${i}][${j}]`;\r\n      input.placeholder = '0';\r\n      input.inputMode = 'decimal';\r\n      input.autocomplete = 'off';\r\n      input.spellcheck = false;\r\n\r\n      input.addEventListener('input', () => {\r\n        const fixed = normalizeNumberInput(input.value);\r\n        if (input.value !== fixed) input.value = fixed;\r\n        if (input.classList.contains('input-error')) input.classList.remove('input-error');\r\n      });\r\n\r\n      input.addEventListener('keydown', (e) => {\r\n        const allowed = [\r\n          'Backspace','Delete','Tab','Enter','Escape',\r\n          'ArrowLeft','ArrowRight','Home','End',\r\n          '-', '.', ',', 'e', 'E', '+'\r\n        ];\r\n        if (\r\n          allowed.includes(e.key) ||\r\n          (e.key.length === 1 && \/[0-9]\/.test(e.key)) ||\r\n          e.ctrlKey || e.metaKey\r\n        ) return;\r\n        e.preventDefault();\r\n      });\r\n\r\n      cell.appendChild(input);\r\n    }\r\n  }\r\n}\r\n\r\n\/* ===== \u0417\u0431\u0456\u0440 \u043c\u0430\u0442\u0440\u0438\u0446\u0456 ===== *\/\r\nfunction collectMatrix(){\r\n  const table = document.getElementById('matrixTable');\r\n  if (!table) return { matrix: [], invalidCount: 0 };\r\n\r\n  let invalidCount = 0;\r\n  const matrix = [];\r\n\r\n  for (let i = 0; i < table.rows.length; i++){\r\n    const row = table.rows[i];\r\n    const rowVals = [];\r\n    for (let j = 0; j < row.cells.length; j++){\r\n      const input = row.cells[j].querySelector('input');\r\n      const raw = input ? input.value : '';\r\n      const parsed = parseNumberSafe(raw);\r\n\r\n      if (parsed === null){\r\n        invalidCount++;\r\n        if (input) input.classList.add('input-error');\r\n        rowVals.push(0);\r\n      } else {\r\n        rowVals.push(parsed);\r\n      }\r\n    }\r\n    matrix.push(rowVals);\r\n  }\r\n\r\n  return { matrix, invalidCount };\r\n}\r\n\r\n\/* ===== \u0420\u0435\u043d\u0434\u0435\u0440 \u0440\u043e\u0437\u0432\u2019\u044f\u0437\u0430\u043d\u043d\u044f ===== *\/\r\nfunction renderSolutionIntoContainer(resultC, payload){\r\n  const heading = buildHeadingHTML();\r\n  let html = heading + '<div class=\"cramer-solution\">';\r\n\r\n  if (Array.isArray(payload)){\r\n    const texts = payload[2] || [];\r\n    const forms = payload[1] || [];\r\n    const n = Math.max(texts.length, forms.length);\r\n\r\n    for (let i = 0; i < n; i++){\r\n      html += '<section class=\"cramer-step\">';\r\n      if (texts[i]) html += texts[i];\r\n      if (forms[i]) html += '<div class=\"formula\">' + forms[i] + '<\/div>';\r\n      html += '<\/section>';\r\n    }\r\n  } else {\r\n    html += '<section class=\"cramer-step\"><div class=\"formula\">\\\\[' + payload + '\\\\]<\/div><\/section>';\r\n  }\r\n\r\n  html += '<\/div>';\r\n  resultC.innerHTML = html;\r\n}\r\n\r\n\/* ===== \u0417\u0430\u043f\u0438\u0442 \u043d\u0430 \u0431\u0435\u043a\u0435\u043d\u0434 ===== *\/\r\nfunction sendMatrixToServer(matrix){\r\n  const resultC = document.getElementById('fcontainer');\r\n\r\n  clearResult();\r\n  clearError();\r\n\r\n  if (activeController){\r\n    try { activeController.abort(); } catch(_) {}\r\n  }\r\n  activeController = new AbortController();\r\n\r\n  setLoading(true);\r\n  setGenerateDisabled(true);\r\n\r\n  const tol = parseTolFromSelect();\r\n  if (tol === null){\r\n    setLoading(false);\r\n    setGenerateDisabled(false);\r\n    showError('\u041d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u043f\u043e\u0440\u043e\u0433 \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u0438 tol. \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430.');\r\n    return;\r\n  }\r\n\r\n  const fd = new FormData();\r\n  fd.append('action', 'calculate_pseudoinverse_matrix_svd');\r\n  fd.append('matrix', JSON.stringify(matrix));\r\n  fd.append('tol', String(tol));\r\n\r\n  fetch(AJAX_URL, {\r\n    method: 'POST',\r\n    body: fd,\r\n    signal: activeController.signal\r\n  })\r\n    .then(res => {\r\n      if (!res.ok) throw new Error('Network response was not ok');\r\n      return res.json();\r\n    })\r\n    .then(data => {\r\n      setLoading(false);\r\n      setGenerateDisabled(false);\r\n\r\n      if (!resultC) return;\r\n\r\n      if (!data || data.success !== true){\r\n        showError((data && data.error) ? data.error : '\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435.');\r\n        return;\r\n      }\r\n\r\n      const payload = data.solution;\r\n      if (!payload){\r\n        showError('\u0421\u0435\u0440\u0432\u0435\u0440 \u0432\u0435\u0440\u043d\u0443\u043b \u043f\u0443\u0441\u0442\u043e\u0439 \u043e\u0442\u0432\u0435\u0442 (\u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f).');\r\n        return;\r\n      }\r\n\r\n      renderSolutionIntoContainer(resultC, payload);\r\n      resultC.style.display = 'block';\r\n      renderMathJax(resultC);\r\n\r\n      resultC.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n    })\r\n    .catch(err => {\r\n      if (err && err.name === 'AbortError') return;\r\n      setLoading(false);\r\n      setGenerateDisabled(false);\r\n      showError(err?.message || '\u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u0435\u0442\u0438.');\r\n    });\r\n}\r\n\r\nfunction calculatePseudoinverse(){\r\n  clearError();\r\n  removeInputErrorStyles();\r\n\r\n  const { matrix, invalidCount } = collectMatrix();\r\n  if (!matrix.length){\r\n    showError('\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u044b.');\r\n    return;\r\n  }\r\n  if (invalidCount > 0){\r\n    showError('\u0412 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0438\u0441\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044f.');\r\n    return;\r\n  }\r\n\r\n  const tol = parseTolFromSelect();\r\n  if (tol === null){\r\n    showError('\u041d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u043f\u043e\u0440\u043e\u0433 \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u0438 tol. \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430.');\r\n    return;\r\n  }\r\n\r\n  sendMatrixToServer(matrix);\r\n}\r\n\r\n\/* ===== \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \/ \u0417\u0430\u043f\u043e\u0432\u043d\u0438\u0442\u0438 \u0432\u0438\u043f\u0430\u0434\u043a\u043e\u0432\u043e ===== *\/\r\nfunction clearMatrix(){\r\n  const table = document.getElementById('matrixTable');\r\n  if (!table) return;\r\n\r\n  table.querySelectorAll('input[type=\"text\"]').forEach(inp => {\r\n    inp.value = '';\r\n    inp.classList.remove('input-error');\r\n  });\r\n\r\n  clearError();\r\n  clearResult();\r\n}\r\n\r\nfunction getRandomSettings(){\r\n  const minEl = document.getElementById('randMin');\r\n  const maxEl = document.getElementById('randMax');\r\n  const decEl = document.getElementById('randDecimals');\r\n\r\n  const minV = parseNumberSafe(minEl ? minEl.value : '-5');\r\n  const maxV = parseNumberSafe(maxEl ? maxEl.value : '5');\r\n  const decimals = Number(decEl ? decEl.value : 0) || 0;\r\n\r\n  if (minV === null || maxV === null){\r\n    return { ok:false, error:'\u041d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f (\u043c\u0438\u043d\u0438\u043c\u0443\u043c\/\u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c).' };\r\n  }\r\n  if (maxV < minV){\r\n    return { ok:false, error:'\u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u2265 \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0430.' };\r\n  }\r\n  if (decimals < 0 || decimals > 6){\r\n    return { ok:false, error:'\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u043a\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 0\u20136.' };\r\n  }\r\n\r\n  return { ok:true, min:minV, max:maxV, decimals };\r\n}\r\n\r\nfunction randFloat(min, max){\r\n  return Math.random() * (max - min) + min;\r\n}\r\n\r\nfunction fillRandom(){\r\n  const settings = getRandomSettings();\r\n  if (!settings.ok){\r\n    showError(settings.error);\r\n    return;\r\n  }\r\n\r\n  const table = document.getElementById('matrixTable');\r\n  if (!table) return;\r\n\r\n  const { min, max, decimals } = settings;\r\n\r\n  table.querySelectorAll('input[type=\"text\"]').forEach(inp => {\r\n    const v = randFloat(min, max);\r\n    const out = (decimals === 0) ? String(Math.round(v)) : String(Number(v.toFixed(decimals)));\r\n    inp.value = normalizeNumberInput(out);\r\n    inp.classList.remove('input-error');\r\n  });\r\n\r\n  clearError();\r\n  clearResult();\r\n}\r\n\r\n\/* ===== Init ===== *\/\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n  changeMatrixSize();\r\n\r\n  const rSel = document.getElementById('matrixRows');\r\n  const cSel = document.getElementById('matrixCols');\r\n  if (rSel) rSel.addEventListener('change', changeMatrixSize);\r\n  if (cSel) cSel.addEventListener('change', changeMatrixSize);\r\n\r\n  const tolSel = document.getElementById('svdTol');\r\n  if (tolSel){\r\n    tolSel.addEventListener('change', () => {\r\n      clearError();\r\n      clearResult();\r\n    });\r\n  }\r\n\r\n  const table = document.getElementById('matrixTable');\r\n  if (table){\r\n    table.addEventListener('keydown', (e) => {\r\n      if (e.key === 'Enter'){\r\n        e.preventDefault();\r\n        calculatePseudoinverse();\r\n      }\r\n    });\r\n  }\r\n\r\n  const btn = document.getElementById('generate-button');\r\n  if (btn) btn.addEventListener('click', calculatePseudoinverse);\r\n\r\n  const clearBtn = document.getElementById('clearMatrixBtn');\r\n  if (clearBtn) clearBtn.addEventListener('click', clearMatrix);\r\n\r\n  const randBtn = document.getElementById('fillRandomBtn');\r\n  if (randBtn) randBtn.addEventListener('click', fillRandom);\r\n\r\n  const minEl = document.getElementById('randMin');\r\n  const maxEl = document.getElementById('randMax');\r\n  [minEl, maxEl].forEach(el => {\r\n    if (!el) return;\r\n    el.addEventListener('input', () => {\r\n      const fixed = normalizeNumberInput(el.value);\r\n      if (el.value !== fixed) el.value = fixed;\r\n    });\r\n  });\r\n});\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a1edd14 elementor-widget elementor-widget-html\" data-id=\"a1edd14\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"h2-title2\">\u041f\u0441\u0435\u0432\u0434\u043e\u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u041e\u043d\u043b\u0430\u0439\u043d: \u041a\u0430\u043a \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u041a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440<\/h2>\n<img decoding=\"async\" class=\"aligncenter wp-image-10020256 size-full\" src=\"https:\/\/www.mathros.net.ua\/ru\/wp-content\/uploads\/2026\/02\/pseudoinverse-of-a-matrix-calculator1.jpg\" alt=\"\u041f\u0441\u0435\u0432\u0434\u043e\u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043e\u043d\u043b\u0430\u0439\u043d\" width=\"150\" height=\"150\" \/>\n<p class=\"calculator-p\"><a title=\"\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430\" href=\"https:\/\/www.mathros.net.ua\/ru\/psevdoobratnaya-matrica.html\">\u041f\u0441\u0435\u0432\u0434\u043e\u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430<\/a> \u043e\u043d\u043b\u0430\u0439\u043d \u2014 \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u0442\u0440\u0438\u0446\u044b (\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a \u0438 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432), \u0432\u0432\u043e\u0434\u0438\u0442\u0435 \u0447\u0438\u0441\u043b\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u0442\u0435 \u043a\u043d\u043e\u043f\u043a\u0443 <em>\u00ab\u041d\u0430\u0439\u0442\u0438 \u043f\u0441\u0435\u0432\u0434\u043e\u043e\u0431\u0440\u0430\u0442\u043d\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443\u00bb<\/em>. \u0410 \u0435\u0441\u043b\u0438 \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0432\u0441\u0451 \u043d\u0430\u0431\u0438\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 \u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435?<\/p>\n<p class=\"calculator-p\">\u0414\u0430\u043b\u044c\u0448\u0435 \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440 \u0441\u0442\u0440\u043e\u0438\u0442 <a title=\"\u0421\u0438\u043d\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A1%D0%B8%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D0%B7%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\u0441\u0438\u043d\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 (SVD)<\/a> \u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0443 \u0448\u0430\u0433 \u0437\u0430 \u0448\u0430\u0433\u043e\u043c: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \\( A^{T}\\cdot A \\), \u0437\u0430\u0442\u0435\u043c \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0435\u0451 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u044b, \u0438 \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0438\u043d\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \\( \\sigma_i \\). \u0418 \u0442\u0443\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0430\u0436\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u2014 \u043f\u043e\u0440\u043e\u0433 \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u0438 (tol): \u0435\u0441\u043b\u0438 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \\( \\sigma_i \\) \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0435, \u0441\u0442\u043e\u0438\u0442 \u043b\u0438 \u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \\( \\sigma_i \\) \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f?<\/p>\n<p class=\"calculator-p\">\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \\( A^{+} \\) \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435 \u0441\u043e\u043a\u0440\u0430\u0449\u0451\u043d\u043d\u043e\u0433\u043e SVD, \u0430 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u043e, \u0447\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f: \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u041c\u0443\u0440\u0430\u2013\u041f\u0435\u043d\u0440\u043e\u0443\u0437\u0430. \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0438 \\( A\\cdot A^{+}\\cdot A \\approx A \\), \u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \\( A\\cdot A^{+} \\) \u0438 \\( A^{+}\\cdot A \\) \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0447\u0442\u0438 \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u043c\u0438? \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043d, \u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0435\u043d.<\/p>\n<style>\n    \/* ===== Intro block (title + image + paragraphs) ===== *\/\n\n\/* Title *\/\n.h2-title2 {\n  \/* typography *\/\n  font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif;\n  font-weight: 800;\n  font-size: clamp(1.25rem, 1.05rem + 1.4vw, 1.9rem); \/* ~20\u201330px *\/\n  line-height: 1.25;\n  letter-spacing: .01em;\n\n  \/* layout *\/\n  text-align: center;\n  max-width: 800px;\n  margin: 18px auto 12px;\n  padding: 0;\n\n  \/* color (better than plain gray) *\/\n  color: #334155; \/* slate-700 *\/\n  text-wrap: balance;\n}\n\n\/* Paragraphs *\/\n.calculator-p {\n  font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif;\n  font-weight: 500;\n  font-size: clamp(0.95rem, 0.9rem + 0.3vw, 1rem); \/* ~15\u201316px *\/\n  line-height: 1.65;\n  color: #475569;   \/* slate-600 *\/\n  max-width: 800px;\n  margin: 10px auto;\n  padding: 0 6px;   \/* tiny breathing room on small screens *\/\n  text-align: center;\n  text-wrap: pretty;\n}\n\n\/* Links inside paragraphs *\/\n.calculator-p a {\n  color: #0b638b;\n  text-decoration: underline;\n  text-underline-offset: 3px;\n  text-decoration-thickness: 1.5px;\n  transition: color .15s ease, text-decoration-color .15s ease;\n}\n.calculator-p a:hover {\n  color: #084e6c;\n  text-decoration-color: currentColor;\n}\n.calculator-p a:focus-visible {\n  outline: none;\n  box-shadow: 0 0 0 3px rgba(11, 99, 139, .25);\n  border-radius: 6px;\n}\n\n\/* Centered image *\/\n.aligncenter {\n  display: block;\n  margin: 16px auto;\n  max-width: min(100%, 220px); \/* cap the size to keep the layout tidy *\/\n  height: auto;\n}\n\n\/* Dark mode *\/\n@media (prefers-color-scheme: dark) {\n  .h2-title2 { color: #e2e8f0; }      \/* slate-200 *\/\n  .calculator-p { color: #b6c3cf; }   \/* soft slate for paragraphs *\/\n  .calculator-p a { color: #5ac2f2; }\n  .calculator-p a:hover { color: #82d6fa; }\n}\n\n\/* Tablet tweaks *\/\n@media (max-width: 768px) {\n  .h2-title2 { margin: 16px auto 10px; }\n  .calculator-p { margin: 8px auto; }\n}\n\n\/* Small phones *\/\n@media (max-width: 480px) {\n  .aligncenter { max-width: min(100%, 180px); }\n}\n<\/style>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u041f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0430\u044f \u0438\u043b\u0438 \u0412\u044b\u0440\u043e\u0436\u0434\u0435\u043d\u043d\u0430\u044f? \u041d\u0430\u0448 \u041e\u043d\u043b\u0430\u0439\u043d-\u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440 \u041f\u0441\u0435\u0432\u0434\u043e\u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u041c\u0430\u0442\u0440\u0438\u0446\u044b \u0441 \u041f\u043e\u043c\u043e\u0449\u044c\u044e SVD \u041f\u043e\u043a\u0430\u0436\u0435\u0442 \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u0438 \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a 2345678 \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-centered.php","meta":{"footnotes":""},"class_list":["post-2384","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.mathros.net.ua\/ru\/wp-json\/wp\/v2\/pages\/2384"}],"collection":[{"href":"https:\/\/www.mathros.net.ua\/ru\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.mathros.net.ua\/ru\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.mathros.net.ua\/ru\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mathros.net.ua\/ru\/wp-json\/wp\/v2\/comments?post=2384"}],"version-history":[{"count":35,"href":"https:\/\/www.mathros.net.ua\/ru\/wp-json\/wp\/v2\/pages\/2384\/revisions"}],"predecessor-version":[{"id":2483,"href":"https:\/\/www.mathros.net.ua\/ru\/wp-json\/wp\/v2\/pages\/2384\/revisions\/2483"}],"wp:attachment":[{"href":"https:\/\/www.mathros.net.ua\/ru\/wp-json\/wp\/v2\/media?parent=2384"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}