Vibe Coding.

User

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def calc(r,n=5000):
res=0
pre=1
for k in range(1,n+1):
res+=(900-3*k)*pre
pre*=r
return res

print(calc(1.000000001))# -33007613.752469875
print(calc(1)) # -33007500
print(calc(2)) # -1991154775206948884126595067592662896273042938157647612372256094632779484027264780453138241368668238728519998429256967668726981505272498732522185805188443000607536912377746529870444160997421674556958204303463770939741208803110982374799844855355671758999937658398764288691670085654835870832115119828213461829329066490903696187163167073103219901417974477452251494173732241749630750454676214329480295775132463648051352728884331518397533318160548995795205484665834072226948429654363107075811908522395940569734206236095184590324500922774715710744873152032818033453830864089104688712863382529780713154071269001485444955213496996185866786626605746354810302049467383195713164812001208023961400327770073297137775440106721294495698714893412410220579006057103331901936515272193177828636792807957436969739813798937267338767763488940823385986650556083877868113878359259784025249745583076676821155292291210585632437909134407104962533269578909780033873413400376653167685892027339037922063328338936692933972123477902950298030272524770244037276214199509319423085658798177651557322142837969371593389390846434629142186306659651186528615359823151044890496333427886032614190014943561571037139985423292966950287669037564020044319943861778935288986215623692815957263782494931408519815151826542564353163916736747399339950801185813022215930312415975072659158636564652584385023435072715788679910693079120436014501273654907232497059635692391903577617521445434068901365014761024802117061349754576396769520117982888290241674659654346474375

'''
等差比数列

已知等差比数列u(k) = (900-3k)r^{k-1}。
记s(n) = Σ_{k=1…n}u(k)。

求使得s(5000) = -600,000,000,000的r值。

将你的答案四舍五入至小数点后12位小数。

我的思路是:
小数二分.
首先发现1远远达不到预期值,但2超级大,所以答案应该介于1和2之间.
我的calc函数已经写好,请你在这个基础上修改为decimal,获取更高精度,同时将s(5000)=-600,000,000,000的条件修改为s(5000)<=xxx来方便二分.
然后套一个二分,精度小于某个阈值就break,复杂度是O(-log eps*5000)
'''

GPT

1
2
3
4
5
6
下面给你一个**可直接运行、采用 `decimal`、支持高精度二分搜索 r 的完整 Python 代码**。
我保留了你现有的 `calc()` 结构,只是改成 `Decimal`,并加入二分框架,并允许使用 `target`(例如 `-600_000_000_000`)。

---

# ✅ **最终代码(Decimal + 二分查找 r)**
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from decimal import Decimal, getcontext

# 全局高精度
getcontext().prec = 80 # 你可以再调高,例如 120

def calc(r, n=5000):
"""返回 sum_{k=1..n} (900-3k) * r^(k-1),使用 Decimal"""
res = Decimal(0)
pre = Decimal(1)
for k in range(1, n+1):
res += (Decimal(900) - Decimal(3)*k) * pre
pre *= r
return res

def find_r(target, n=5000, eps=Decimal("1e-20")):
"""二分求解 r,使 s(n) = target(或最近逼近)"""

lo = Decimal(1) # s(5000)太大(不够负)
hi = Decimal(2) # s(5000)超级负
# 你之前观察过:solution 在 (1,2)

# 二分
while hi - lo > eps:
mid = (lo + hi) / 2
s = calc(mid, n)
if s <= target:
hi = mid
else:
lo = mid

return (lo + hi) / 2

# ======================== 运行 ================================
target = Decimal("-600000000000")
r = find_r(target)

print("r ≈", format(r, ".12f"))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
---

# 🧠 **说明**

### 1. 为什么能用二分?

因为
[
s(r) = \sum_{k=1}^{5000} (900-3k),r^{k-1}
]
在 r > 1 的区间严格单调递增(实际上越来越负 → 越来越大负数)。

你之前的测试值也说明:

| r | s(5000,r) |
| ----------- | -------------- |
| 1 | ≈ -3.30075×10⁷ |
| 1.000000001 | 非常接近 |
| 2 | 极度负,远超目标 |

目标值 -6×10¹¹ 落在中间,区间唯一。

---

# 🎯 **最终输出精度**

你要求的是:

> 四舍五入至小数点后 12 位

输出中使用了 `format(r, ".12f")` 完成。

---

# 📌 **如果你需要我实际运行,给出最终 r 数值,也可以继续告诉我。**

Fact

一发过了.