Số hoàn hảo

Thuật Toán Kiểm Tra Số Hoàn Hảo

🔢 Thuật Toán Số Hoàn Hảo

Mô phỏng và tìm hiểu về số hoàn hảo trong toán học

🎯 Số Hoàn Hảo Là Gì?

Số hoàn hảo là một số nguyên dương bằng tổng của tất cả các ước số dương thực sự của nó (không bao gồm chính nó).

📐 Định Nghĩa Toán Học

Một số n được gọi là số hoàn hảo nếu: σ(n) - n = n

Trong đó σ(n) là tổng của tất cả các ước số dương của n.

🌟 Ví Dụ Cổ Điển

Số 6: Các ước số thực sự: 1, 2, 3

Tổng: 1 + 2 + 3 = 6 ✅


Số 28: Các ước số thực sự: 1, 2, 4, 7, 14

Tổng: 1 + 2 + 4 + 7 + 14 = 28 ✅

🔍 Thuật Toán Kiểm Tra

  1. Tìm tất cả các ước số thực sự của n (từ 1 đến n/2)
  2. Tính tổng các ước số tìm được
  3. So sánh tổng với n
  4. Nếu bằng nhau → Số hoàn hảo

📊 Độ Phức Tạp

Thời gian: O(√n) - Chỉ cần kiểm tra đến √n

Không gian: O(1) - Chỉ cần biến đếm

🐍 Code Python - Thuật Toán Số Hoàn Hảo

📝 Phiên Bản Cơ Bản

def is_perfect_number(n): """ Kiểm tra số n có phải là số hoàn hảo không Args: n (int) - Số cần kiểm tra Returns: bool - True nếu là số hoàn hảo """ if n <= 1: return False sum_divisors = 0 # Tìm các ước số từ 1 đến n//2 for i in range(1, n // 2 + 1): if n % i == 0: sum_divisors += i return sum_divisors == n # Test print(is_perfect_number(6)) # True print(is_perfect_number(28)) # True print(is_perfect_number(12)) # False

⚡ Phiên Bản Tối Ưu - O(√n)

import math def is_perfect_optimized(n): """ Thuật toán tối ưu kiểm tra số hoàn hảo - O(√n) Ý tưởng: Thay vì kiểm tra tất cả số từ 1 đến n-1, ta chỉ cần kiểm tra từ 1 đến √n và tìm cặp ước số Args: n (int): Số cần kiểm tra Returns: bool: True nếu là số hoàn hảo, False nếu không """ # Trường hợp đặc biệt if n <= 1: return False # Khởi tạo tổng ước số với 1 (luôn là ước số) sum_divisors = 1 # Chỉ duyệt từ 2 đến √n sqrt_n = int(math.sqrt(n)) for i in range(2, sqrt_n + 1): if n % i == 0: # i là ước số của n # Thêm ước số i sum_divisors += i # Thêm ước số tương ứng n/i (nếu khác i) corresponding_divisor = n // i if i != corresponding_divisor: sum_divisors += corresponding_divisor # So sánh tổng với n return sum_divisors == n def is_perfect_with_details(n): """ Phiên bản chi tiết - trả về kết quả và danh sách ước số """ if n <= 1: return False, [], 0 divisors = [1] # Danh sách ước số sum_divisors = 1 sqrt_n = int(math.sqrt(n)) for i in range(2, sqrt_n + 1): if n % i == 0: divisors.append(i) sum_divisors += i corresponding = n // i if i != corresponding: divisors.append(corresponding) sum_divisors += corresponding # Sắp xếp danh sách ước số divisors.sort() return sum_divisors == n, divisors, sum_divisors # Test với ví dụ print("=== TEST THUẬT TOÁN TỐI ƯU ===") test_numbers = [6, 28, 12, 496, 1000] for num in test_numbers: is_perfect, divisors, total = is_perfect_with_details(num) print(f"Số {num}:") print(f" Ước số: {divisors}") print(f" Tổng: {total}") print(f" Kết quả: {'✅ Hoàn hảo' if is_perfect else '❌ Không hoàn hảo'}") print()

🚀 Thuật Toán Siêu Tối Ưu - Mersenne Primes

def is_mersenne_prime(p): """ Kiểm tra p có phải là số nguyên tố Mersenne không Số nguyên tố Mersenne có dạng 2^p - 1 (với p là số nguyên tố) """ if p < 2: return False # Kiểm tra p có phải số nguyên tố không if p == 2: return True if p % 2 == 0: return False for i in range(3, int(p**0.5) + 1, 2): if p % i == 0: return False return True def generate_perfect_from_mersenne(limit): """ Sinh số hoàn hảo từ công thức Euclid-Euler: Nếu 2^p - 1 là số nguyên tố, thì 2^(p-1) × (2^p - 1) là số hoàn hảo Đây là cách tìm TẤT CẢ số hoàn hảo chẵn! """ perfect_numbers = [] p = 2 while p < 20: # Giới hạn để tránh số quá lớn if is_mersenne_prime(p): mersenne = (2 ** p) - 1 perfect = (2 ** (p - 1)) * mersenne if perfect <= limit: perfect_numbers.append(perfect) else: break p += 1 return perfect_numbers # Sinh số hoàn hảo bằng công thức Mersenne print("=== SỐ HOÀN HẢO TỪ CÔNG THỨC MERSENNE ===") mersenne_perfects = generate_perfect_from_mersenne(10000) print(f"Số hoàn hảo ≤ 10,000: {mersenne_perfects}") # So sánh hiệu suất import time def benchmark_comparison(n): """So sánh hiệu suất các thuật toán""" # Thuật toán cơ bản O(n) start = time.time() result1 = is_perfect_number(n) time1 = time.time() - start # Thuật toán tối ưu O(√n) start = time.time() result2 = is_perfect_optimized(n) time2 = time.time() - start print(f"Số {n}:") print(f" Cơ bản O(n): {time1:.6f}s - {result1}") print(f" Tối ưu O(√n): {time2:.6f}s - {result2}") print(f" Tăng tốc: {time1/time2:.1f}x") print() # Test hiệu suất print("=== SO SÁNH HIỆU SUẤT ===") for test_num in [496, 8128, 33550336]: benchmark_comparison(test_num)

📊 Phân Tích Chi Tiết & Visualization

import matplotlib.pyplot as plt import numpy as np def analyze_perfect_number(n): """ Phân tích chi tiết một số hoàn hảo """ print(f"=== PHÂN TÍCH SỐ {n} ===") is_perfect, divisors, total = is_perfect_with_details(n) print(f"Số kiểm tra: {n}") print(f"Số ước số: {len(divisors)}") print(f"Danh sách ước số: {divisors}") print(f"Tổng ước số: {total}") print(f"Công thức: {' + '.join(map(str, divisors))} = {total}") print(f"Kết luận: {'✅ SỐ HOÀN HẢO' if is_perfect else '❌ KHÔNG PHẢI SỐ HOÀN HẢO'}") # Phân tích cấu trúc if len(divisors) > 1: ratio = divisors[-2] / divisors[0] if len(divisors) > 1 else 0 print(f"Tỷ lệ ước lớn nhất/nhỏ nhất: {ratio:.2f}") print("-" * 50) return is_perfect, divisors, total def find_perfect_efficient(limit): """ Tìm số hoàn hảo hiệu quả với thông tin chi tiết """ print(f"🔍 TÌM KIẾM SỐ HOÀN HẢO TỪ 1 ĐẾN {limit}") print("=" * 60) perfect_numbers = [] checked = 0 for num in range(1, limit + 1): checked += 1 if checked % 1000 == 0: print(f"Đã kiểm tra: {checked}/{limit} ({checked/limit*100:.1f}%)") if is_perfect_optimized(num): perfect_numbers.append(num) print(f"🎉 Tìm thấy số hoàn hảo: {num}") analyze_perfect_number(num) print(f"\n📋 KẾT QUẢ CUỐI CÙNG:") print(f"Phạm vi kiểm tra: 1 - {limit}") print(f"Số hoàn hảo tìm được: {len(perfect_numbers)}") print(f"Danh sách: {perfect_numbers}") return perfect_numbers # Chạy phân tích print("=== DEMO PHÂN TÍCH CHI TIẾT ===") for num in [6, 28, 12, 496]: analyze_perfect_number(num) # Tìm kiếm trong phạm vi nhỏ result = find_perfect_efficient(1000) # Thống kê def perfect_number_statistics(): """ Thống kê về số hoàn hảo """ known_perfects = [6, 28, 496, 8128, 33550336, 8589869056, 137438691328] print("\n📊 THỐNG KÊ SỐ HOÀN HẢO:") print("=" * 40) print(f"Số hoàn hảo đã biết: {len(known_perfects)}") print("Danh sách các số hoàn hảo đầu tiên:") for i, perfect in enumerate(known_perfects[:5], 1): digits = len(str(perfect)) print(f" {i}. {perfect:,} ({digits} chữ số)") print(f"\nGhi chú:") print(f"- Tất cả số hoàn hảo chẵn đều có dạng 2^(p-1) × (2^p - 1)") print(f"- Chưa tìm thấy số hoàn hảo lẻ nào") print(f"- Số hoàn hảo lớn nhất hiện biết có hơn 49 triệu chữ số!") perfect_number_statistics()

📖 Hướng Dẫn Sử Dụng

🎯 Cách Sử Dụng Ứng Dụng

  1. Tab Lý Thuyết: Tìm hiểu khái niệm số hoàn hảo
  2. Tab Mô Phỏng: Kiểm tra số cụ thể hoặc tìm kiếm số hoàn hảo
  3. Tab Code: Xem và học code Python
  4. Tab Nhật Ký: Theo dõi lịch sử kiểm tra

🔍 Hướng Dẫn Mô Phỏng

  • Kiểm tra đơn: Nhập số và nhấn "Kiểm Tra"
  • Tìm kiếm: Nhấn "Tìm Số Hoàn Hảo" để tìm từ 1-1000
  • Theo dõi: Xem quá trình thực hiện từng bước
  • Kết quả: Màu xanh = hoàn hảo, đỏ = không hoàn hảo

💡 Mẹo Sử Dụng

  • Thử các số nhỏ trước: 6, 28, 496
  • Số hoàn hảo rất hiếm, chỉ có 4 số < 10,000
  • Sử dụng trên mobile: Giao diện tự động điều chỉnh
  • Nhúng vào blog: Copy toàn bộ HTML

🌐 Tương Thích

  • ✅ Desktop: Chrome, Firefox, Safari, Edge
  • ✅ Mobile: iOS Safari, Android Chrome
  • ✅ Blogger/Blogspot: Paste HTML trực tiếp
  • ✅ WordPress: Sử dụng HTML widget

🔧 Tùy Chỉnh

  • Thay đổi màu sắc trong CSS
  • Điều chỉnh giới hạn tìm kiếm
  • Thêm hiệu ứng animation
  • Mở rộng tính năng phân tích

📋 Nhật Ký Kiểm Tra

Ghi lại tất cả các lần kiểm tra số hoàn hảo

Khởi tạo ứng dụng - 30/06/2025
🎉 Chào mừng bạn đến với ứng dụng kiểm tra số hoàn hảo!

Không có nhận xét nào

Được tạo bởi Blogger.