📄 Source: index.php
<?php
// index.php - Analizor Divizibilitate
session_start();
// ========== FUNCȚII DE ANALIZĂ ==========
function getDivisors($n) {
$divisors = [];
$n = abs($n);
for ($i = 1; $i <= sqrt($n); $i++) {
if ($n % $i == 0) {
$divisors[] = $i;
if ($i != $n / $i) {
$divisors[] = $n / $i;
}
}
}
sort($divisors);
return $divisors;
}
function isPrime($n) {
if ($n < 2) return false;
if ($n == 2) return true;
if ($n % 2 == 0) return false;
for ($i = 3; $i <= sqrt($n); $i += 2) {
if ($n % $i == 0) return false;
}
return true;
}
function primeFactorization($n) {
$factors = [];
$num = abs($n);
$original = $n;
// Factorul 2
$count = 0;
while ($num % 2 == 0) {
$count++;
$num /= 2;
}
if ($count > 0) $factors[] = ['prime' => 2, 'exponent' => $count];
// Factorii impari
for ($i = 3; $i <= sqrt($num); $i += 2) {
$count = 0;
while ($num % $i == 0) {
$count++;
$num /= $i;
}
if ($count > 0) $factors[] = ['prime' => $i, 'exponent' => $count];
}
// Dacă a rămas un număr prim > 2
if ($num > 2) $factors[] = ['prime' => $num, 'exponent' => 1];
return $factors;
}
function formatFactorization($factors) {
if (empty($factors)) return "1 (neutru)";
$result = [];
foreach ($factors as $f) {
if ($f['exponent'] == 1) {
$result[] = $f['prime'];
} else {
$result[] = $f['prime'] . "<sup>" . $f['exponent'] . "</sup>";
}
}
return implode(" × ", $result);
}
function getProperDivisors($n) {
$divisors = getDivisors($n);
// Eliminăm numărul însuși
return array_values(array_filter($divisors, function($d) use ($n) {
return $d != $n;
}));
}
function isPerfect($n) {
if ($n <= 1) return false;
$properSum = array_sum(getProperDivisors($n));
return $properSum == $n;
}
function isDeficient($n) {
if ($n <= 1) return true;
$properSum = array_sum(getProperDivisors($n));
return $properSum < $n;
}
function isAbundant($n) {
if ($n <= 1) return false;
$properSum = array_sum(getProperDivisors($n));
return $properSum > $n;
}
function sumOfDivisors($n) {
return array_sum(getDivisors($n));
}
function countOfDivisors($n) {
return count(getDivisors($n));
}
function getPrimeFactorsList($n) {
$factors = primeFactorization($n);
$list = [];
foreach ($factors as $f) {
for ($i = 0; $i < $f['exponent']; $i++) {
$list[] = $f['prime'];
}
}
return $list;
}
function getTauFunction($n) { // Numărul de divizori
return countOfDivisors($n);
}
function getSigmaFunction($n) { // Suma divizorilor
return sumOfDivisors($n);
}
function isSquarefree($n) {
$factors = primeFactorization($n);
foreach ($factors as $f) {
if ($f['exponent'] > 1) return false;
}
return true;
}
function getEulerTotient($n) {
if ($n <= 1) return 1;
$result = $n;
$num = $n;
for ($i = 2; $i * $i <= $num; $i++) {
if ($num % $i == 0) {
while ($num % $i == 0) $num /= $i;
$result -= $result / $i;
}
}
if ($num > 1) $result -= $result / $num;
return $result;
}
function getMobiusFunction($n) {
$factors = primeFactorization($n);
foreach ($factors as $f) {
if ($f['exponent'] > 1) return 0;
}
return (count($factors) % 2 == 0) ? 1 : -1;
}
// Procesare
$error = "";
$results = null;
$inputNumber = "";
if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST["number"])) {
$inputNumber = trim($_POST["number"]);
if (is_numeric($inputNumber) && $inputNumber == (int)$inputNumber) {
$n = (int)$inputNumber;
if ($n < -10000 || $n > 10000) {
$error = "Te rog introdu un număr între -10000 și 10000.";
} else {
$absN = abs($n);
$results = [
'number' => $n,
'absolute' => $absN,
'divisors' => getDivisors($absN),
'properDivisors' => getProperDivisors($absN),
'isPrime' => isPrime($absN),
'factorization' => primeFactorization($absN),
'factorizationFormatted' => formatFactorization(primeFactorization($absN)),
'primeFactorsList' => getPrimeFactorsList($absN),
'isPerfect' => isPerfect($absN),
'isDeficient' => isDeficient($absN),
'isAbundant' => isAbundant($absN),
'sumDivisors' => sumOfDivisors($absN),
'countDivisors' => countOfDivisors($absN),
'tau' => getTauFunction($absN),
'sigma' => getSigmaFunction($absN),
'isSquarefree' => isSquarefree($absN),
'eulerTotient' => getEulerTotient($absN),
'mobius' => getMobiusFunction($absN)
];
}
} else {
$error = "Te rog introdu un număr întreg valid.";
}
}
?>
<!DOCTYPE html>
<html lang="ro">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Analizor Divizibilitate | Matematică</title>
<link rel="stylesheet" href="style.css">
<link href="https://fonts.googleapis.com/css2?family=Inter:opsz,wght@14..32,300;400;600;700;800&display=swap" rel="stylesheet">
<style>
/* Stiluri suplimentare pentru carduri de rezultate */
.result-card {
background: var(--bg-card);
border-radius: 1.5rem;
padding: 1.2rem;
margin-bottom: 1rem;
border-left: 4px solid;
transition: all 0.2s;
}
.result-card:hover {
transform: translateX(4px);
}
.result-card.primary { border-left-color: #3b82f6; }
.result-card.success { border-left-color: #10b981; }
.result-card.warning { border-left-color: #f59e0b; }
.result-card.info { border-left-color: #8b5cf6; }
.result-card.danger { border-left-color: #ef4444; }
.result-title {
font-size: 1rem;
font-weight: 700;
margin-bottom: 0.5rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.result-value {
font-size: 1.2rem;
font-weight: 600;
font-family: 'SF Mono', monospace;
word-break: break-word;
}
.badge {
display: inline-block;
padding: 0.2rem 0.6rem;
border-radius: 2rem;
font-size: 0.7rem;
font-weight: 600;
}
.badge-prime { background: #10b981; color: white; }
.badge-composite { background: #f59e0b; color: white; }
.badge-perfect { background: #8b5cf6; color: white; }
.badge-abundant { background: #ef4444; color: white; }
.badge-deficient { background: #3b82f6; color: white; }
.factors-list {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
margin-top: 0.5rem;
}
.factor-chip {
background: var(--code-bg);
padding: 0.3rem 0.8rem;
border-radius: 2rem;
font-family: monospace;
font-size: 0.85rem;
}
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 1rem;
margin-top: 1.5rem;
}
.stat-card {
background: var(--code-bg);
border-radius: 1rem;
padding: 0.8rem;
text-align: center;
}
.stat-number {
font-size: 1.8rem;
font-weight: 800;
color: #3b82f6;
}
.stat-label {
font-size: 0.7rem;
color: var(--text-secondary);
}
.divisor-list {
max-height: 200px;
overflow-y: auto;
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
padding: 0.5rem;
}
.divisor-item {
background: var(--bg-card);
border: 1px solid var(--border-color);
padding: 0.3rem 0.7rem;
border-radius: 2rem;
font-family: monospace;
font-size: 0.8rem;
}
.back-link {
display: inline-block;
margin-top: 1rem;
color: #3b82f6;
text-decoration: none;
}
</style>
</head>
<body>
<div class="theme-switcher">
<button class="theme-btn" data-theme="light">☀️</button>
<button class="theme-btn" data-theme="dark">🌙</button>
<button class="theme-btn" data-theme="ocean">🌊</button>
<button class="theme-btn" data-theme="sunset">🌅</button>
</div>
<div class="container">
<header class="header">
<h1>
<span class="icon">🔢</span>
Analizor de Divizibilitate
</h1>
<p class="subhead">
✨ Descoperă toate proprietățile unui număr: divizori, factori primi, clasificări și funcții aritmetice
</p>
</header>
<div class="form-card">
<form method="POST" action="" id="mainForm">
<div class="input-group">
<div class="input-field">
<label for="number">
🧮 Introdu un număr întreg
<span class="tooltip">ℹ️ Interval recomandat: -10000 până la 10000</span>
</label>
<input type="number"
name="number"
id="number"
value="<?php echo htmlspecialchars($inputNumber); ?>"
placeholder="Ex: 28, 12, 100, 37, -24"
autocomplete="off">
</div>
<button type="submit" class="btn-primary">
<span class="btn-icon">🔍</span>
Analizează
</button>
</div>
<?php if ($error): ?>
<div class="error-message">
⚠️ <?php echo htmlspecialchars($error); ?>
</div>
<?php endif; ?>
</form>
</div>
<?php if ($results):
$n = $results['number'];
$absN = $results['absolute'];
$isNegative = $n < 0;
?>
<!-- Header număr -->
<div class="result-card primary" style="text-align: center;">
<div class="result-title" style="justify-content: center;">
🎯 Număr analizat
</div>
<div class="result-value" style="font-size: 2rem;">
<?php echo number_format($n, 0, ',', '.'); ?>
<?php if ($isNegative): ?>
<span style="font-size: 0.9rem;">(valoare absolută: <?php echo $absN; ?>)</span>
<?php endif; ?>
</div>
</div>
<div class="stats-grid">
<div class="stat-card">
<div class="stat-number"><?php echo $results['countDivisors']; ?></div>
<div class="stat-label">divizori</div>
</div>
<div class="stat-card">
<div class="stat-number"><?php echo number_format($results['sumDivisors'], 0, ',', '.'); ?></div>
<div class="stat-label">suma divizorilor</div>
</div>
<div class="stat-card">
<div class="stat-number">φ(<?php echo $absN; ?>) = <?php echo $results['eulerTotient']; ?></div>
<div class="stat-label">Funcția lui Euler (numere coprime)</div>
</div>
<div class="stat-card">
<div class="stat-number">μ(<?php echo $absN; ?>) = <?php echo $results['mobius']; ?></div>
<div class="stat-label">Funcția Möbius</div>
</div>
</div>
<!-- Tipul numărului -->
<div class="result-card info">
<div class="result-title">
🏷️ Clasificare
</div>
<div class="result-value">
<?php if ($results['isPrime']): ?>
<span class="badge badge-prime">🔷 NUMĂR PRIM</span>
<?php else: ?>
<span class="badge badge-composite">📦 NUMĂR COMPUS</span>
<?php endif; ?>
<?php if ($results['isPerfect']): ?>
<span class="badge badge-perfect">✨ NUMĂR PERFECT</span>
<?php elseif ($results['isAbundant']): ?>
<span class="badge badge-abundant">⬆️ NUMĂR ABUNDENT</span>
<?php elseif ($results['isDeficient']): ?>
<span class="badge badge-deficient">⬇️ NUMĂR DEFICIENT</span>
<?php endif; ?>
<?php if ($results['isSquarefree']): ?>
<span class="badge" style="background: #06b6d4;">⬜ FĂRĂ PĂTRATE PERFECTE</span>
<?php endif; ?>
</div>
</div>
<!-- Descompunere în factori primi -->
<div class="result-card success">
<div class="result-title">
🔬 Descompunere în factori primi
</div>
<div class="result-value" style="font-size: 1.3rem;">
<?php echo $absN; ?> = <?php echo $results['factorizationFormatted']; ?>
</div>
<div class="factors-list">
<?php foreach ($results['primeFactorsList'] as $factor): ?>
<span class="factor-chip"><?php echo $factor; ?></span>
<?php endforeach; ?>
</div>
</div>
<!-- Divizori -->
<div class="result-card warning">
<div class="result-title">
📋 Toți divizorii (<?php echo $results['countDivisors']; ?>)
</div>
<div class="divisor-list">
<?php foreach ($results['divisors'] as $d): ?>
<span class="divisor-item"><?php echo number_format($d, 0, ',', '.'); ?></span>
<?php endforeach; ?>
</div>
</div>
<!-- Divizori proprii -->
<div class="result-card">
<div class="result-title">
✂️ Divizori proprii (fără numărul însuși)
</div>
<div class="divisor-list">
<?php if (empty($results['properDivisors'])): ?>
<em>Niciun divizor propriu (număr prim)</em>
<?php else: ?>
<?php foreach ($results['properDivisors'] as $d): ?>
<span class="divisor-item"><?php echo number_format($d, 0, ',', '.'); ?></span>
<?php endforeach; ?>
<?php endif; ?>
</div>
<div style="margin-top: 0.5rem; font-size: 0.8rem;">
Suma divizorilor proprii: <strong><?php echo number_format(array_sum($results['properDivisors']), 0, ',', '.'); ?></strong>
<?php if ($results['isPerfect']): ?>
✅ (egal cu numărul original → număr perfect!)
<?php elseif ($results['isAbundant']): ?>
📈 (mai mare decât numărul original → abundent)
<?php else: ?>
📉 (mai mic decât numărul original → deficient)
<?php endif; ?>
</div>
</div>
<!-- Funcții aritmetice -->
<div class="stats-grid">
<div class="stat-card">
<div class="stat-number">τ(<?php echo $absN; ?>) = <?php echo $results['tau']; ?></div>
<div class="stat-label">Funcția τ (numărul divizorilor)</div>
</div>
<div class="stat-card">
<div class="stat-number">σ(<?php echo $absN; ?>) = <?php echo number_format($results['sigma'], 0, ',', '.'); ?></div>
<div class="stat-label">Funcția σ (suma divizorilor)</div>
</div>
</div>
<!-- Curiozități -->
<div class="result-card info">
<div class="result-title">
💡 Curiozități matematice
</div>
<ul style="margin-left: 1.5rem; line-height: 1.6;">
<?php if ($absN == 1): ?>
<li>1 este unitatea multiplicativă - singurul număr cu exact un divizor.</li>
<?php endif; ?>
<?php if ($absN == 2): ?>
<li>2 este singurul număr prim par.</li>
<?php endif; ?>
<?php if ($absN == 28 || $absN == 496 || $absN == 8128): ?>
<li>✨ Acesta este un număr perfect! Următorul număr perfect este 33550336.</li>
<?php endif; ?>
<?php if ($results['isPrime'] && $absN > 2): ?>
<li>🔷 Orice număr prim mai mare decât 3 poate fi scris ca 6k±1.</li>
<?php endif; ?>
<?php if ($absN % 2 == 0 && $absN > 2 && !$results['isPrime']): ?>
<li>📊 Numerele pare > 2 sunt întotdeauna compuse.</li>
<?php endif; ?>
<li>🔢 <?php echo $absN; ?> are <?php echo $results['countDivisors']; ?> divizori.</li>
<li>φ(<?php echo $absN; ?>) = <?php echo $results['eulerTotient']; ?> numere mai mici decât <?php echo $absN; ?> sunt coprime cu acesta.</li>
</ul>
</div>
<!-- Link către proiectul cu șiruri -->
<div style="text-align: center; margin-top: 1rem;">
<a href="sequences.php" class="back-link" style="display: inline-flex; align-items: center; gap: 0.5rem;">
📐 Vezi și proiectul cu șiruri matematice celebre
</a>
<span style="margin: 0 0.5rem;">|</span>
<a href="#" onclick="window.location.reload();" class="back-link" style="display: inline-flex; align-items: center; gap: 0.5rem;">
🔄 Analizează alt număr
</a>
</div>
<?php elseif (!$error && $_SERVER["REQUEST_METHOD"] === "POST"): ?>
<div class="empty-state">
<div class="empty-icon">🔢</div>
<h3>Niciun rezultat</h3>
<p>Introdu un număr valid în formularul de mai sus.</p>
</div>
<?php else: ?>
<div class="empty-state">
<div class="empty-icon">📊</div>
<h3>Analizor de Divizibilitate</h3>
<p>Introdu un număr întreg pentru a vedea:</p>
<ul style="text-align: left; max-width: 300px; margin: 1rem auto;">
<li>✓ Toți divizorii numărului</li>
<li>✓ Dacă este prim, perfect, abundent sau deficient</li>
<li>✓ Descompunerea în factori primi</li>
<li>✓ Funcțiile τ, σ, φ, μ</li>
<li>✓ Și multe alte proprietăți matematice</li>
</ul>
<div class="examples-grid" style="justify-content: center; margin-top: 1rem;">
<span class="example-chip" data-expr="28">28 (perfect)</span>
<span class="example-chip" data-expr="12">12 (abundant)</span>
<span class="example-chip" data-expr="17">17 (prim)</span>
<span class="example-chip" data-expr="100">100</span>
<span class="example-chip" data-expr="496">496 (perfect)</span>
<span class="example-chip" data-expr="30">30</span>
</div>
</div>
<?php endif; ?>
<footer class="footer">
<p>⚡ Analizor complet de divizibilitate | Funcții: τ (număr divizori), σ (sumă divizori), φ (Euler), μ (Möbius)</p>
<p>📐 <a href="sequences.php" style="color: var(--text-primary);">Vezi și proiectul cu șiruri matematice celebre</a></p>
</footer>
</div>
<script>
// Teme
(function() {
const savedTheme = localStorage.getItem('divisibility-theme') || localStorage.getItem('math-sequence-theme');
if (savedTheme) document.documentElement.setAttribute('data-theme', savedTheme);
else document.documentElement.setAttribute('data-theme', 'light');
document.querySelectorAll('.theme-btn').forEach(btn => {
btn.addEventListener('click', function() {
const theme = this.getAttribute('data-theme');
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('divisibility-theme', theme);
});
});
})();
// Click pe exemple
document.querySelectorAll('.example-chip').forEach(chip => {
chip.addEventListener('click', function() {
const expr = this.getAttribute('data-expr');
const input = document.getElementById('number');
if (input && expr) {
input.value = expr;
document.getElementById('mainForm').submit();
}
});
});
// Salvare ultimul număr
function saveLastNumber() {
const lastNumber = document.getElementById('number')?.value;
if (lastNumber && lastNumber !== '') localStorage.setItem('last-number-divisibility', lastNumber);
}
window.addEventListener('beforeunload', saveLastNumber);
// Încărcare ultimul număr
const lastNumber = localStorage.getItem('last-number-divisibility');
if (lastNumber && document.getElementById('number') && !document.getElementById('number').value) {
document.getElementById('number').value = lastNumber;
}
</script>
</body>
</html>
← Back