
def     __lowerCAmelCase			(			a__						,    a__ = False  )       ->  bool:
				if n == 2:
								return True
				if not n % 2 or n < 2:
								return False
				if n > 5 and n % 10 not in (1, 3, 7, 9):  # can quickly check last digit
								return False
				if n > 3_3170_4406_4679_8873_8596_1981 and not allow_probable:
								raise ValueError(
								    '''Warning: upper bound of deterministic test is exceeded. '''
								    '''Pass allow_probable=True to allow probabilistic test. '''
								    '''A return value of True indicates a probable prime.'''  )
				# array bounds provided by analysis
				__a										=    [
				    2047,
				    137_3653,
				    2532_6001,
				    32_1503_1751,
				    2_1523_0289_8747,
				    3_4747_4966_0383,
				    341_5500_7172_8321,
				    1,
				    382_5123_0565_4641_3051,
				    1,
				    1,
				    3186_6585_7834_0311_5116_7461,
				    3_3170_4406_4679_8873_8596_1981,
				]

				__a										=    [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41]
				for idx, _p in enumerate(a__						,    1  ):
								if n < _p:
												# then we have our last prime to check
												__a										=    primes[:idx]
												break
				__a							,     __a										=    n - 1, 0
				# break up n -1 into a power of 2 (s) and
				# remaining odd component
				# essentially, solve for d * 2 ** s == n - 1
				while d % 2 == 0:
								d //= 2
								s += 1
				for prime in plist:
								__a										=    False
								for r in range(a__  ):
												__a										=    pow(a__						,    d * 2**r						,    a__  )
												# see article for analysis explanation for m
												if (r == 0 and m == 1) or ((m + 1) % n == 0):
																__a										=    True
																# this loop will not determine compositeness
																break
								if pr:
												continue
								# if pr is False, then the above loop never evaluated to true,
								# and the n MUST be composite
								return False
				return True


def     __lowerCAmelCase			(			)       ->  None:
				assert not miller_rabin(561  )
				assert miller_rabin(563  )
				# 2047

				assert not miller_rabin(83_8201  )
				assert miller_rabin(83_8207  )
				# 1_373_653

				assert not miller_rabin(1731_6001  )
				assert miller_rabin(1731_6017  )
				# 25_326_001

				assert not miller_rabin(30_7838_6641  )
				assert miller_rabin(30_7838_6653  )
				# 3_215_031_751

				assert not miller_rabin(1_7130_4557_4801  )
				assert miller_rabin(1_7130_4557_4819  )
				# 2_152_302_898_747

				assert not miller_rabin(2_7797_9972_8307  )
				assert miller_rabin(2_7797_9972_8327  )
				# 3_474_749_660_383

				assert not miller_rabin(113_8500_2390_9441  )
				assert miller_rabin(113_8500_2390_9527  )
				# 341_550_071_728_321

				assert not miller_rabin(127_5041_0188_4880_4351  )
				assert miller_rabin(127_5041_0188_4880_4391  )
				# 3_825_123_056_546_413_051

				assert not miller_rabin(796_6646_4458_5077_8779_1867  )
				assert miller_rabin(796_6646_4458_5077_8779_1951  )
				# 318_665_857_834_031_151_167_461

				assert not miller_rabin(5528_4067_7446_6478_9766_0333  )
				assert miller_rabin(5528_4067_7446_6478_9766_0359  )
				# 3_317_044_064_679_887_385_961_981
				# upper limit for probabilistic test


if __name__ == "__main__":
					test_miller_rabin()

from __future__ import annotations

import time
from collections.abc import Sequence
from random import randint

from matplotlib import pyplot as plt


def     __lowerCAmelCase			(			a__						,    a__						,    a__  )       ->  tuple[int | None, int | None, float]:
				if not arr:
								return None, None, 0
				if low == high:
								return low, high, arr[low]

				__a										=    (low + high) // 2
				__a							,     __a							,     __a										=    max_subarray(a__						,    a__						,    a__  )
				__a							,     __a							,     __a										=    max_subarray(a__						,    mid + 1						,    a__  )
				__a							,     __a							,     __a										=    max_cross_sum(a__						,    a__						,    a__						,    a__  )
				if left_sum >= right_sum and left_sum >= cross_sum:
								return left_low, left_high, left_sum
				elif right_sum >= left_sum and right_sum >= cross_sum:
								return right_low, right_high, right_sum
				return cross_left, cross_right, cross_sum


def     __lowerCAmelCase			(			a__						,    a__						,    a__						,    a__  )       ->  tuple[int, int, float]:
				__a							,     __a										=    float('''-inf'''  ), -1
				__a							,     __a										=    float('''-inf'''  ), -1

				__a										=    0
				for i in range(a__						,    low - 1						,    -1  ):
								summ += arr[i]
								if summ > left_sum:
												__a										=    summ
												__a										=    i

				__a										=    0
				for i in range(mid + 1						,    high + 1  ):
								summ += arr[i]
								if summ > right_sum:
												__a										=    summ
												__a										=    i

				return max_left, max_right, (left_sum + right_sum)


def     __lowerCAmelCase			(			a__  )       ->  float:
				__a										=    [randint(1						,    a__  ) for _ in range(a__  )]
				__a										=    time.time()
				max_subarray(a__						,    0						,    input_size - 1  )
				__a										=    time.time()
				return end - start


def     __lowerCAmelCase			(			)       ->  None:
				__a										=    [10, 100, 1000, 1_0000, 5_0000, 10_0000, 20_0000, 30_0000, 40_0000, 50_0000]
				__a										=    [time_max_subarray(a__  ) for input_size in input_sizes]
				print('''No of Inputs\t\tTime Taken'''  )
				for input_size, runtime in zip(a__						,    a__  ):
								print(a__						,    '''\t\t'''						,    a__  )
				plt.plot(a__						,    a__  )
				plt.xlabel('''Number of Inputs'''  )
				plt.ylabel('''Time taken in seconds'''  )
				plt.show()


if __name__ == "__main__":
					from doctest import testmod

					testmod()