FSO-Genesis-Space / research /aimo_solver.py
LOOFYYLO's picture
Upload folder using huggingface_hub
2c54126 verified
Raw
History Blame Contribute Delete
10 kB
import sympy
def solve_alice_bob():
# sA: Alice sweets, aA: Alice age
# sB: Bob sweets, aB: Bob age
sA, aA, sB, aB = sympy.symbols('sA aA sB aB', integer=True, positive=True)
eq1 = sympy.Eq(sA + aA, 2 * (sB + aB))
eq2 = sympy.Eq(sA * aA, 4 * (sB * aB))
# "give me five of your sweets because then both our sum and product would be equal"
# Alice sum: (sA-5) + aA, Bob sum: (sB+5) + aB
# Alice product: (sA-5) * aA, Bob product: (sB+5) * aB
eq3 = sympy.Eq((sA - 5) + aA, (sB + 5) + aB)
eq4 = sympy.Eq((sA - 5) * aA, (sB + 5) * aB)
sol = sympy.solve([eq1, eq2, eq3, eq4], [sA, aA, sB, aB])
print(f"Alice & Bob Solution: {sol}")
if sol:
if isinstance(sol, list):
for s in sol:
print(f" aA * aB = {s[1] * s[3]}")
else:
print(f" aA * aB = {sol[aA] * sol[aB]}")
def solve_functional_equation():
# f(m) + f(n) = f(m + n + mn)
# Let g(x) = f(x-1). Then g(m+1) + g(n+1) = g((m+1)(n+1))
# This is g(X) + g(Y) = g(XY) for X, Y > 1
# This is a logarithmic functional equation: g(X) = c * log_b(X)
# Since f: Z+ -> Z+, g: {2, 3, ...} -> Z+
# g(n) = f(n-1). So f(n) = g(n+1) = c * log_b(n+1)
# For f(n) to be an integer for all n, c * log_b(n+1) must be an integer.
# This means n+1 must be a power of b, which isn't true for all n.
# Wait, the domain is Z+, so f(1), f(2), ...
# f(1) + f(1) = f(1+1+1) = f(3)
# f(1) + f(3) = f(1+3+3) = f(7)
# In general, f((2^k)-1) = k * f(1).
# What about f(2)? f(1) + f(2) = f(1+2+2) = f(5).
# Let x = m+1, y = n+1. Then f(x-1) + f(y-1) = f(xy-1).
# Let h(x) = f(x-1). Then h(x) + h(y) = h(xy) for x, y in {2, 3, ...}.
# h(x) = \sum a_p * v_p(x) where v_p(x) is the exponent of prime p in x.
# f(n) = h(n+1) = \sum a_p * v_p(n+1).
# Constraints: f(n) <= 1000 for n <= 1000.
# f(2024) = h(2025). 2025 = 3^4 * 5^2.
# So f(2024) = 4 * a_3 + 2 * a_5.
# a_p are f(p-1). All a_p must be >= 0 (since f: Z+ -> Z+).
# Since f(n) >= 1 (Z+), at least one a_p must be > 0.
# For n <= 1000, n+1 <= 1001. Max prime < 1001 is 997.
# f(p-1) = a_p. So a_p <= 1000.
# For any x <= 1001, \sum a_p * v_p(x) <= 1000.
# Specifically, a_p <= 1000 for all p <= 1001.
# a_2 * v_2(x) <= 1000 => a_2 * 9 <= 1000 (since 2^9 = 512 < 1001) => a_2 <= 111.
# a_3 * v_3(x) <= 1000 => a_3 * 6 <= 1000 (since 3^6 = 729 < 1001) => a_3 <= 166.
# a_997 <= 1000.
# f(2024) = 4 * a_3 + 2 * a_5.
# What are the constraints on a_3 and a_5?
# They must satisfy \sum a_p v_p(x) <= 1000 for all x <= 1001.
# This is equivalent to:
# a_2 * floor(log2(1001)) <= 1000
# a_3 * floor(log3(1001)) <= 1000
# ...
# And also combinations like a_2 + a_3 + a_5 + a_7 <= 1000 (since 2*3*5*7 = 210 <= 1001).
# 2*3*5*7*11 = 2310 > 1001.
# So at most 4 distinct primes product can be <= 1001.
# But a_p can be 0? The problem says f: Z+ -> Z+, so f(n) >= 1.
# Thus a_p = f(p-1) must be >= 1 for all p.
# If a_p >= 1, then f(2024) = 4*a_3 + 2*a_5.
# Max a_3: 3^6 = 729 <= 1001, 3^7 = 2187 > 1001. So 6*a_3 <= 1000 => a_3 <= 166.
# Max a_5: 5^4 = 625 <= 1001, 5^5 > 1001. So 4*a_5 <= 1000 => a_5 <= 250.
# Also a_2+a_3+a_5+a_7 <= 1000. Since a_p >= 1, this is always possible if others are small.
# The number of values f(2024) can take is the number of possible sums 4*a_3 + 2*a_5.
# Wait, f(p-1)=a_p. p-1 is an integer. p is a prime.
# For p=2, f(1)=a_2. For p=3, f(2)=a_3. For p=5, f(4)=a_5.
# Is there any other constraint? f(m)+f(n)=f(m+n+mn) must hold for all m, n.
# This implies f(n) = \sum a_p v_p(n+1) is the ONLY form.
# And a_p = f(p-1).
# Let's check: f(1) = a_2. f(2) = a_3. f(3) = h(4) = 2*a_2.
# From f(1)+f(1)=f(3), we have a_2+a_2 = 2*a_2. Correct.
# From f(1)+f(2)=f(5), we have a_2+a_3 = f(5) = h(6) = a_2+a_3. Correct.
# So yes, f(n) is determined by {a_p} for all primes p.
# The condition f(n) <= 1000 for n <= 1000 means:
# \sum a_p v_p(n+1) <= 1000 for all n+1 <= 1001.
# Since a_p >= 1, the maximum value of any a_p is when all other a_q are 1 (min possible).
# e.g. a_3 * 6 + (count of other primes in x) * 1 <= 1000.
# f(2024) = 4*a_3 + 2*a_5.
# Possible values:
# a_3 can be any integer from 1 to 166?
# If a_3 = 166, then 6*166 = 996 <= 1000.
# Then we need to check if a_5 can be something.
# If x = 3^6 = 729, f(728) = 6*a_3 = 996 <= 1000.
# If x = 3^4 * 5 = 81 * 5 = 405, f(404) = 4*a_3 + a_5 <= 1000.
# If a_3=166, 4*166 + a_5 = 664 + a_5 <= 1000 => a_5 <= 336.
# But a_5 also has its own constraint: 4*a_5 <= 1000 => a_5 <= 250.
# So if a_3=166, a_5 can be 1..250.
# In general, a_3 and a_5 just need to exist such that SOME a_p >= 1 satisfy the conditions.
# The simplest condition is:
# 1) 6*a_3 <= 1000 (from n+1 = 3^6 = 729)
# 2) 4*a_5 <= 1000 (from n+1 = 5^4 = 625)
# 3) 4*a_3 + 2*a_5 <= f(3^4 * 5^2 - 1) which is not constrained by n <= 1000.
# Wait, 3^4 * 5 = 405 <= 1001. So 4*a_3 + a_5 <= 1000.
# 3^2 * 5^2 = 9 * 25 = 225 <= 1001. So 2*a_3 + 2*a_5 <= 1000.
# 3 * 5^3 = 3 * 125 = 375 <= 1001. So a_3 + 3*a_5 <= 1000.
# These are the constraints on a_3 and a_5.
# We want to know how many values 4*a_3 + 2*a_5 can take.
pass
def count_f2024_values():
values = set()
# Constraints:
# a3, a5 >= 1
# 6*a3 <= 1000
# 4*a5 <= 1000
# 4*a3 + a5 <= 1000 (3^4 * 5 = 405)
# 2*a3 + 2*a5 <= 1000 (3^2 * 5^2 = 225)
# a3 + 3*a5 <= 1000 (3 * 5^3 = 375)
# Are there others?
# 3^5 * 2 = 243 * 2 = 486. So 5*a3 + a2 <= 1000. Since a2 >= 1, 5*a3 <= 999.
# 5^2 * 2^5 = 25 * 32 = 800. So 2*a5 + 5*a2 <= 1000.
# But a2 can be 1. So we just need to know if there EXISTS a_p >= 1.
# The tightest constraints on (a3, a5) are those involving only a3, a5 and min a_p=1.
# e.g. 3^4 * 5 * 2 = 810 <= 1001 => 4*a3 + a5 + a2 <= 1000. With a2=1, 4*a3 + a5 <= 999.
# 3^2 * 5^2 * 2^2 = 900 <= 1001 => 2*a3 + 2*a5 + 2*a2 <= 1000. With a2=1, 2*a3 + 2*a5 <= 998.
for a3 in range(1, 1001):
if 6*a3 + 1 > 1000: break # 3^6 * 2 > 1001, but 3^6 = 729.
# Actually 3^6 = 729 is the limit. So 6*a3 + (other primes) <= 1000.
# Minimal other primes is none if n+1 is power of 3.
# So 6*a3 <= 1000.
for a5 in range(1, 1001):
# Check all x = 3^i * 5^j * 2^k * ... <= 1001
# We must have i*a3 + j*a5 + k*a2 + ... <= 1000
# To see if a3, a5 is possible, we just need i*a3 + j*a5 + (sum of other v_p(x)) <= 1000
# for all i, j such that 3^i * 5^j * (product of other primes) <= 1001.
# The "worst" case is when we use the smallest other prime (2) as much as possible.
possible = True
for i in range(7): # 3^6 = 729
for j in range(5): # 5^4 = 625
if i == 0 and j == 0: continue
rem = 1001 // (3**i * 5**j)
if rem == 0: continue
# Maximize k such that 3^i * 5^j * 2^k <= 1001
import math
k = int(math.log2(rem))
# sum of other exponents (primes > 5) is 0 for min f(n)
if i*a3 + j*a5 + k*1 > 1000:
possible = False; break
if not possible: break
if possible:
values.add(4*a3 + 2*a5)
print(f"Number of values f(2024) can take: {len(values)}")
if __name__ == "__main__":
solve_alice_bob()
count_f2024_values()
def solve_double_sum_floor():
# f(n) = \sum_{j=1}^n j^1024 \lfloor 1/j + (n-i)/n \rfloor
# Wait, the inner sum is over j, outer over i.
# f(n) = \sum_{i=1}^n \sum_{j=1}^n j^1024 \lfloor 1/j + (n-i)/n \rfloor
# Let k = n-i. i=1..n => k=0..n-1.
# f(n) = \sum_{k=0}^{n-1} \sum_{j=1}^n j^1024 \lfloor 1/j + k/n \rfloor
# \lfloor 1/j + k/n \rfloor:
# If j=1: \lfloor 1 + k/n \rfloor = 1 for all k=0..n-1.
# If j>1: 1/j + k/n < 1/2 + 1 = 1.5.
# 1/j + k/n >= 1 ⟺ k/n >= 1 - 1/j ⟺ k >= n - n/j.
# So for a fixed j > 1, the term j^1024 is included for k = \lceil n - n/j \rceil, ..., n-1.
# Number of such k: n - \lceil n - n/j \rceil = \lfloor n/j \rfloor.
# For j=1: 1^1024 is included for all n values of k. \lfloor n/1 \rfloor = n.
# So f(n) = \sum_{j=1}^n j^1024 \lfloor n/j \rfloor.
# N = f(M^15) - f(M^15 - 1)
# f(m) - f(m-1) = \sum_{j=1}^m j^1024 \lfloor m/j \rfloor - \sum_{j=1}^{m-1} j^1024 \lfloor (m-1)/j \rfloor
# \lfloor m/j \rfloor - \lfloor (m-1)/j \rfloor is 1 if j divides m, and 0 otherwise.
# The j=m term in first sum is m^1024 * \lfloor m/m \rfloor = m^1024.
# So f(m) - f(m-1) = \sum_{j|m, j<m} j^1024 + m^1024 = \sum_{j|m} j^1024.
# Let \sigma_k(n) = \sum_{d|n} d^k. Then N = \sigma_1024(M^15).
# M = 2 * 3 * 5 * 7 * 11 * 13.
# M^15 = 2^15 * 3^15 * 5^15 * 7^15 * 11^15 * 13^15.
# \sigma_1024(n) is multiplicative.
# \sigma_1024(p^a) = \frac{p^{1024(a+1)} - 1}{p^{1024} - 1}.
# N = \prod_{p \in {2,3,5,7,11,13}} \frac{p^{1024*16} - 1}{p^{1024} - 1}.
# We want k such that 2^k || N.
# v2(N) = \sum v2( \frac{p^{1024*16} - 1}{p^{1024} - 1} ).
# For p=2: \frac{2^{1024*16} - 1}{2^{1024} - 1} is odd, so v2 = 0.
# For odd p: v2( p^x - 1 ).
# LTE Lemma: v2( p^x - 1 ) = v2(p-1) + v2(p+1) + v2(x) - 1 for even x.
# Here x1 = 1024*16 = 2^14, x2 = 1024 = 2^10. Both even.
# v2( \frac{p^{x1} - 1}{p^{x2} - 1} ) = v2(p^{x1} - 1) - v2(p^{x2} - 1)
# = (v2(p-1) + v2(p+1) + 14 - 1) - (v2(p-1) + v2(p+1) + 10 - 1)
# = 14 - 10 = 4.
# This is for each odd p \in {3, 5, 7, 11, 13}.
# There are 5 such primes. So k = 5 * 4 = 20.
# We want 2^20 mod 5^7.
# 5^7 = 78125.
k = 20
ans = pow(2, 20, 5**7)
print(f"Problem 26de63 (Double sum) Solution: {ans}")
if __name__ == "__main__":
solve_double_sum_floor()