1
1
from copy import copy , deepcopy
2
2
from itertools import chain
3
+ from math import e
3
4
4
5
from sage .categories .groups import Groups
5
6
from sage .combinat .rooted_tree import LabelledRootedTree as LTR
@@ -244,42 +245,36 @@ def theta_naive(self, m, a=ZZ(0), b=ZZ(1), z=None, gamma=None, **kwargs):
244
245
return num / den
245
246
246
247
def theta_derivative_naive (
247
- self , m , a , b , z = None , max_length = - 1 , base_field = None , s = None
248
+ self , m , a , b , z = None , max_length = - 1 , base_field = None , s = None , return_value = False
248
249
):
249
250
if s is not None :
250
- A = self .theta_naive (
251
- m , a , b , z = z , max_length = max_length , base_field = base_field
251
+ Ap , A = self .theta_derivative_naive (
252
+ m , a , b , z = z , max_length = max_length , base_field = base_field , s = None , return_value = True
252
253
)
253
- B = self .theta_naive (
254
+ Bp , B = self .theta_derivative_naive (
254
255
m ,
255
256
act (s , a ),
256
257
act (s , b ),
257
258
z = z ,
258
259
max_length = max_length ,
259
260
base_field = base_field ,
261
+ s = None , return_value = True
260
262
)
261
- Ap = self .theta_derivative_naive (
262
- m , a , b , z = z , max_length = max_length , base_field = base_field , s = None
263
- )
264
- Bp = self .theta_derivative_naive (
265
- m ,
266
- act (s , a ),
267
- act (s , b ),
268
- z = z ,
269
- max_length = max_length ,
270
- base_field = base_field ,
271
- s = None ,
272
- )
273
- return Ap * B + A * Bp
263
+ if return_value :
264
+ return Ap * B + A * Bp , A * B
265
+ else :
266
+ return Ap * B + A * Bp
274
267
275
268
num = 1
276
269
den = 1
277
-
278
270
second_term = 0
279
271
old_ans = 1
280
272
val = 0
273
+ can_stop = False
281
274
for i in NN :
282
275
verbose (f"{ i = } " )
276
+ if i > 2 and max_length == - 1 :
277
+ can_stop = True
283
278
for _ , g in self .enumerate_group_elements (i ):
284
279
ga = act (g , a )
285
280
gb = act (g , b )
@@ -289,14 +284,24 @@ def theta_derivative_naive(
289
284
den *= new_den
290
285
new_second_term = (ga - gb ) / (new_num * new_den )
291
286
second_term += new_second_term
287
+ try :
288
+ tmp1 = (new_num / new_den - 1 ).valuation ()
289
+ tmp1val = tmp1 .valuation ()
290
+ except TypeError :
291
+ val = - Infinity
292
+ tmp1val = 0
293
+ if val < m - tmp1val :
294
+ can_stop = False
292
295
new_ans = (num / den ) * second_term
293
- if i == max_length or (
294
- i > 0 and val >= (new_ans / old_ans - 1 ).valuation ()
295
- ):
296
- break
297
296
old_ans = new_ans
298
297
val = (new_ans / old_ans - 1 ).valuation ()
299
- return new_ans .add_bigoh (val + new_ans .valuation ())
298
+ if can_stop :
299
+ break
300
+ new_ans .add_bigoh (val + new_ans .valuation ())
301
+ if return_value :
302
+ return new_ans , num / den
303
+ else :
304
+ return new_ans
300
305
301
306
302
307
class PreSchottkyGroup (SchottkyGroup_abstract ):
0 commit comments