'''simple docstring'''

from __future__ import annotations







def __UpperCamelCase(   _A					:				int    ):
   '''simple docstring'''
   UpperCAmelCase__							:				Tuple   				=  2
   UpperCAmelCase__							:				List[Any]   				=  []
   while i * i <= n:
      if n % i:
         i += 1
      else:
         n //= i
         factors.append(_A    )
   if n > 1:
      factors.append(_A    )
   return factors


if __name__ == "__main__":
  import doctest

  doctest.testmod()





'''simple docstring'''

import unittest

import numpy as np







def __UpperCamelCase(   _A					:				np.ndarray  ,			_A					:				np.ndarray  ,			_A					:				np.ndarray  ,			_A					:				np.ndarray | None = None  ,			):
   '''simple docstring'''
   UpperCAmelCase__							:				Any   				=  np.shape(_A    )
   UpperCAmelCase__							:				List[Any]   				=  np.shape(_A    )
   UpperCAmelCase__							:				Tuple   				=  np.shape(_A    )

   if shape_a[0] != shape_b[0]:
      UpperCAmelCase__							:				Any   				=  (
          '''Expected the same number of rows for A and B. '''
          F'''Instead found A of size {shape_a} and B of size {shape_b}'''
      )
      raise ValueError(_A    )

   if shape_b[1] != shape_c[1]:
      UpperCAmelCase__							:				List[str]   				=  (
          '''Expected the same number of columns for B and C. '''
          F'''Instead found B of size {shape_b} and C of size {shape_c}'''
      )
      raise ValueError(_A    )

   UpperCAmelCase__							:				Optional[Any]   				=  pseudo_inv
   if a_inv is None:
      try:
         UpperCAmelCase__							:				str   				=  np.linalg.inv(_A    )
      except np.linalg.LinAlgError:
         raise ValueError(
             '''Input matrix A is not invertible. Cannot compute Schur complement.'''    )

   return mat_c - mat_b.T @ a_inv @ mat_b


class 				_lowercase	(      unittest.TestCase   ):
      '''simple docstring'''


      def 		lowerCAmelCase__					(				self							)			->			None:



         '''simple docstring'''



         UpperCAmelCase__							:				int   				=  np.array([[1, 2, 1], [2, 1, 2], [3, 2, 4]]							)
         UpperCAmelCase__							:				List[Any]   				=  np.array([[0, 3], [3, 0], [2, 3]]							)
         UpperCAmelCase__							:				Optional[Any]   				=  np.array([[2, 1], [6, 3]]							)

         UpperCAmelCase__							:				Tuple   				=  schur_complement(lowerCamelCase_					,lowerCamelCase_					,lowerCamelCase_							)

         UpperCAmelCase__							:				Tuple   				=  np.block([[a, b], [b.T, c]]							)

         UpperCAmelCase__							:				int   				=  np.linalg.det(lowerCamelCase_							)
         UpperCAmelCase__							:				Optional[Any]   				=  np.linalg.det(lowerCamelCase_							)
         UpperCAmelCase__							:				Union[str, Any]   				=  np.linalg.det(lowerCamelCase_							)

         self.assertAlmostEqual(lowerCamelCase_					,det_a * det_s							)




      def 		lowerCAmelCase__					(				self							)			->			None:



         '''simple docstring'''



         UpperCAmelCase__							:				Optional[Any]   				=  np.array([[1, 2, 1], [2, 1, 2], [3, 2, 4]]							)
         UpperCAmelCase__							:				Tuple   				=  np.array([[0, 3], [3, 0], [2, 3]]							)
         UpperCAmelCase__							:				Tuple   				=  np.array([[2, 1], [6, 3]]							)

         with self.assertRaises(lowerCamelCase_							):
            schur_complement(lowerCamelCase_					,lowerCamelCase_					,lowerCamelCase_							)




      def 		lowerCAmelCase__					(				self							)			->			None:



         '''simple docstring'''



         UpperCAmelCase__							:				Dict   				=  np.array([[1, 2, 1], [2, 1, 2], [3, 2, 4]]							)
         UpperCAmelCase__							:				str   				=  np.array([[0, 3], [3, 0], [2, 3]]							)
         UpperCAmelCase__							:				Any   				=  np.array([[2, 1, 3], [6, 3, 5]]							)

         with self.assertRaises(lowerCamelCase_							):
            schur_complement(lowerCamelCase_					,lowerCamelCase_					,lowerCamelCase_							)


if __name__ == "__main__":
  import doctest

  doctest.testmod()
  unittest.main()




