Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions DIRECTORY.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* [Newton Forward Interpolation](arithmetic_analysis/newton_forward_interpolation.py)
* [Newton Method](arithmetic_analysis/newton_method.py)
* [Newton Raphson](arithmetic_analysis/newton_raphson.py)
* [Newton Raphson New](arithmetic_analysis/newton_raphson_new.py)
* [Secant Method](arithmetic_analysis/secant_method.py)

## Audio Filters
Expand DownExpand Up@@ -107,6 +108,7 @@
* [Lempel Ziv](compression/lempel_ziv.py)
* [Lempel Ziv Decompress](compression/lempel_ziv_decompress.py)
* [Peak Signal To Noise Ratio](compression/peak_signal_to_noise_ratio.py)
* [Run Length Encoding](compression/run_length_encoding.py)

## Computer Vision
* [Cnn Classification](computer_vision/cnn_classification.py)
Expand DownExpand Up@@ -474,6 +476,7 @@
* [Binomial Distribution](maths/binomial_distribution.py)
* [Bisection](maths/bisection.py)
* [Ceil](maths/ceil.py)
* [Chakravala](maths/chakravala.py)
* [Check Polygon](maths/check_polygon.py)
* [Chudnovsky Algorithm](maths/chudnovsky_algorithm.py)
* [Collatz Sequence](maths/collatz_sequence.py)
Expand DownExpand Up@@ -621,6 +624,7 @@
* [Linear Congruential Generator](other/linear_congruential_generator.py)
* [Lru Cache](other/lru_cache.py)
* [Magicdiamondpattern](other/magicdiamondpattern.py)
* [Maximum Subarray](other/maximum_subarray.py)
* [Nested Brackets](other/nested_brackets.py)
* [Password Generator](other/password_generator.py)
* [Scoring Algorithm](other/scoring_algorithm.py)
Expand DownExpand Up@@ -1053,6 +1057,7 @@
* [Fetch Bbc News](web_programming/fetch_bbc_news.py)
* [Fetch Github Info](web_programming/fetch_github_info.py)
* [Fetch Jobs](web_programming/fetch_jobs.py)
* [Fetch Quotes](web_programming/fetch_quotes.py)
* [Fetch Well Rx Price](web_programming/fetch_well_rx_price.py)
* [Get Imdb Top 250 Movies Csv](web_programming/get_imdb_top_250_movies_csv.py)
* [Get Imdbtop](web_programming/get_imdbtop.py)
Expand Down
120 changes: 120 additions & 0 deletions maths/chakravala.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
"""
Implementing Chakravala method using python

https://en.wikipedia.org/wiki/Chakravala_method
https://kappadath-gopal.blogspot.com/2013/04/ancient-medieval-indian-mathematics.html

The chakravala method is a cyclic algorithm to solve indeterminate quadratic equations,
including Pell's equation.

"""

import math


def is_perfect_square(num: int) -> bool:
"""
Check if a number is perfect square number or not
:param num: the number to be checked
:return: True if number is square number, otherwise False

>>> is_perfect_square(9)
True
>>> is_perfect_square(16)
True
>>> is_perfect_square(1)
True
>>> is_perfect_square(0)
True
>>> is_perfect_square(10)
False
"""

sr = int(math.sqrt(num))
return sr * sr == num


def chakravala_method(num: int) -> (tuple[int, int] | tuple):
"""
This method takes in the value of N in the equation

x^2 = N*y^2 + 1
:param num: the number N equals to
:return: empty tuple if N is perfect square else tuple(x,y)

>>> chakravala_method(1)
()
>>> chakravala_method(2)
(3, 2)
>>> chakravala_method(4)
()
>>> chakravala_method(5)
(9, 4)
>>> chakravala_method(7)
(8, 3)

"""

if is_perfect_square(num):
return ()

# Takes b = 1 and finds a and k accordingly, refer to algorithm link
# variable naming is used as same as algorithm, (a,b,k,m) except N = num

b = 1

min_diff = num
a = 0
while True:
diff = abs(num - (a + 1) ** 2)
if min_diff > diff:
min_diff = diff
a += 1
continue
break

k = a**2 - num

while True:

kabs = abs(k)

if k == 1:
return (a, b)

if k == -1 or kabs == 2 or (kabs == 4 and (a % 2 == 0 or b % 2 == 0)):
return (abs((a**2 + num * b**2) // k), abs(2 * a * b // k))

min_diff = num
n = 1 # loop variable
n2 = n # stores the correct value of n
while True:
if kabs * n <= a:
n += 1
continue
if (kabs * n - a) % b == 0:
m = (kabs * n - a) // b
else:
n += 1
continue

diff = abs(m**2 - num)
if min_diff > diff:
min_diff = diff
n2 = n
n += 1
continue
break
m = (kabs * n2 - a) // b

a, b = abs((a * m + num * b) // k), abs((a + b * m) // k)
k = (m**2 - num) // k


if __name__ == "__main__":

import doctest

doctest.testmod()

print("X and Y for the equation X^2 - 13Y^2 = 1 is: ", chakravala_method(13))
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions DIRECTORY.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* [Newton Forward Interpolation](arithmetic_analysis/newton_forward_interpolation.py)
* [Newton Method](arithmetic_analysis/newton_method.py)
* [Newton Raphson](arithmetic_analysis/newton_raphson.py)
* [Newton Raphson New](arithmetic_analysis/newton_raphson_new.py)
* [Secant Method](arithmetic_analysis/secant_method.py)

## Audio Filters
Expand DownExpand Up@@ -107,6 +108,7 @@
* [Lempel Ziv](compression/lempel_ziv.py)
* [Lempel Ziv Decompress](compression/lempel_ziv_decompress.py)
* [Peak Signal To Noise Ratio](compression/peak_signal_to_noise_ratio.py)
* [Run Length Encoding](compression/run_length_encoding.py)

## Computer Vision
* [Cnn Classification](computer_vision/cnn_classification.py)
Expand DownExpand Up@@ -474,6 +476,7 @@
* [Binomial Distribution](maths/binomial_distribution.py)
* [Bisection](maths/bisection.py)
* [Ceil](maths/ceil.py)
* [Chakravala](maths/chakravala.py)
* [Check Polygon](maths/check_polygon.py)
* [Chudnovsky Algorithm](maths/chudnovsky_algorithm.py)
* [Collatz Sequence](maths/collatz_sequence.py)
Expand DownExpand Up@@ -621,6 +624,7 @@
* [Linear Congruential Generator](other/linear_congruential_generator.py)
* [Lru Cache](other/lru_cache.py)
* [Magicdiamondpattern](other/magicdiamondpattern.py)
* [Maximum Subarray](other/maximum_subarray.py)
* [Nested Brackets](other/nested_brackets.py)
* [Password Generator](other/password_generator.py)
* [Scoring Algorithm](other/scoring_algorithm.py)
Expand DownExpand Up@@ -1053,6 +1057,7 @@
* [Fetch Bbc News](web_programming/fetch_bbc_news.py)
* [Fetch Github Info](web_programming/fetch_github_info.py)
* [Fetch Jobs](web_programming/fetch_jobs.py)
* [Fetch Quotes](web_programming/fetch_quotes.py)
* [Fetch Well Rx Price](web_programming/fetch_well_rx_price.py)
* [Get Imdb Top 250 Movies Csv](web_programming/get_imdb_top_250_movies_csv.py)
* [Get Imdbtop](web_programming/get_imdbtop.py)
Expand Down
120 changes: 120 additions & 0 deletions maths/chakravala.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
"""
Implementing Chakravala method using python

https://en.wikipedia.org/wiki/Chakravala_method
https://kappadath-gopal.blogspot.com/2013/04/ancient-medieval-indian-mathematics.html

The chakravala method is a cyclic algorithm to solve indeterminate quadratic equations,
including Pell's equation.

"""

import math


def is_perfect_square(num: int) -> bool:
"""
Check if a number is perfect square number or not
:param num: the number to be checked
:return: True if number is square number, otherwise False

>>> is_perfect_square(9)
True
>>> is_perfect_square(16)
True
>>> is_perfect_square(1)
True
>>> is_perfect_square(0)
True
>>> is_perfect_square(10)
False
"""

sr = int(math.sqrt(num))
return sr * sr == num


def chakravala_method(num: int) -> (tuple[int, int] | tuple):
"""
This method takes in the value of N in the equation

x^2 = N*y^2 + 1
:param num: the number N equals to
:return: empty tuple if N is perfect square else tuple(x,y)

>>> chakravala_method(1)
()
>>> chakravala_method(2)
(3, 2)
>>> chakravala_method(4)
()
>>> chakravala_method(5)
(9, 4)
>>> chakravala_method(7)
(8, 3)

"""

if is_perfect_square(num):
return ()

# Takes b = 1 and finds a and k accordingly, refer to algorithm link
# variable naming is used as same as algorithm, (a,b,k,m) except N = num

b = 1

min_diff = num
a = 0
while True:
diff = abs(num - (a + 1) ** 2)
if min_diff > diff:
min_diff = diff
a += 1
continue
break

k = a**2 - num

while True:

kabs = abs(k)

if k == 1:
return (a, b)

if k == -1 or kabs == 2 or (kabs == 4 and (a % 2 == 0 or b % 2 == 0)):
return (abs((a**2 + num * b**2) // k), abs(2 * a * b // k))

min_diff = num
n = 1 # loop variable
n2 = n # stores the correct value of n
while True:
if kabs * n <= a:
n += 1
continue
if (kabs * n - a) % b == 0:
m = (kabs * n - a) // b
else:
n += 1
continue

diff = abs(m**2 - num)
if min_diff > diff:
min_diff = diff
n2 = n
n += 1
continue
break
m = (kabs * n2 - a) // b

a, b = abs((a * m + num * b) // k), abs((a + b * m) // k)
k = (m**2 - num) // k


if __name__ == "__main__":

import doctest

doctest.testmod()

print("X and Y for the equation X^2 - 13Y^2 = 1 is: ", chakravala_method(13))
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions DIRECTORY.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* [Newton Forward Interpolation](arithmetic_analysis/newton_forward_interpolation.py)
* [Newton Method](arithmetic_analysis/newton_method.py)
* [Newton Raphson](arithmetic_analysis/newton_raphson.py)
* [Newton Raphson New](arithmetic_analysis/newton_raphson_new.py)
* [Secant Method](arithmetic_analysis/secant_method.py)

## Audio Filters
Expand DownExpand Up@@ -107,6 +108,7 @@
* [Lempel Ziv](compression/lempel_ziv.py)
* [Lempel Ziv Decompress](compression/lempel_ziv_decompress.py)
* [Peak Signal To Noise Ratio](compression/peak_signal_to_noise_ratio.py)
* [Run Length Encoding](compression/run_length_encoding.py)

## Computer Vision
* [Cnn Classification](computer_vision/cnn_classification.py)
Expand DownExpand Up@@ -474,6 +476,7 @@
* [Binomial Distribution](maths/binomial_distribution.py)
* [Bisection](maths/bisection.py)
* [Ceil](maths/ceil.py)
* [Chakravala](maths/chakravala.py)
* [Check Polygon](maths/check_polygon.py)
* [Chudnovsky Algorithm](maths/chudnovsky_algorithm.py)
* [Collatz Sequence](maths/collatz_sequence.py)
Expand DownExpand Up@@ -621,6 +624,7 @@
* [Linear Congruential Generator](other/linear_congruential_generator.py)
* [Lru Cache](other/lru_cache.py)
* [Magicdiamondpattern](other/magicdiamondpattern.py)
* [Maximum Subarray](other/maximum_subarray.py)
* [Nested Brackets](other/nested_brackets.py)
* [Password Generator](other/password_generator.py)
* [Scoring Algorithm](other/scoring_algorithm.py)
Expand DownExpand Up@@ -1053,6 +1057,7 @@
* [Fetch Bbc News](web_programming/fetch_bbc_news.py)
* [Fetch Github Info](web_programming/fetch_github_info.py)
* [Fetch Jobs](web_programming/fetch_jobs.py)
* [Fetch Quotes](web_programming/fetch_quotes.py)
* [Fetch Well Rx Price](web_programming/fetch_well_rx_price.py)
* [Get Imdb Top 250 Movies Csv](web_programming/get_imdb_top_250_movies_csv.py)
* [Get Imdbtop](web_programming/get_imdbtop.py)
Expand Down
120 changes: 120 additions & 0 deletions maths/chakravala.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
"""
Implementing Chakravala method using python

https://en.wikipedia.org/wiki/Chakravala_method
https://kappadath-gopal.blogspot.com/2013/04/ancient-medieval-indian-mathematics.html

The chakravala method is a cyclic algorithm to solve indeterminate quadratic equations,
including Pell's equation.

"""

import math


def is_perfect_square(num: int) -> bool:
"""
Check if a number is perfect square number or not
:param num: the number to be checked
:return: True if number is square number, otherwise False

>>> is_perfect_square(9)
True
>>> is_perfect_square(16)
True
>>> is_perfect_square(1)
True
>>> is_perfect_square(0)
True
>>> is_perfect_square(10)
False
"""

sr = int(math.sqrt(num))
return sr * sr == num


def chakravala_method(num: int) -> (tuple[int, int] | tuple):
"""
This method takes in the value of N in the equation

x^2 = N*y^2 + 1
:param num: the number N equals to
:return: empty tuple if N is perfect square else tuple(x,y)

>>> chakravala_method(1)
()
>>> chakravala_method(2)
(3, 2)
>>> chakravala_method(4)
()
>>> chakravala_method(5)
(9, 4)
>>> chakravala_method(7)
(8, 3)

"""

if is_perfect_square(num):
return ()

# Takes b = 1 and finds a and k accordingly, refer to algorithm link
# variable naming is used as same as algorithm, (a,b,k,m) except N = num

b = 1

min_diff = num
a = 0
while True:
diff = abs(num - (a + 1) ** 2)
if min_diff > diff:
min_diff = diff
a += 1
continue
break

k = a**2 - num

while True:

kabs = abs(k)

if k == 1:
return (a, b)

if k == -1 or kabs == 2 or (kabs == 4 and (a % 2 == 0 or b % 2 == 0)):
return (abs((a**2 + num * b**2) // k), abs(2 * a * b // k))

min_diff = num
n = 1 # loop variable
n2 = n # stores the correct value of n
while True:
if kabs * n <= a:
n += 1
continue
if (kabs * n - a) % b == 0:
m = (kabs * n - a) // b
else:
n += 1
continue

diff = abs(m**2 - num)
if min_diff > diff:
min_diff = diff
n2 = n
n += 1
continue
break
m = (kabs * n2 - a) // b

a, b = abs((a * m + num * b) // k), abs((a + b * m) // k)
k = (m**2 - num) // k


if __name__ == "__main__":

import doctest

doctest.testmod()

print("X and Y for the equation X^2 - 13Y^2 = 1 is: ", chakravala_method(13))
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions DIRECTORY.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* [Newton Forward Interpolation](arithmetic_analysis/newton_forward_interpolation.py)
* [Newton Method](arithmetic_analysis/newton_method.py)
* [Newton Raphson](arithmetic_analysis/newton_raphson.py)
* [Newton Raphson New](arithmetic_analysis/newton_raphson_new.py)
* [Secant Method](arithmetic_analysis/secant_method.py)

## Audio Filters
Expand DownExpand Up@@ -107,6 +108,7 @@
* [Lempel Ziv](compression/lempel_ziv.py)
* [Lempel Ziv Decompress](compression/lempel_ziv_decompress.py)
* [Peak Signal To Noise Ratio](compression/peak_signal_to_noise_ratio.py)
* [Run Length Encoding](compression/run_length_encoding.py)

## Computer Vision
* [Cnn Classification](computer_vision/cnn_classification.py)
Expand DownExpand Up@@ -474,6 +476,7 @@
* [Binomial Distribution](maths/binomial_distribution.py)
* [Bisection](maths/bisection.py)
* [Ceil](maths/ceil.py)
* [Chakravala](maths/chakravala.py)
* [Check Polygon](maths/check_polygon.py)
* [Chudnovsky Algorithm](maths/chudnovsky_algorithm.py)
* [Collatz Sequence](maths/collatz_sequence.py)
Expand DownExpand Up@@ -621,6 +624,7 @@
* [Linear Congruential Generator](other/linear_congruential_generator.py)
* [Lru Cache](other/lru_cache.py)
* [Magicdiamondpattern](other/magicdiamondpattern.py)
* [Maximum Subarray](other/maximum_subarray.py)
* [Nested Brackets](other/nested_brackets.py)
* [Password Generator](other/password_generator.py)
* [Scoring Algorithm](other/scoring_algorithm.py)
Expand DownExpand Up@@ -1053,6 +1057,7 @@
* [Fetch Bbc News](web_programming/fetch_bbc_news.py)
* [Fetch Github Info](web_programming/fetch_github_info.py)
* [Fetch Jobs](web_programming/fetch_jobs.py)
* [Fetch Quotes](web_programming/fetch_quotes.py)
* [Fetch Well Rx Price](web_programming/fetch_well_rx_price.py)
* [Get Imdb Top 250 Movies Csv](web_programming/get_imdb_top_250_movies_csv.py)
* [Get Imdbtop](web_programming/get_imdbtop.py)
Expand Down
120 changes: 120 additions & 0 deletions maths/chakravala.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
"""
Implementing Chakravala method using python

https://en.wikipedia.org/wiki/Chakravala_method
https://kappadath-gopal.blogspot.com/2013/04/ancient-medieval-indian-mathematics.html

The chakravala method is a cyclic algorithm to solve indeterminate quadratic equations,
including Pell's equation.

"""

import math


def is_perfect_square(num: int) -> bool:
"""
Check if a number is perfect square number or not
:param num: the number to be checked
:return: True if number is square number, otherwise False

>>> is_perfect_square(9)
True
>>> is_perfect_square(16)
True
>>> is_perfect_square(1)
True
>>> is_perfect_square(0)
True
>>> is_perfect_square(10)
False
"""

sr = int(math.sqrt(num))
return sr * sr == num


def chakravala_method(num: int) -> (tuple[int, int] | tuple):
"""
This method takes in the value of N in the equation

x^2 = N*y^2 + 1
:param num: the number N equals to
:return: empty tuple if N is perfect square else tuple(x,y)

>>> chakravala_method(1)
()
>>> chakravala_method(2)
(3, 2)
>>> chakravala_method(4)
()
>>> chakravala_method(5)
(9, 4)
>>> chakravala_method(7)
(8, 3)

"""

if is_perfect_square(num):
return ()

# Takes b = 1 and finds a and k accordingly, refer to algorithm link
# variable naming is used as same as algorithm, (a,b,k,m) except N = num

b = 1

min_diff = num
a = 0
while True:
diff = abs(num - (a + 1) ** 2)
if min_diff > diff:
min_diff = diff
a += 1
continue
break

k = a**2 - num

while True:

kabs = abs(k)

if k == 1:
return (a, b)

if k == -1 or kabs == 2 or (kabs == 4 and (a % 2 == 0 or b % 2 == 0)):
return (abs((a**2 + num * b**2) // k), abs(2 * a * b // k))

min_diff = num
n = 1 # loop variable
n2 = n # stores the correct value of n
while True:
if kabs * n <= a:
n += 1
continue
if (kabs * n - a) % b == 0:
m = (kabs * n - a) // b
else:
n += 1
continue

diff = abs(m**2 - num)
if min_diff > diff:
min_diff = diff
n2 = n
n += 1
continue
break
m = (kabs * n2 - a) // b

a, b = abs((a * m + num * b) // k), abs((a + b * m) // k)
k = (m**2 - num) // k


if __name__ == "__main__":

import doctest

doctest.testmod()

print("X and Y for the equation X^2 - 13Y^2 = 1 is: ", chakravala_method(13))
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions DIRECTORY.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* [Newton Forward Interpolation](arithmetic_analysis/newton_forward_interpolation.py)
* [Newton Method](arithmetic_analysis/newton_method.py)
* [Newton Raphson](arithmetic_analysis/newton_raphson.py)
* [Newton Raphson New](arithmetic_analysis/newton_raphson_new.py)
* [Secant Method](arithmetic_analysis/secant_method.py)

## Audio Filters
Expand DownExpand Up@@ -107,6 +108,7 @@
* [Lempel Ziv](compression/lempel_ziv.py)
* [Lempel Ziv Decompress](compression/lempel_ziv_decompress.py)
* [Peak Signal To Noise Ratio](compression/peak_signal_to_noise_ratio.py)
* [Run Length Encoding](compression/run_length_encoding.py)

## Computer Vision
* [Cnn Classification](computer_vision/cnn_classification.py)
Expand DownExpand Up@@ -474,6 +476,7 @@
* [Binomial Distribution](maths/binomial_distribution.py)
* [Bisection](maths/bisection.py)
* [Ceil](maths/ceil.py)
* [Chakravala](maths/chakravala.py)
* [Check Polygon](maths/check_polygon.py)
* [Chudnovsky Algorithm](maths/chudnovsky_algorithm.py)
* [Collatz Sequence](maths/collatz_sequence.py)
Expand DownExpand Up@@ -621,6 +624,7 @@
* [Linear Congruential Generator](other/linear_congruential_generator.py)
* [Lru Cache](other/lru_cache.py)
* [Magicdiamondpattern](other/magicdiamondpattern.py)
* [Maximum Subarray](other/maximum_subarray.py)
* [Nested Brackets](other/nested_brackets.py)
* [Password Generator](other/password_generator.py)
* [Scoring Algorithm](other/scoring_algorithm.py)
Expand DownExpand Up@@ -1053,6 +1057,7 @@
* [Fetch Bbc News](web_programming/fetch_bbc_news.py)
* [Fetch Github Info](web_programming/fetch_github_info.py)
* [Fetch Jobs](web_programming/fetch_jobs.py)
* [Fetch Quotes](web_programming/fetch_quotes.py)
* [Fetch Well Rx Price](web_programming/fetch_well_rx_price.py)
* [Get Imdb Top 250 Movies Csv](web_programming/get_imdb_top_250_movies_csv.py)
* [Get Imdbtop](web_programming/get_imdbtop.py)
Expand Down
120 changes: 120 additions & 0 deletions maths/chakravala.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
"""
Implementing Chakravala method using python

https://en.wikipedia.org/wiki/Chakravala_method
https://kappadath-gopal.blogspot.com/2013/04/ancient-medieval-indian-mathematics.html

The chakravala method is a cyclic algorithm to solve indeterminate quadratic equations,
including Pell's equation.

"""

import math


def is_perfect_square(num: int) -> bool:
"""
Check if a number is perfect square number or not
:param num: the number to be checked
:return: True if number is square number, otherwise False

>>> is_perfect_square(9)
True
>>> is_perfect_square(16)
True
>>> is_perfect_square(1)
True
>>> is_perfect_square(0)
True
>>> is_perfect_square(10)
False
"""

sr = int(math.sqrt(num))
return sr * sr == num


def chakravala_method(num: int) -> (tuple[int, int] | tuple):
"""
This method takes in the value of N in the equation

x^2 = N*y^2 + 1
:param num: the number N equals to
:return: empty tuple if N is perfect square else tuple(x,y)

>>> chakravala_method(1)
()
>>> chakravala_method(2)
(3, 2)
>>> chakravala_method(4)
()
>>> chakravala_method(5)
(9, 4)
>>> chakravala_method(7)
(8, 3)

"""

if is_perfect_square(num):
return ()

# Takes b = 1 and finds a and k accordingly, refer to algorithm link
# variable naming is used as same as algorithm, (a,b,k,m) except N = num

b = 1

min_diff = num
a = 0
while True:
diff = abs(num - (a + 1) ** 2)
if min_diff > diff:
min_diff = diff
a += 1
continue
break

k = a**2 - num

while True:

kabs = abs(k)

if k == 1:
return (a, b)

if k == -1 or kabs == 2 or (kabs == 4 and (a % 2 == 0 or b % 2 == 0)):
return (abs((a**2 + num * b**2) // k), abs(2 * a * b // k))

min_diff = num
n = 1 # loop variable
n2 = n # stores the correct value of n
while True:
if kabs * n <= a:
n += 1
continue
if (kabs * n - a) % b == 0:
m = (kabs * n - a) // b
else:
n += 1
continue

diff = abs(m**2 - num)
if min_diff > diff:
min_diff = diff
n2 = n
n += 1
continue
break
m = (kabs * n2 - a) // b

a, b = abs((a * m + num * b) // k), abs((a + b * m) // k)
k = (m**2 - num) // k


if __name__ == "__main__":

import doctest

doctest.testmod()

print("X and Y for the equation X^2 - 13Y^2 = 1 is: ", chakravala_method(13))
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions DIRECTORY.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* [Newton Forward Interpolation](arithmetic_analysis/newton_forward_interpolation.py)
* [Newton Method](arithmetic_analysis/newton_method.py)
* [Newton Raphson](arithmetic_analysis/newton_raphson.py)
* [Newton Raphson New](arithmetic_analysis/newton_raphson_new.py)
* [Secant Method](arithmetic_analysis/secant_method.py)

## Audio Filters
Expand DownExpand Up@@ -107,6 +108,7 @@
* [Lempel Ziv](compression/lempel_ziv.py)
* [Lempel Ziv Decompress](compression/lempel_ziv_decompress.py)
* [Peak Signal To Noise Ratio](compression/peak_signal_to_noise_ratio.py)
* [Run Length Encoding](compression/run_length_encoding.py)

## Computer Vision
* [Cnn Classification](computer_vision/cnn_classification.py)
Expand DownExpand Up@@ -474,6 +476,7 @@
* [Binomial Distribution](maths/binomial_distribution.py)
* [Bisection](maths/bisection.py)
* [Ceil](maths/ceil.py)
* [Chakravala](maths/chakravala.py)
* [Check Polygon](maths/check_polygon.py)
* [Chudnovsky Algorithm](maths/chudnovsky_algorithm.py)
* [Collatz Sequence](maths/collatz_sequence.py)
Expand DownExpand Up@@ -621,6 +624,7 @@
* [Linear Congruential Generator](other/linear_congruential_generator.py)
* [Lru Cache](other/lru_cache.py)
* [Magicdiamondpattern](other/magicdiamondpattern.py)
* [Maximum Subarray](other/maximum_subarray.py)
* [Nested Brackets](other/nested_brackets.py)
* [Password Generator](other/password_generator.py)
* [Scoring Algorithm](other/scoring_algorithm.py)
Expand DownExpand Up@@ -1053,6 +1057,7 @@
* [Fetch Bbc News](web_programming/fetch_bbc_news.py)
* [Fetch Github Info](web_programming/fetch_github_info.py)
* [Fetch Jobs](web_programming/fetch_jobs.py)
* [Fetch Quotes](web_programming/fetch_quotes.py)
* [Fetch Well Rx Price](web_programming/fetch_well_rx_price.py)
* [Get Imdb Top 250 Movies Csv](web_programming/get_imdb_top_250_movies_csv.py)
* [Get Imdbtop](web_programming/get_imdbtop.py)
Expand Down
120 changes: 120 additions & 0 deletions maths/chakravala.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
"""
Implementing Chakravala method using python

https://en.wikipedia.org/wiki/Chakravala_method
https://kappadath-gopal.blogspot.com/2013/04/ancient-medieval-indian-mathematics.html

The chakravala method is a cyclic algorithm to solve indeterminate quadratic equations,
including Pell's equation.

"""

import math


def is_perfect_square(num: int) -> bool:
"""
Check if a number is perfect square number or not
:param num: the number to be checked
:return: True if number is square number, otherwise False

>>> is_perfect_square(9)
True
>>> is_perfect_square(16)
True
>>> is_perfect_square(1)
True
>>> is_perfect_square(0)
True
>>> is_perfect_square(10)
False
"""

sr = int(math.sqrt(num))
return sr * sr == num


def chakravala_method(num: int) -> (tuple[int, int] | tuple):
"""
This method takes in the value of N in the equation

x^2 = N*y^2 + 1
:param num: the number N equals to
:return: empty tuple if N is perfect square else tuple(x,y)

>>> chakravala_method(1)
()
>>> chakravala_method(2)
(3, 2)
>>> chakravala_method(4)
()
>>> chakravala_method(5)
(9, 4)
>>> chakravala_method(7)
(8, 3)

"""

if is_perfect_square(num):
return ()

# Takes b = 1 and finds a and k accordingly, refer to algorithm link
# variable naming is used as same as algorithm, (a,b,k,m) except N = num

b = 1

min_diff = num
a = 0
while True:
diff = abs(num - (a + 1) ** 2)
if min_diff > diff:
min_diff = diff
a += 1
continue
break

k = a**2 - num

while True:

kabs = abs(k)

if k == 1:
return (a, b)

if k == -1 or kabs == 2 or (kabs == 4 and (a % 2 == 0 or b % 2 == 0)):
return (abs((a**2 + num * b**2) // k), abs(2 * a * b // k))

min_diff = num
n = 1 # loop variable
n2 = n # stores the correct value of n
while True:
if kabs * n <= a:
n += 1
continue
if (kabs * n - a) % b == 0:
m = (kabs * n - a) // b
else:
n += 1
continue

diff = abs(m**2 - num)
if min_diff > diff:
min_diff = diff
n2 = n
n += 1
continue
break
m = (kabs * n2 - a) // b

a, b = abs((a * m + num * b) // k), abs((a + b * m) // k)
k = (m**2 - num) // k


if __name__ == "__main__":

import doctest

doctest.testmod()

print("X and Y for the equation X^2 - 13Y^2 = 1 is: ", chakravala_method(13))
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions DIRECTORY.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* [Newton Forward Interpolation](arithmetic_analysis/newton_forward_interpolation.py)
* [Newton Method](arithmetic_analysis/newton_method.py)
* [Newton Raphson](arithmetic_analysis/newton_raphson.py)
* [Newton Raphson New](arithmetic_analysis/newton_raphson_new.py)
* [Secant Method](arithmetic_analysis/secant_method.py)

## Audio Filters
Expand DownExpand Up@@ -107,6 +108,7 @@
* [Lempel Ziv](compression/lempel_ziv.py)
* [Lempel Ziv Decompress](compression/lempel_ziv_decompress.py)
* [Peak Signal To Noise Ratio](compression/peak_signal_to_noise_ratio.py)
* [Run Length Encoding](compression/run_length_encoding.py)

## Computer Vision
* [Cnn Classification](computer_vision/cnn_classification.py)
Expand DownExpand Up@@ -474,6 +476,7 @@
* [Binomial Distribution](maths/binomial_distribution.py)
* [Bisection](maths/bisection.py)
* [Ceil](maths/ceil.py)
* [Chakravala](maths/chakravala.py)
* [Check Polygon](maths/check_polygon.py)
* [Chudnovsky Algorithm](maths/chudnovsky_algorithm.py)
* [Collatz Sequence](maths/collatz_sequence.py)
Expand DownExpand Up@@ -621,6 +624,7 @@
* [Linear Congruential Generator](other/linear_congruential_generator.py)
* [Lru Cache](other/lru_cache.py)
* [Magicdiamondpattern](other/magicdiamondpattern.py)
* [Maximum Subarray](other/maximum_subarray.py)
* [Nested Brackets](other/nested_brackets.py)
* [Password Generator](other/password_generator.py)
* [Scoring Algorithm](other/scoring_algorithm.py)
Expand DownExpand Up@@ -1053,6 +1057,7 @@
* [Fetch Bbc News](web_programming/fetch_bbc_news.py)
* [Fetch Github Info](web_programming/fetch_github_info.py)
* [Fetch Jobs](web_programming/fetch_jobs.py)
* [Fetch Quotes](web_programming/fetch_quotes.py)
* [Fetch Well Rx Price](web_programming/fetch_well_rx_price.py)
* [Get Imdb Top 250 Movies Csv](web_programming/get_imdb_top_250_movies_csv.py)
* [Get Imdbtop](web_programming/get_imdbtop.py)
Expand Down
120 changes: 120 additions & 0 deletions maths/chakravala.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
"""
Implementing Chakravala method using python

https://en.wikipedia.org/wiki/Chakravala_method
https://kappadath-gopal.blogspot.com/2013/04/ancient-medieval-indian-mathematics.html

The chakravala method is a cyclic algorithm to solve indeterminate quadratic equations,
including Pell's equation.

"""

import math


def is_perfect_square(num: int) -> bool:
"""
Check if a number is perfect square number or not
:param num: the number to be checked
:return: True if number is square number, otherwise False

>>> is_perfect_square(9)
True
>>> is_perfect_square(16)
True
>>> is_perfect_square(1)
True
>>> is_perfect_square(0)
True
>>> is_perfect_square(10)
False
"""

sr = int(math.sqrt(num))
return sr * sr == num


def chakravala_method(num: int) -> (tuple[int, int] | tuple):
"""
This method takes in the value of N in the equation

x^2 = N*y^2 + 1
:param num: the number N equals to
:return: empty tuple if N is perfect square else tuple(x,y)

>>> chakravala_method(1)
()
>>> chakravala_method(2)
(3, 2)
>>> chakravala_method(4)
()
>>> chakravala_method(5)
(9, 4)
>>> chakravala_method(7)
(8, 3)

"""

if is_perfect_square(num):
return ()

# Takes b = 1 and finds a and k accordingly, refer to algorithm link
# variable naming is used as same as algorithm, (a,b,k,m) except N = num

b = 1

min_diff = num
a = 0
while True:
diff = abs(num - (a + 1) ** 2)
if min_diff > diff:
min_diff = diff
a += 1
continue
break

k = a**2 - num

while True:

kabs = abs(k)

if k == 1:
return (a, b)

if k == -1 or kabs == 2 or (kabs == 4 and (a % 2 == 0 or b % 2 == 0)):
return (abs((a**2 + num * b**2) // k), abs(2 * a * b // k))

min_diff = num
n = 1 # loop variable
n2 = n # stores the correct value of n
while True:
if kabs * n <= a:
n += 1
continue
if (kabs * n - a) % b == 0:
m = (kabs * n - a) // b
else:
n += 1
continue

diff = abs(m**2 - num)
if min_diff > diff:
min_diff = diff
n2 = n
n += 1
continue
break
m = (kabs * n2 - a) // b

a, b = abs((a * m + num * b) // k), abs((a + b * m) // k)
k = (m**2 - num) // k


if __name__ == "__main__":

import doctest

doctest.testmod()

print("X and Y for the equation X^2 - 13Y^2 = 1 is: ", chakravala_method(13))
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions DIRECTORY.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,6 +9,7 @@
* [Newton Forward Interpolation](arithmetic_analysis/newton_forward_interpolation.py)
* [Newton Method](arithmetic_analysis/newton_method.py)
* [Newton Raphson](arithmetic_analysis/newton_raphson.py)
* [Newton Raphson New](arithmetic_analysis/newton_raphson_new.py)
* [Secant Method](arithmetic_analysis/secant_method.py)

## Audio Filters
Expand DownExpand Up@@ -107,6 +108,7 @@
* [Lempel Ziv](compression/lempel_ziv.py)
* [Lempel Ziv Decompress](compression/lempel_ziv_decompress.py)
* [Peak Signal To Noise Ratio](compression/peak_signal_to_noise_ratio.py)
* [Run Length Encoding](compression/run_length_encoding.py)

## Computer Vision
* [Cnn Classification](computer_vision/cnn_classification.py)
Expand DownExpand Up@@ -474,6 +476,7 @@
* [Binomial Distribution](maths/binomial_distribution.py)
* [Bisection](maths/bisection.py)
* [Ceil](maths/ceil.py)
* [Chakravala](maths/chakravala.py)
* [Check Polygon](maths/check_polygon.py)
* [Chudnovsky Algorithm](maths/chudnovsky_algorithm.py)
* [Collatz Sequence](maths/collatz_sequence.py)
Expand DownExpand Up@@ -621,6 +624,7 @@
* [Linear Congruential Generator](other/linear_congruential_generator.py)
* [Lru Cache](other/lru_cache.py)
* [Magicdiamondpattern](other/magicdiamondpattern.py)
* [Maximum Subarray](other/maximum_subarray.py)
* [Nested Brackets](other/nested_brackets.py)
* [Password Generator](other/password_generator.py)
* [Scoring Algorithm](other/scoring_algorithm.py)
Expand DownExpand Up@@ -1053,6 +1057,7 @@
* [Fetch Bbc News](web_programming/fetch_bbc_news.py)
* [Fetch Github Info](web_programming/fetch_github_info.py)
* [Fetch Jobs](web_programming/fetch_jobs.py)
* [Fetch Quotes](web_programming/fetch_quotes.py)
* [Fetch Well Rx Price](web_programming/fetch_well_rx_price.py)
* [Get Imdb Top 250 Movies Csv](web_programming/get_imdb_top_250_movies_csv.py)
* [Get Imdbtop](web_programming/get_imdbtop.py)
Expand Down
120 changes: 120 additions & 0 deletions maths/chakravala.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
"""
Implementing Chakravala method using python

https://en.wikipedia.org/wiki/Chakravala_method
https://kappadath-gopal.blogspot.com/2013/04/ancient-medieval-indian-mathematics.html

The chakravala method is a cyclic algorithm to solve indeterminate quadratic equations,
including Pell's equation.

"""

import math


def is_perfect_square(num: int) -> bool:
"""
Check if a number is perfect square number or not
:param num: the number to be checked
:return: True if number is square number, otherwise False

>>> is_perfect_square(9)
True
>>> is_perfect_square(16)
True
>>> is_perfect_square(1)
True
>>> is_perfect_square(0)
True
>>> is_perfect_square(10)
False
"""

sr = int(math.sqrt(num))
return sr * sr == num


def chakravala_method(num: int) -> (tuple[int, int] | tuple):
"""
This method takes in the value of N in the equation

x^2 = N*y^2 + 1
:param num: the number N equals to
:return: empty tuple if N is perfect square else tuple(x,y)

>>> chakravala_method(1)
()
>>> chakravala_method(2)
(3, 2)
>>> chakravala_method(4)
()
>>> chakravala_method(5)
(9, 4)
>>> chakravala_method(7)
(8, 3)

"""

if is_perfect_square(num):
return ()

# Takes b = 1 and finds a and k accordingly, refer to algorithm link
# variable naming is used as same as algorithm, (a,b,k,m) except N = num

b = 1

min_diff = num
a = 0
while True:
diff = abs(num - (a + 1) ** 2)
if min_diff > diff:
min_diff = diff
a += 1
continue
break

k = a**2 - num

while True:

kabs = abs(k)

if k == 1:
return (a, b)

if k == -1 or kabs == 2 or (kabs == 4 and (a % 2 == 0 or b % 2 == 0)):
return (abs((a**2 + num * b**2) // k), abs(2 * a * b // k))

min_diff = num
n = 1 # loop variable
n2 = n # stores the correct value of n
while True:
if kabs * n <= a:
n += 1
continue
if (kabs * n - a) % b == 0:
m = (kabs * n - a) // b
else:
n += 1
continue

diff = abs(m**2 - num)
if min_diff > diff:
min_diff = diff
n2 = n
n += 1
continue
break
m = (kabs * n2 - a) // b

a, b = abs((a * m + num * b) // k), abs((a + b * m) // k)
k = (m**2 - num) // k


if __name__ == "__main__":

import doctest

doctest.testmod()

print("X and Y for the equation X^2 - 13Y^2 = 1 is: ", chakravala_method(13))