streamlit-delta-PUU-calculator/pages/teorem.py

68 lines
2.5 KiB
Python
Raw Normal View History

import streamlit as st
st.set_page_config(page_title="Evklidov algoritem", page_icon="🧮")
st.title("🧮 Evklidov algoritem za izračun NSD")
st.markdown("""
### Kaj je Evklidov algoritem?
Evklidov algoritem je starodaven in zelo učinkovit postopek za iskanje **največjega skupnega delitelja (NSD)** dveh naravnih števil.
Temelji na dejstvu, da je NSD(a, b) enak NSD(b, ostanek pri a ÷ b), dokler ostanek ni 0.
""")
st.info("Vnesi dve pozitivni celi števili in aplikacija bo pokazala vse korake algoritma ter rezultat.")
# Vnos števil
col1, col2 = st.columns(2)
with col1:
a = st.number_input("Prvo število (a)", min_value=1, value=64000000, step=1)
with col2:
b = st.number_input("Drugo število (b)", min_value=1, value=360000, step=1)
if st.button("🚀 Izračunaj NSD", type="primary"):
# Kopija za prikaz
original_a, original_b = a, b
# Zagotovimo, da je a večje ali enako b
num1, num2 = a, b
steps = []
step = 1
if num1 < num2:
num1, num2 = num2, num1
steps.append(f"🔄 Zamenjava: večje število je {num1}, manjše {num2}")
while num2 != 0:
quotient = num1 // num2
remainder = num1 % num2
steps.append(f"**Korak {step}:** {num1} ÷ {num2} = {quotient} (celo število)")
steps.append(f" Ostanek: {num1} - {quotient} × {num2} = **{remainder}**")
steps.append(f" → NSD({num1}, {num2}) = NSD({num2}, {remainder})")
steps.append("") # prazen prostor
num1, num2 = num2, remainder
step += 1
nsd = num1
# Izpis rezultata
st.success(f"🎉 Največji skupni delitelj (NSD) števil {original_a} in {original_b} je: **{nsd}**")
# Prikaz korakov
st.markdown("### 📋 Koraki Evklidovega algoritma:")
for s in steps:
st.markdown(s)
st.markdown(f"**Končni rezultat:** Ostanek je 0 → NSD = **{nsd}**")
# Bonus: okrajšanje ulomka
st.markdown("### 🎁 Bonus: Okrajšanje ulomka a / b")
if original_b % nsd == 0 and original_a % nsd == 0:
okrajsan_st = original_a // nsd
okrajsan_im = original_b // nsd
st.latex(f"\\dfrac{{{original_a}}}{{{original_b}}} = \\dfrac{{{okrajsan_st}}}{{{okrajsan_im}}}")
if okrajsan_im == 1:
st.info(f"Ulomek se okrajša na celo število: **{okrajsan_st}**")
else:
st.warning("Napaka pri okrajšavi to se ne bi smelo zgoditi.")
st.caption("Izdelal z ❤️ za učenje matematike | Streamlit + Evklid (okoli 300 pr. n. št.)")