📂 File Browser

//NP1
🌙 Dark Mode
🎯 Quick Launch:

📁 Directories

📄 Files

🐘 index.php
▶ Open 📄 View Source
📜 script.js
▶ Open 📄 View Source
🎨 style.css
▶ Open 📄 View Source

📄 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