




from math import factorial

lowerCamelCase__			:       dict[str, int]         =							{str(digit): factorial(digit) for digit in range(10)}

def  UpperCAmelCase_							(				__UpperCAmelCase						:     int							) ->			int:






						if not isinstance(_lowercase      ,      _lowercase							):
												raise TypeError('Parameter number must be int'							)

						if number < 0:
												raise ValueError('Parameter number must be greater than or equal to 0'							)

						# Converts number in string to iterate on its digits and adds its factorial.
						return sum(DIGIT_FACTORIAL[digit] for digit in str(_lowercase							)							)

def  UpperCAmelCase_							(				__UpperCAmelCase						:     int = 60      ,      __UpperCAmelCase						:     int = 1_00_00_00							) ->			int:






						if not isinstance(_lowercase      ,      _lowercase							) or not isinstance(_lowercase      ,      _lowercase							):
												raise TypeError('Parameters chain_length and number_limit must be int'							)

						if chain_length <= 0 or number_limit <= 0:
												raise ValueError(
												    'Parameters chain_length and number_limit must be greater than 0'							)

						# the counter for the chains with the exact desired length
						SCREAMING_SNAKE_CASE_     						=      0
						# the cached sizes of the previous chains
						SCREAMING_SNAKE_CASE_     						=      {}

						for start_chain_element in range(1      ,      _lowercase							):
												# The temporary set will contain the elements of the chain
												SCREAMING_SNAKE_CASE_     						=      set()
												SCREAMING_SNAKE_CASE_     						=      0

												# Stop computing the chain when you find a cached size, a repeating item or the
												# length is greater then the desired one.
												SCREAMING_SNAKE_CASE_     						=      start_chain_element
												while (
												    chain_element not in chain_sets_lengths
												    and chain_element not in chain_set
												    and chain_set_length <= chain_length
												):
																		chain_set.add(_lowercase							)
																		chain_set_length += 1
																		SCREAMING_SNAKE_CASE_     						=      digit_factorial_sum(_lowercase							)

												if chain_element in chain_sets_lengths:
																		chain_set_length += chain_sets_lengths[chain_element]

												SCREAMING_SNAKE_CASE_     						=      chain_set_length

												# If chain contains the exact amount of elements increase the counter
												if chain_set_length == chain_length:
																		chains_counter += 1

						return chains_counter


if __name__ == "__main__":
			import doctest

			doctest.testmod()
			print(f'''{solution()}''')





import cva
import numpy as np





class 	lowerCamelCase_							:


 '''simple docstring'''







 def __init__(							self  :		Optional[Any]    ,    _lowerCAmelCase  :		float    ,    _lowerCAmelCase  :		int						):

       if k in (0.04, 0.06):
             SCREAMING_SNAKE_CASE_     						=      k
             SCREAMING_SNAKE_CASE_     						=      window_size
       else:
             raise ValueError('invalid k value'						)



 def __str__(							self  :		Tuple						):
       return str(self.k						)




 def 				lowerCAmelCase_  (							self  :		int    ,    _lowerCAmelCase  :		str						):
       SCREAMING_SNAKE_CASE_     						=      cva.imread(_lowerCAmelCase    ,    0						)
       SCREAMING_SNAKE_CASE_						,			SCREAMING_SNAKE_CASE_     						=      img.shape
       SCREAMING_SNAKE_CASE_     						=      []
       SCREAMING_SNAKE_CASE_     						=      img.copy()
       SCREAMING_SNAKE_CASE_     						=      cva.cvtColor(_lowerCAmelCase    ,    cva.COLOR_GRAY2RGB						)
       SCREAMING_SNAKE_CASE_						,			SCREAMING_SNAKE_CASE_     						=      np.gradient(_lowerCAmelCase						)
       SCREAMING_SNAKE_CASE_     						=      dx**2
       SCREAMING_SNAKE_CASE_     						=      dy**2
       SCREAMING_SNAKE_CASE_     						=      dx * dy
       SCREAMING_SNAKE_CASE_     						=      0.04
       SCREAMING_SNAKE_CASE_     						=      self.window_size // 2
       for y in range(_lowerCAmelCase    ,    h - offset						):
             for x in range(_lowerCAmelCase    ,    w - offset						):
                   SCREAMING_SNAKE_CASE_     						=      ixx[
                       y - offset : y + offset + 1, x - offset : x + offset + 1
                   ].sum()
                   SCREAMING_SNAKE_CASE_     						=      iyy[
                       y - offset : y + offset + 1, x - offset : x + offset + 1
                   ].sum()
                   SCREAMING_SNAKE_CASE_     						=      ixy[
                       y - offset : y + offset + 1, x - offset : x + offset + 1
                   ].sum()

                   SCREAMING_SNAKE_CASE_     						=      (wxx * wyy) - (wxy**2)
                   SCREAMING_SNAKE_CASE_     						=      wxx + wyy
                   SCREAMING_SNAKE_CASE_     						=      det - k * (trace**2)
                   # Can change the value
                   if r > 0.5:
                         corner_list.append([x, y, r]						)
                         color_img.itemset((y, x, 0)    ,    0						)
                         color_img.itemset((y, x, 1)    ,    0						)
                         color_img.itemset((y, x, 2)    ,    255						)
       return color_img, corner_list


if __name__ == "__main__":
   lowerCamelCase__			:       Optional[int]         =							HarrisCorner(0.04, 3)
   lowerCamelCase__    ,							lowerCamelCase__			:       str         =							edge_detect.detect('path_to_image')
   cva.imwrite('detect.png', color_img)