Ticket #12690: prime_pi_interrupt_error.patch

File prime_pi_interrupt_error.patch, 65.2 KB (added by ohanar, 10 years ago)

prime_pi that causes the interrupt error

  • module_list.py

    diff --git a/module_list.py b/module_list.py
    a b  
    2424#########################################################
    2525
    2626## Choose cblas library -- note -- make sure to update sage/misc/cython.py
    27 ## if you change this!! 
     27## if you change this!!
    2828if os.environ.has_key('SAGE_BLAS'):
    2929    BLAS=os.environ['SAGE_BLAS']
    3030    BLAS2=os.environ['SAGE_BLAS']
    31 elif os.path.exists('%s/lib/libatlas.so'%os.environ['SAGE_LOCAL']):   
     31elif os.path.exists('%s/lib/libatlas.so'%os.environ['SAGE_LOCAL']):
    3232    BLAS='cblas'
    3333    BLAS2='atlas'
    3434elif os.path.exists('/usr/lib/libcblas.dylib') or \
    3535     os.path.exists('/usr/lib/libcblas.so'):
    3636    BLAS='cblas'
    3737    BLAS2='atlas'
    38 elif os.path.exists('/usr/lib/libblas.dll.a'):   
     38elif os.path.exists('/usr/lib/libblas.dll.a'):
    3939    BLAS='gslcblas'
    4040    BLAS2='gslcblas'
    4141else:
    42     # This is very slow  (?), but *guaranteed* to be available. 
    43     BLAS='gslcblas' 
     42    # This is very slow  (?), but *guaranteed* to be available.
     43    BLAS='gslcblas'
    4444    BLAS2='gslcblas'
    4545
    4646
     
    100100        return alternative
    101101
    102102ext_modules = [
    103    
     103
    104104    ################################
    105105    ##
    106106    ## sage.algebras
     
    120120               libraries = ["csage", "flint", "gmp", "gmpxx", "m", "stdc++", "ntl"]),
    121121
    122122    ################################
    123     ## 
     123    ##
    124124    ## sage.calculus
    125125    ##
    126126    ################################
    127    
     127
    128128    Extension('sage.calculus.var',
    129129              sources = ['sage/calculus/var.pyx']),
    130130
     
    140140
    141141
    142142    ################################
    143     ## 
     143    ##
    144144    ## sage.categories
    145145    ##
    146146    ################################
     
    153153
    154154    Extension('sage.categories.functor',
    155155              sources = ['sage/categories/functor.pyx']),
    156              
     156
    157157    Extension('sage.categories.map',
    158158              sources = ['sage/categories/map.pyx']),
    159              
     159
    160160    Extension('sage.categories.morphism',
    161161              sources = ['sage/categories/morphism.pyx']),
    162162
     
    164164              sources = ['sage/categories/examples/semigroups_cython.pyx']),
    165165
    166166    ################################
    167     ## 
     167    ##
    168168    ## sage.coding
    169169    ##
    170170    ################################
     
    173173              sources = ['sage/coding/binary_code.pyx']),
    174174
    175175    ################################
    176     ## 
     176    ##
    177177    ## sage.combinat
    178178    ##
    179179    ################################
     
    181181    Extension('sage.combinat.expnums',
    182182              sources = ['sage/combinat/expnums.pyx'],
    183183              libraries = ['gmp']),
    184                            
     184
    185185    Extension('sage.combinat.matrices.dancing_links',
    186186              sources = ['sage/combinat/matrices/dancing_links.pyx'],
    187187              libraries = ["stdc++"],
     
    223223              libraries=['gmp']),
    224224
    225225    ################################
    226     ## 
     226    ##
    227227    ## sage.crypto
    228228    ##
    229229    ################################
     
    232232              sources = ['sage/crypto/boolean_function.pyx']),
    233233
    234234    ################################
    235     ## 
     235    ##
    236236    ## sage.ext
    237237    ##
    238238    ################################
    239239
    240240    Extension('sage.ext.c_lib',
    241241              sources = ['sage/ext/c_lib.pyx']),
    242    
     242
    243243    Extension('sage.ext.fast_callable',
    244244              sources = ['sage/ext/fast_callable.pyx']),
    245    
     245
    246246    Extension('sage.ext.fast_eval',
    247247              sources = ['sage/ext/fast_eval.pyx']),
    248    
     248
    249249    Extension('sage.ext.interactive_constructors_c',
    250250              sources = ['sage/ext/interactive_constructors_c.pyx']),
    251    
     251
    252252    Extension('sage.ext.multi_modular',
    253253              sources = ['sage/ext/multi_modular.pyx'],
    254               libraries=['gmp']), 
     254              libraries=['gmp']),
    255255
    256256    ################################
    257     ## 
     257    ##
    258258    ## sage.finance
    259259    ##
    260260    ################################
     
    262262    Extension('sage.finance.fractal',
    263263              sources = ['sage/finance/fractal.pyx'],
    264264              depends = numpy_depends),
    265    
     265
    266266    Extension('sage.finance.markov_multifractal_cython',
    267267              sources = ['sage/finance/markov_multifractal_cython.pyx']),
    268268
     
    273273
    274274
    275275    ################################
    276     ##
    277     ## sage.functions
    278     ##
    279     ################################
    280    
    281     Extension('sage.functions.prime_pi',
    282         sources = ['sage/functions/prime_pi.pyx']),
    283    
     276    ##
     277    ## sage.functions
     278    ##
     279    ################################
     280
     281    Extension('sage.functions.prime_pi',
     282        sources = ['sage/functions/prime_pi.pyx'],
     283        libraries = ['pari', 'gmp'],
     284        extra_compile_args = ['-std=c99','-fopenmp'],
     285        extra_link_args = ['-fopenmp']),
     286
    284287     ################################
    285288     ##
    286289     ## sage.games
     
    309312     Extension('sage.geometry.triangulation.base',
    310313               sources = ['sage/geometry/triangulation/functions.cc',
    311314                          'sage/geometry/triangulation/data.cc',
    312                           'sage/geometry/triangulation/base.pyx', 
     315                          'sage/geometry/triangulation/base.pyx',
    313316                          'sage/geometry/triangulation/triangulations.cc'],
    314317               language="c++"),
    315318
    316     ################################ 
    317     ## 
     319    ################################
     320    ##
    318321    ## sage.graphs
    319322    ##
    320323    ################################
     
    420423        ################################
    421424        ##
    422425        ## sage.graphs.base
    423         ## 
     426        ##
    424427        ################################
    425428
    426429    Extension('sage.graphs.base.c_graph',
     
    433436              sources = ['sage/graphs/base/dense_graph.pyx']),
    434437
    435438    ################################
    436     ## 
     439    ##
    437440    ## sage.groups
    438441    ##
    439442    ################################
     
    447450        ###################################
    448451        ##
    449452        ## sage.groups.perm_gps.partn_ref
    450         ## 
     453        ##
    451454        ###################################
    452    
     455
    453456    Extension('sage.groups.perm_gps.partn_ref.automorphism_group_canonical_label',
    454457              sources = ['sage/groups/perm_gps/partn_ref/automorphism_group_canonical_label.pyx'],
    455458              libraries = ['gmp', 'flint'],
     
    500503              depends = flint_depends),
    501504
    502505    ################################
    503     ## 
     506    ##
    504507    ## sage.gsl
    505508    ##
    506509    ################################
    507    
     510
    508511    Extension('sage.gsl.callback',
    509512              sources = ['sage/gsl/callback.pyx'],
    510513              libraries = ['gsl', BLAS, BLAS2],
    511514              define_macros=[('GSL_DISABLE_DEPRECATED','1')]),
    512    
     515
    513516    Extension('sage.gsl.dwt',
    514517              sources = ['sage/gsl/dwt.pyx'],
    515518              libraries=['gsl',BLAS],
     
    519522              sources = ['sage/gsl/fft.pyx'],
    520523              libraries = ['gsl', BLAS, BLAS2],
    521524              define_macros=[('GSL_DISABLE_DEPRECATED','1')]),
    522    
     525
    523526    Extension('sage.gsl.gsl_array',
    524527              sources = ['sage/gsl/gsl_array.pyx'],
    525528              libraries=['gsl', BLAS, BLAS2],
    526529              define_macros=[('GSL_DISABLE_DEPRECATED','1')]),
    527    
     530
    528531    Extension('sage.gsl.integration',
    529532              sources = ['sage/gsl/integration.pyx'],
    530533              define_macros=[('GSL_DISABLE_DEPRECATED','1')],
     
    532535
    533536    Extension('sage.gsl.interpolation',
    534537              sources = ['sage/gsl/interpolation.pyx'],
    535               libraries = ['gsl', BLAS, BLAS2], 
     538              libraries = ['gsl', BLAS, BLAS2],
    536539              define_macros=[('GSL_DISABLE_DEPRECATED','1')]),
    537    
     540
    538541    Extension('sage.gsl.ode',
    539542              sources = ['sage/gsl/ode.pyx'],
    540543              libraries=['gsl',BLAS, BLAS2],
    541544              define_macros=[('GSL_DISABLE_DEPRECATED','1')]),
    542    
     545
    543546    Extension('sage.gsl.probability_distribution',
    544547              sources = ['sage/gsl/probability_distribution.pyx'],
    545548              libraries=['gsl', BLAS, BLAS2],
    546549              define_macros=[('GSL_DISABLE_DEPRECATED','1')]),
    547550
    548551    ################################
    549     ## 
     552    ##
    550553    ## sage.interacts
    551554    ##
    552555    ################################
     
    556559              libraries = []),
    557560
    558561    ################################
    559     ## 
     562    ##
    560563    ## sage.libs
    561564    ##
    562565    ################################
     
    580583              include_dirs = [SAGE_INC + 'FLINT/'],
    581584              extra_compile_args=["-std=c99", "-D_XPG6"],
    582585              depends = flint_depends),
    583    
     586
    584587    Extension('sage.libs.fplll.fplll',
    585588              sources = ['sage/libs/fplll/fplll.pyx'],
    586589              libraries = ['gmp', 'mpfr', 'stdc++', 'fplll'],
     
    592595              sources = ['sage/libs/linbox/linbox.pyx'],
    593596              # For this to work on cygwin, linboxwrap *must* be
    594597              # before ntl.
    595               libraries = ['linboxsage', 'ntl', 'linbox', 
     598              libraries = ['linboxsage', 'ntl', 'linbox',
    596599                           'stdc++', 'givaro', 'gmp', 'gmpxx', BLAS, BLAS2],
    597600              language = 'c++'),
    598601
     
    604607              include_dirs = [SAGE_INC + "lcalc/"],
    605608              extra_compile_args=["-O3", "-ffast-math"],
    606609              language = 'c++'),
    607      
    608610
    609    
     611
     612
    610613    Extension('sage.libs.libecm',
    611614              sources = ['sage/libs/libecm.pyx'],
    612615              libraries = ['ecm', 'gmp'],
    613616              extra_link_args = uname_specific("Linux", ["-Wl,-z,noexecstack"],
    614617                                                        []),
    615618              depends = [SAGE_INC + "ecm.h"]),
    616      
     619
    617620    Extension('sage.libs.mwrank.mwrank',
    618621              sources = ["sage/libs/mwrank/mwrank.pyx",
    619622                         "sage/libs/mwrank/wrap.cc"],
     
    628631                         # IMHO "pari" could be removed here, but some people
    629632                         # claim it is needed on Cygwin (see #9896, #9914).
    630633                         # If so, we should use uname_specific(). -leif
    631    
     634
    632635    Extension('sage.libs.pari.gen',
    633636              sources = ["sage/libs/pari/gen.pyx"],
    634637              libraries = ['pari', 'gmp']),
    635    
     638
    636639    Extension('sage.libs.ppl',
    637640              sources = ['sage/libs/ppl.pyx', 'sage/libs/ppl_shim.cc'],
    638               libraries = ['ppl', 'gmpxx', 'gmp', 'm'], 
     641              libraries = ['ppl', 'gmpxx', 'gmp', 'm'],
    639642              language="c++",
    640643              depends = [SAGE_INC + "ppl.hh"]),
    641644
     
    643646              sources = ["sage/libs/ratpoints.pyx"],
    644647              depends = [SAGE_INC + 'ratpoints.h'],
    645648              libraries = ["ratpoints", "gmp"]),
    646    
     649
    647650    Extension('sage.libs.singular.singular',
    648651              sources = ['sage/libs/singular/singular.pyx'],
    649652              libraries = singular_libs,
    650653              language="c++",
    651654              include_dirs = [SAGE_INC + 'singular', SAGE_INC + 'factory'],
    652655              depends = singular_depends),
    653    
     656
    654657    Extension('sage.libs.singular.polynomial',
    655658              sources = ['sage/libs/singular/polynomial.pyx'],
    656659              libraries = singular_libs,
     
    711714        ###################################
    712715        ##
    713716        ## sage.libs.cremona
    714         ## 
     717        ##
    715718        ###################################
    716        
     719
    717720    Extension('sage.libs.cremona.homspace',
    718721              sources = ["sage/libs/cremona/homspace.pyx"],
    719722              libraries = ['g0nntl', 'jcntl', 'gmpxx', 'ntl', 'gmp',
     
    757760        ###################################
    758761        ##
    759762        ## sage.libs.ntl
    760         ## 
     763        ##
    761764        ###################################
    762    
     765
    763766    # NOTE: It is *very* important (for cygwin) that csage be the
    764767    # first library listed for all ntl extensions below.
    765768
     
    859862              language='c++'),
    860863
    861864    ################################
    862     ## 
     865    ##
    863866    ## sage.matrix
    864867    ##
    865868    ################################
    866869
    867870    Extension('sage.matrix.action',
    868871              sources = ['sage/matrix/action.pyx']),
    869    
     872
    870873    Extension('sage.matrix.change_ring',
    871874              sources = ['sage/matrix/change_ring.pyx'],
    872875              libraries=[BLAS, BLAS2, 'gmp'],
     
    884887
    885888    Extension('sage.matrix.matrix2',
    886889              sources = ['sage/matrix/matrix2.pyx']),
    887    
     890
    888891    Extension('sage.matrix.matrix_complex_double_dense',
    889892              sources = ['sage/matrix/matrix_complex_double_dense.pyx'],
    890893              libraries=[BLAS, BLAS2],
     
    898901
    899902    #Extension('sage.matrix.matrix_cyclo_sparse',
    900903    #          sources = ['sage/matrix/matrix_cyclo_sparse.pyx']),
    901    
     904
    902905    Extension('sage.matrix.matrix_dense',
    903906              sources = ['sage/matrix/matrix_dense.pyx']),
    904    
     907
    905908    #Extension('sage.matrix.matrix_domain_dense',
    906909    #          sources = ['sage/matrix/matrix_domain_dense.pyx']),
    907910
    908911    #Extension('sage.matrix.matrix_domain_sparse',
    909912    #          sources = ['sage/matrix/matrix_domain_sparse.pyx']),
    910              
     913
    911914    Extension('sage.matrix.matrix_double_dense',
    912915              sources = ['sage/matrix/matrix_double_dense.pyx'],
    913916              libraries=[BLAS, BLAS2],
     
    916919
    917920    Extension('sage.matrix.matrix_generic_dense',
    918921              sources = ['sage/matrix/matrix_generic_dense.pyx']),
    919    
     922
    920923    Extension('sage.matrix.matrix_generic_sparse',
    921924              sources = ['sage/matrix/matrix_generic_sparse.pyx']),
    922925
     
    979982
    980983    #Extension('sage.matrix.matrix_pid_dense',
    981984    #          sources = ['sage/matrix/matrix_pid_dense.pyx']),
    982              
     985
    983986    #Extension('sage.matrix.matrix_pid_sparse',
    984987    #          sources = ['sage/matrix/matrix_pid_sparse.pyx']),
    985988
    986989    Extension('sage.matrix.matrix_rational_dense',
    987990              sources = ['sage/matrix/matrix_rational_dense.pyx'],
    988991              libraries = ['pari', 'gmp']),
    989    
     992
    990993    Extension('sage.matrix.matrix_rational_sparse',
    991994              sources = ['sage/matrix/matrix_rational_sparse.pyx'],
    992995              libraries = ['gmp']),
    993    
     996
    994997    Extension('sage.matrix.matrix_real_double_dense',
    995998              sources = ['sage/matrix/matrix_real_double_dense.pyx'],
    996999              libraries=[BLAS, BLAS2],
     
    9991002
    10001003    Extension('sage.matrix.matrix_sparse',
    10011004              sources = ['sage/matrix/matrix_sparse.pyx']),
    1002    
     1005
    10031006    Extension('sage.matrix.matrix_symbolic_dense',
    10041007              sources = ['sage/matrix/matrix_symbolic_dense.pyx']),
    10051008
     
    10121015    Extension('sage.matrix.misc',
    10131016              sources = ['sage/matrix/misc.pyx'],
    10141017              libraries=['mpfr','gmp']),
    1015    
     1018
    10161019    Extension('sage.matrix.strassen',
    10171020              sources = ['sage/matrix/strassen.pyx']),
    1018                            
     1021
    10191022    #Extension('sage.matrix.padics.matrix_padic_capped_relative_dense',
    10201023    #          sources = ['sage/matrix/padics/matrix_padic_capped_relative_dense.pyx']),
    10211024
    10221025    ################################
    1023     ## 
     1026    ##
    10241027    ## sage.media
    10251028    ##
    10261029    ################################
    10271030
    10281031    Extension('sage.media.channels',
    1029               sources = ['sage/media/channels.pyx']), 
    1030    
     1032              sources = ['sage/media/channels.pyx']),
     1033
    10311034    ################################
    1032     ## 
     1035    ##
    10331036    ## sage.misc
    10341037    ##
    10351038    ################################
     
    10761079    Extension('sage.misc.randstate',
    10771080              sources = ['sage/misc/randstate.pyx'],
    10781081              libraries = ['gmp']),
    1079    
     1082
    10801083    Extension('sage.misc.refcount',
    10811084              sources = ['sage/misc/refcount.pyx']),
    10821085
     
    10851088
    10861089    Extension('sage.misc.sage_timeit_class',
    10871090              sources = ['sage/misc/sage_timeit_class.pyx']),
    1088    
     1091
    10891092    Extension('sage.misc.sagex_ds',
    10901093              sources = ['sage/misc/sagex_ds.pyx']),
    1091    
     1094
    10921095    Extension('sage.misc.search',
    10931096              sources = ['sage/misc/search.pyx']),
    10941097
     
    10961099              sources = ['sage/misc/session.pyx']),
    10971100
    10981101    ################################
    1099     ## 
     1102    ##
    11001103    ## sage.modular
    11011104    ##
    11021105    ################################
     
    11331136              libraries = ['gmp']),
    11341137
    11351138    ################################
    1136     ## 
     1139    ##
    11371140    ## sage.modules
    11381141    ##
    11391142    ################################
     
    11411144    Extension('sage.modules.free_module_element',
    11421145              sources = ['sage/modules/free_module_element.pyx'],
    11431146              depends = numpy_depends),
    1144    
     1147
    11451148    Extension('sage.modules.module',
    11461149              sources = ['sage/modules/module.pyx']),
    1147              
     1150
    11481151    Extension('sage.modules.vector_complex_double_dense',
    11491152              ['sage/modules/vector_complex_double_dense.pyx'],
    11501153              libraries = [BLAS, BLAS2],
     
    11561159              libraries = [BLAS, BLAS2],
    11571160              include_dirs = numpy_include_dirs,
    11581161              depends = numpy_depends),
    1159  
     1162
    11601163    Extension('sage.modules.vector_integer_dense',
    11611164              sources = ['sage/modules/vector_integer_dense.pyx'],
    11621165              libraries = ['gmp']),
     
    11691172              libraries = ['gmp','m4ri', 'png12', 'gd'],
    11701173              extra_compile_args = ['-std=c99'] + m4ri_extra_compile_args,
    11711174              depends = [SAGE_INC + "png.h", SAGE_INC + "m4ri/m4ri.h"]),
    1172    
     1175
    11731176    Extension('sage.modules.vector_rational_dense',
    11741177              sources = ['sage/modules/vector_rational_dense.pyx'],
    11751178              libraries = ['gmp']),
     
    11851188    #           libraries = ['gmp']),
    11861189
    11871190    ################################
    1188     ## 
     1191    ##
    11891192    ## sage.numerical
    11901193    ##
    11911194    ################################
     
    12081211              libraries=["csage", "stdc++", "glpk", "gmp", "z"]),
    12091212
    12101213    ################################
    1211     ## 
     1214    ##
    12121215    ## sage.plot
    12131216    ##
    12141217    ################################
     
    12171220              sources = ['sage/plot/complex_plot.pyx'],
    12181221              include_dirs = numpy_include_dirs,
    12191222              depends = numpy_depends),
    1220    
     1223
    12211224    Extension('sage.plot.plot3d.base',
    12221225              sources = ['sage/plot/plot3d/base.pyx'],
    12231226              extra_compile_args=["-std=c99"]),
    1224    
     1227
    12251228    Extension('sage.plot.plot3d.implicit_surface',
    12261229              sources = ['sage/plot/plot3d/implicit_surface.pyx'],
    12271230              libraries = ['gsl'],
    12281231              include_dirs = numpy_include_dirs,
    12291232              depends = numpy_depends),
    1230    
     1233
    12311234    Extension('sage.plot.plot3d.index_face_set',
    12321235              sources = ['sage/plot/plot3d/index_face_set.pyx'],
    12331236              extra_compile_args=["-std=c99"]),
    1234    
     1237
    12351238    Extension('sage.plot.plot3d.parametric_surface',
    12361239              sources = ['sage/plot/plot3d/parametric_surface.pyx']),
    12371240
     
    12421245              sources = ['sage/plot/plot3d/transform.pyx']),
    12431246
    12441247    ################################
    1245     ## 
     1248    ##
    12461249    ## sage.quadratic_forms
    12471250    ##
    12481251    ################################
     
    12551258              sources = ['sage/quadratic_forms/quadratic_form__evaluate.pyx']),
    12561259
    12571260    ################################
    1258     ## 
     1261    ##
    12591262    ## sage.rings
    12601263    ##
    12611264    ################################
     
    12821285    Extension('sage.rings.complex_double',
    12831286              sources = ['sage/rings/complex_double.pyx'],
    12841287              extra_compile_args=["-std=c99",  "-D_XPG6"],
    1285               libraries = (['gsl', BLAS, BLAS2, 'pari', 'gmp'] + 
     1288              libraries = (['gsl', BLAS, BLAS2, 'pari', 'gmp'] +
    12861289                           uname_specific('CYGWIN', ['mc', 'md'], []) +
    12871290                           ['m'])),
    12881291
     
    12971300
    12981301    Extension('sage.rings.integer',
    12991302              sources = ['sage/rings/integer.pyx'],
    1300               libraries=['ntl', 'pari', 'flint', 'gmp'], 
    1301               include_dirs = [SAGE_INC + 'FLINT/'], 
     1303              libraries=['ntl', 'pari', 'flint', 'gmp'],
     1304              include_dirs = [SAGE_INC + 'FLINT/'],
    13021305              depends = numpy_depends + flint_depends),
    13031306
    13041307    Extension('sage.rings.integer_ring',
    13051308              sources = ['sage/rings/integer_ring.pyx'],
    13061309              libraries=['ntl', 'gmp']),
    13071310
    1308     Extension('sage.rings.factorint', 
     1311    Extension('sage.rings.factorint',
    13091312              sources = ['sage/rings/factorint.pyx'],
    13101313              libraries=['gmp']),
    13111314
    13121315    Extension('sage.rings.fast_arith',
    13131316              sources = ['sage/rings/fast_arith.pyx'],
    1314               libraries=['pari','gmp','csage']), 
     1317              libraries=['pari','gmp','csage']),
    13151318
    13161319    Extension('sage.rings.fraction_field_element',
    13171320              sources = ['sage/rings/fraction_field_element.pyx']),
    1318    
     1321
    13191322    Extension('sage.rings.fraction_field_FpT',
    13201323              sources = ['sage/rings/fraction_field_FpT.pyx'],
    13211324              libraries = ["csage", "flint", "gmp", "gmpxx", "ntl", "zn_poly"],
    13221325              extra_compile_args=["-std=c99", "-D_XPG6"],
    13231326              include_dirs = [SAGE_INC + 'FLINT/'],
    13241327              depends = flint_depends),
    1325    
     1328
    13261329    Extension('sage.rings.laurent_series_ring_element',
    13271330              sources = ['sage/rings/laurent_series_ring_element.pyx']),
    13281331
     
    13821385        ################################
    13831386        ##
    13841387        ## sage.rings.finite_rings
    1385         ## 
     1388        ##
    13861389        ################################
    13871390
    13881391    Extension('sage.rings.finite_rings.finite_field_base',
     
    14091412        ################################
    14101413        ##
    14111414        ## sage.rings.function_field
    1412         ## 
     1415        ##
    14131416        ################################
    14141417
    14151418    Extension('sage.rings.function_field.function_field_element',
     
    14181421        ################################
    14191422        ##
    14201423        ## sage.rings.number_field
    1421         ## 
     1424        ##
    14221425        ################################
    14231426
    14241427    Extension('sage.rings.number_field.number_field_base',
     
    14331436              sources = ['sage/rings/number_field/number_field_element_quadratic.pyx'],
    14341437              libraries=['ntl', 'gmp'],
    14351438              language = 'c++'),
    1436  
     1439
    14371440    Extension('sage.rings.number_field.number_field_morphisms',
    14381441              sources = ['sage/rings/number_field/number_field_morphisms.pyx']),
    14391442
    14401443    Extension('sage.rings.number_field.totallyreal',
    14411444              sources = ['sage/rings/number_field/totallyreal.pyx'],
    14421445              libraries = ['pari', 'gmp']),
    1443    
     1446
    14441447    Extension('sage.rings.number_field.totallyreal_data',
    14451448              sources = ['sage/rings/number_field/totallyreal_data.pyx'],
    14461449              libraries = ['gmp'],
    14471450              depends = numpy_depends),
    1448    
     1451
    14491452        ################################
    14501453        ##
    14511454        ## sage.rings.padics
    1452         ## 
     1455        ##
    14531456        ################################
    1454    
     1457
    14551458    Extension('sage.rings.padics.local_generic_element',
    14561459              sources = ['sage/rings/padics/local_generic_element.pyx']),
    1457    
     1460
    14581461    Extension('sage.rings.padics.padic_base_coercion',
    14591462              sources = ['sage/rings/padics/padic_base_coercion.pyx'],
    14601463              libraries=['gmp']),
    1461    
     1464
    14621465    Extension('sage.rings.padics.padic_base_generic_element',
    14631466              sources = ['sage/rings/padics/padic_base_generic_element.pyx'],
    14641467              libraries=['gmp']),
    1465    
     1468
    14661469    Extension('sage.rings.padics.padic_capped_absolute_element',
    14671470              sources = ['sage/rings/padics/padic_capped_absolute_element.pyx'],
    14681471              libraries=['gmp']),
    1469    
     1472
    14701473    Extension('sage.rings.padics.padic_capped_relative_element',
    14711474              sources = ['sage/rings/padics/padic_capped_relative_element.pyx'],
    14721475              libraries=['gmp', 'csage']),
    1473    
     1476
    14741477    Extension('sage.rings.padics.padic_ext_element',
    14751478              sources = ['sage/rings/padics/padic_ext_element.pyx'],
    14761479              libraries=['ntl', 'gmp', 'csage', 'gmpxx', 'm', 'stdc++'],
    14771480              language='c++'),
    1478    
     1481
    14791482    Extension('sage.rings.padics.padic_fixed_mod_element',
    14801483              sources = ['sage/rings/padics/padic_fixed_mod_element.pyx'],
    14811484              libraries=['gmp']),
    1482    
     1485
    14831486    Extension('sage.rings.padics.padic_generic_element',
    14841487              sources = ['sage/rings/padics/padic_generic_element.pyx'],
    14851488              libraries=['gmp']),
    1486    
     1489
    14871490    Extension('sage.rings.padics.padic_printing',
    14881491              sources = ['sage/rings/padics/padic_printing.pyx'],
    14891492              libraries=['gmp', 'ntl', 'csage', 'gmpxx', 'm', 'stdc++'],
    14901493              language='c++'),
    1491    
     1494
    14921495    Extension('sage.rings.padics.padic_ZZ_pX_CA_element',
    14931496              sources = ['sage/rings/padics/padic_ZZ_pX_CA_element.pyx'],
    14941497              libraries = ['ntl', 'gmp', 'csage','gmpxx','m','stdc++'],
    14951498              language='c++'),
    1496    
     1499
    14971500    Extension('sage.rings.padics.padic_ZZ_pX_CR_element',
    14981501              sources = ['sage/rings/padics/padic_ZZ_pX_CR_element.pyx'],
    14991502              libraries=['ntl', 'gmp', 'csage','gmpxx','m','stdc++'],
    15001503              language='c++'),
    1501    
     1504
    15021505    Extension('sage.rings.padics.padic_ZZ_pX_element',
    15031506              sources = ['sage/rings/padics/padic_ZZ_pX_element.pyx'],
    15041507              libraries=['ntl', 'gmp', 'csage', 'gmpxx', 'm', 'stdc++'],
    15051508              language='c++'),
    1506    
     1509
    15071510    Extension('sage.rings.padics.padic_ZZ_pX_FM_element',
    15081511              sources = ['sage/rings/padics/padic_ZZ_pX_FM_element.pyx'],
    15091512              libraries=['ntl', 'gmp', 'csage', 'gmpxx', 'm', 'stdc++'],
    15101513              language='c++'),
    1511    
     1514
    15121515    Extension('sage.rings.padics.pow_computer',
    15131516              sources = ['sage/rings/padics/pow_computer.pyx'],
    15141517              libraries = ["csage", "ntl", "gmp", "gmpxx", "m", "stdc++"],
    15151518              language='c++'),
    1516    
     1519
    15171520    Extension('sage.rings.padics.pow_computer_ext',
    15181521              sources = ['sage/rings/padics/pow_computer_ext.pyx'],
    15191522              libraries = ["csage", "ntl", "gmp", "gmpxx", "m", "stdc++"],
     
    15221525        ################################
    15231526        ##
    15241527        ## sage.rings.polynomial
    1525         ## 
     1528        ##
    15261529        ################################
    1527    
     1530
    15281531    Extension('sage.rings.polynomial.cyclotomic',
    1529               sources = ['sage/rings/polynomial/cyclotomic.pyx']), 
     1532              sources = ['sage/rings/polynomial/cyclotomic.pyx']),
    15301533
    15311534    Extension('sage.rings.polynomial.laurent_polynomial',
    15321535              sources = ['sage/rings/polynomial/laurent_polynomial.pyx']),
    15331536
    15341537    Extension('sage.rings.polynomial.multi_polynomial',
    1535               sources = ['sage/rings/polynomial/multi_polynomial.pyx']), 
     1538              sources = ['sage/rings/polynomial/multi_polynomial.pyx']),
    15361539
    15371540    Extension('sage.rings.polynomial.multi_polynomial_ideal_libsingular',
    15381541              sources = ['sage/rings/polynomial/multi_polynomial_ideal_libsingular.pyx'],
     
    15561559              depends = singular_depends),
    15571560
    15581561    Extension('sage.rings.polynomial.multi_polynomial_ring_generic',
    1559               sources = ['sage/rings/polynomial/multi_polynomial_ring_generic.pyx']), 
     1562              sources = ['sage/rings/polynomial/multi_polynomial_ring_generic.pyx']),
    15601563
    15611564    Extension('sage.rings.polynomial.polydict',
    15621565              sources = ['sage/rings/polynomial/polydict.pyx']),
     
    16381641              sources = ['sage/rings/polynomial/symmetric_reduction.pyx']),
    16391642
    16401643    ################################
    1641     ## 
     1644    ##
    16421645    ## sage.schemes
    16431646    ##
    16441647    ################################
     
    16551658    Extension('sage.schemes.generic.toric_divisor_class',
    16561659              sources = ['sage/schemes/generic/toric_divisor_class.pyx'],
    16571660              libraries = ['gmp']),
    1658              
     1661
    16591662    Extension('sage.schemes.hyperelliptic_curves.hypellfrob',
    16601663              sources = ['sage/schemes/hyperelliptic_curves/hypellfrob.pyx',
    16611664                         'sage/schemes/hyperelliptic_curves/hypellfrob/hypellfrob.cpp',
     
    16701673                              'sage/schemes/hyperelliptic_curves/hypellfrob/']),
    16711674
    16721675    ################################
    1673     ## 
     1676    ##
    16741677    ## sage.sets
    16751678    ##
    16761679    ################################
     
    16831686              depends = flint_depends),
    16841687
    16851688    ################################
    1686     ## 
     1689    ##
    16871690    ## sage.stats
    16881691    ##
    16891692    ################################
     
    16931696
    16941697    Extension('sage.stats.hmm.distributions',
    16951698              sources = ['sage/stats/hmm/distributions.pyx']),
    1696    
     1699
    16971700    Extension('sage.stats.hmm.hmm',
    16981701              sources = ['sage/stats/hmm/hmm.pyx']),
    16991702
    17001703    Extension('sage.stats.hmm.chmm',
    17011704              sources = ['sage/stats/hmm/chmm.pyx'],
    17021705              extra_compile_args=["-std=c99"]),
    1703    
     1706
    17041707    Extension('sage.stats.intlist',
    17051708              sources = ['sage/stats/intlist.pyx']),
    17061709
    17071710    ################################
    1708     ## 
     1711    ##
    17091712    ## sage.structure
    17101713    ##
    17111714    ################################
     
    17361739
    17371740    Extension('sage.structure.mutability',
    17381741              sources = ['sage/structure/mutability.pyx']),
    1739    
     1742
    17401743    Extension('sage.structure.parent',
    17411744              sources = ['sage/structure/parent.pyx']),
    17421745
    17431746    Extension('sage.structure.parent_base',
    17441747              sources = ['sage/structure/parent_base.pyx']),
    1745    
     1748
    17461749    Extension('sage.structure.parent_gens',
    17471750              sources = ['sage/structure/parent_gens.pyx']),
    17481751
     
    17561759              sources = ['sage/structure/wrapper_parent.pyx']),
    17571760
    17581761    ################################
    1759     ## 
     1762    ##
    17601763    ## sage.symbolic
    17611764    ##
    17621765    ################################
     
    17711774              language = 'c++',
    17721775              depends = ginac_depends,
    17731776              libraries = ["pynac", "gmp"]),
    1774    
     1777
    17751778    Extension('sage.symbolic.getitem',
    17761779              sources = ['sage/symbolic/getitem.pyx'],
    17771780              language = 'c++',
    17781781              depends = [SAGE_LOCAL + "/include/pynac/ginac.h"],
    17791782              libraries = ["pynac", "gmp"]),
    1780    
     1783
    17811784    Extension('sage.symbolic.function',
    17821785              sources = ['sage/symbolic/function.pyx'],
    17831786              language = 'c++',
     
    17881791              sources = ['sage/symbolic/power_helper.pyx'],
    17891792              depends = ginac_depends,
    17901793              language = 'c++'),
    1791    
     1794
    17921795    Extension('sage.symbolic.pynac',
    17931796              sources = ['sage/symbolic/pynac.pyx'],
    17941797              language = 'c++',
    17951798              depends = ginac_depends,
    17961799              libraries = ["pynac", "gmp", "gsl"]),
    1797    
     1800
    17981801    Extension('sage.symbolic.ring',
    17991802              sources = ['sage/symbolic/ring.pyx'],
    18001803              language = 'c++',
     
    18021805              libraries = ["pynac", "gmp"]),
    18031806
    18041807    ################################
    1805     ## 
     1808    ##
    18061809    ## sage.tests
    18071810    ##
    18081811    ################################
     
    18101813              sources = ['sage/tests/interrupt.pyx', 'sage/tests/c_lib.c']),
    18111814
    18121815    Extension('sage.tests.stl_vector',
    1813               sources = ['sage/tests/stl_vector.pyx'], 
     1816              sources = ['sage/tests/stl_vector.pyx'],
    18141817              language = 'c++'),
    1815    
     1818
    18161819    Extension('sage.tests.cython',
    18171820              sources = ['sage/tests/cython.pyx']),
    1818    
     1821
    18191822    ]
    18201823
    18211824# Optional extensions :
     
    18251828from sage.misc.package import is_package_installed
    18261829
    18271830
    1828 if (os.path.isfile(SAGE_INC + "gurobi_c.h") and                                                                                                                                                                                   
     1831if (os.path.isfile(SAGE_INC + "gurobi_c.h") and
    18291832    os.path.isfile(SAGE_LOCAL + "/lib/libgurobi.so")):
    18301833    ext_modules.append(
    18311834        Extension("sage.numerical.backends.gurobi_backend",
     
    18361839        )
    18371840
    18381841
    1839 if (os.path.isfile(SAGE_INC + "cplex.h") and                                                                                                                                                                                   
     1842if (os.path.isfile(SAGE_INC + "cplex.h") and
    18401843    os.path.isfile(SAGE_LOCAL + "/lib/libcplex.a")):
    18411844    ext_modules.append(
    1842         Extension("sage.numerical.backends.cplex_backend",                                                                                                                                                                                   
    1843                   ["sage/numerical/backends/cplex_backend.pyx"],                                                                                                                                                                             
    1844                   include_dirs = [SAGE_INC, "sage/c_lib/include/"],                                                                                                                                                       
    1845                   language = 'c',                                                                                                                                                                                                             
    1846                   libraries = ["csage", "stdc++", "cplex"]) 
     1845        Extension("sage.numerical.backends.cplex_backend",
     1846                  ["sage/numerical/backends/cplex_backend.pyx"],
     1847                  include_dirs = [SAGE_INC, "sage/c_lib/include/"],
     1848                  language = 'c',
     1849                  libraries = ["csage", "stdc++", "cplex"])
    18471850        )
    18481851
    18491852if is_package_installed('cbc'):
    18501853    ext_modules.append(
    1851         Extension("sage.numerical.backends.coin_backend",                                                                                                                                                                                     
     1854        Extension("sage.numerical.backends.coin_backend",
    18521855                  ["sage/numerical/backends/coin_backend.pyx"],
    18531856                  include_dirs = [SAGE_INC, "sage/c_lib/include/"],
    18541857                  language = 'c++',
  • sage/functions/all.py

    diff --git a/sage/functions/all.py b/sage/functions/all.py
    a b  
    11from piecewise import piecewise, Piecewise
    22
    3 from trig import ( sin, cos, sec, csc, cot, tan, 
     3from trig import ( sin, cos, sec, csc, cot, tan,
    44                   asin, acos, atan,
    55                   acot, acsc, asec,
    6                    arcsin, arccos, arctan, 
     6                   arcsin, arccos, arctan,
    77                   arccot, arccsc, arcsec,
    88                   arctan2, atan2)
    99
    1010from hyperbolic import ( tanh, sinh, cosh, coth, sech, csch,
    11                          asinh, acosh, atanh, acoth, asech, acsch, 
     11                         asinh, acosh, atanh, acoth, asech, acsch,
    1212                         arcsinh, arccosh, arctanh, arccoth, arcsech, arccsch )
    1313
    1414reciprocal_trig_functions = {'sec': cos, 'csc': sin, 'cot': tan, 'sech': cosh, 'csch': sinh, 'coth': tanh}
     
    2626
    2727from transcendental import (exponential_integral_1,
    2828                            zeta, zetaderiv, zeta_symmetric,
    29                             Li, Ei, 
     29                            Li, Ei,
    3030                            dickman_rho)
    3131
    3232from special import (bessel_I, bessel_J, bessel_K, bessel_Y,
     
    3939                     elliptic_f, elliptic_ec, elliptic_eu,
    4040                     elliptic_kc, elliptic_pi, elliptic_j,
    4141                     airy_ai, airy_bi)
    42                        
     42
    4343from orthogonal_polys import (chebyshev_T,
    4444                              chebyshev_U,
    4545                              gen_laguerre,
     
    5555
    5656from spike_function import spike_function
    5757
    58 from prime_pi import prime_pi
     58from prime_pi import legendre_phi, partial_sieve_function, prime_pi
    5959
    6060from wigner import (wigner_3j, clebsch_gordan, racah, wigner_6j,
    6161                    wigner_9j, gaunt)
    6262
    63 from generalized import (dirac_delta, heaviside, unit_step, sgn, sign, 
     63from generalized import (dirac_delta, heaviside, unit_step, sgn, sign,
    6464                         kronecker_delta)
    6565
    6666from min_max import max_symbolic, min_symbolic
  • sage/functions/prime_pi.pyx

    diff --git a/sage/functions/prime_pi.pyx b/sage/functions/prime_pi.pyx
    a b  
    22Counting Primes
    33
    44AUTHORS:
    5     * R. Andrew Ohana
    6     * William Stein
    75
    8 TESTS::
     6- \R. Andrew Ohana (2009): initial version of efficient prime_pi
     7
     8- William Stein (2009): fix plot method
     9
     10- \R. Andrew Ohana (2011): complete rewrite, ~5x speedup
     11
     12EXAMPLES::
    913
    1014    sage: z = sage.functions.prime_pi.PrimePi()
    1115    sage: loads(dumps(z))
    12     Function that counts the number of primes up to x
     16    prime_pi
    1317    sage: loads(dumps(z)) == z
    1418    True
    1519"""
    1620
    1721#*****************************************************************************
    18 #       Copyright (C) 2009 R. Andrew Ohana <ohanar@u.washington.edu>
     22#       Copyright (C) 2009,2011 R. Andrew Ohana <andrew.ohana@gmail.com>
    1923#       Copyright (C) 2009 William Stein <wstein@gmail.com>
    2024#
    2125#  Distributed under the terms of the GNU General Public License (GPL)
     26#  as published by the Free Software Foundation; either version 2 of
     27#  the License, or (at your option) any later version.
    2228#                  http://www.gnu.org/licenses/
    2329#*****************************************************************************
    2430
    25 include '../ext/cdefs.pxi'
    26 include '../ext/stdsage.pxi'
     31include '../ext/stdsage.pxi'
    2732include '../ext/interrupt.pxi'
     33include '../libs/pari/decl.pxi' # also declares diffptr (as extern char* [sic!])
    2834
    29 from sage.rings.integer import Integer
    30 from sage.rings.fast_arith import prime_range
    31 import sage.plot.all
     35from libc.stdint cimport int_fast8_t, uint_fast16_t, \
     36                         uint8_t, uint32_t, uint64_t
     37from cython.parallel import prange
     38from sage.rings.integer cimport Integer
     39from sage.libs.all import pari
     40from sage.symbolic.function cimport BuiltinFunction
     41from other import floor
    3242
    33 cdef extern from "math.h":
    34     double sqrt(double)
    35     double floor(double)
    36     float sqrtf(float)
    37     float floorf(float)
     43cdef extern from "pari/pari.h":
     44    cdef void NEXT_PRIME_VIADIFF(uint32_t, uint8_t *)
     45    # Note that this is a generic (i.e. polymorphic) and somewhat ill-defined
     46    # PARI macro (as it uses some kind of "call by name"), whose true signature
     47    # cannot be expressed by a C prototype declaration, since its first para-
     48    # meter can be of any (integral) number type, and both parameters are
     49    # effectively passed *by reference* (i.e., get altered).
     50    # We here use uint32_t for the first argument, while in effect a reference
     51    # to a uint32_t is passed. Declaring it more correctly with uint32_t* as
     52    # the type of its first parameter (and uint8_t** as the type of the second)
     53    # would require changing the macro definition.
    3854
    39 cdef inline long sqrt_longlong(long long N) except -1:
    40     """
    41     Return the truncated integer part of the square root of N, i.e., the
    42     floor of sqrt(N).
    43     """
    44     # code from Bill Hart.
    45     cdef long long m = <long> floor(sqrt(<double> N))
    46     cdef long long res = m + ((m+1)*(m+1) <= N)  # add 1 if too small.
    47     res = res - (res*res > N)  # subtract 1 if too big.
    48     if res*res <= N and (res+1)*(res+1) > N:
    49         return res
    50     else:
    51         raise RuntimeError, "there is a bug in prime_pi.pyx's sqrt_longlong (res=%s, N=%s). Please report!"%(res,N)
     55cdef uint64_t arg_to_uint64(x, str s1, str s2) except -1:
     56    if not isinstance(x, Integer):
     57        x = Integer(floor(x))
     58    if mpz_sgn((<Integer>x).value) <= 0:
     59        return 0ull
     60    if mpz_sizeinbase((<Integer>x).value, 2) > 63:
     61        raise NotImplementedError("computation of " + s1 + " for x >= " + \
     62            "2^63 is not implemented")
     63    if mpz_sizeinbase((<Integer>x).value, 2) > 43:
     64        import warnings
     65        warnings.warn("computation of %s for large x can take minutes, "%s1 \
     66            + "hours, or days depending on the size of %s"%s2)
     67        if mpz_sizeinbase((<Integer>x).value, 2) > 50:
     68            warnings.warn("computation of %s for x >= 2^50 has not "%s1 \
     69                + "been as thoroughly tested as for smaller values")
     70    return mpz_get_ui((<Integer>x).value)
    5271
    53 cdef inline long sqrt_long(long N) except -1:   
    54     """
    55     Return the truncated integer part of the square root of N, i.e., the
    56     floor of sqrt(N).
    57     """
    58     if sizeof(long) == 8:
    59         return sqrt_longlong(N)
    60     # code from Bill Hart.
    61     cdef long m = <long> floorf(sqrtf(<float> N))
    62     cdef long res = m + ((m+1)*(m+1) <= N)  # add 1 if too small.
    63     res = res - (res*res > N)  # subtract 1 if too big.
    64     if res*res <= N and (res+1)*(res+1) > N:
    65         return res
    66     else:
    67         raise RuntimeError, "there is a bug in prime_pi.pyx's sqrt_long (res=%s, N=%s). Please report!"%(res,N)
    68    
     72cdef class PrimePi(BuiltinFunction):
     73    def __init__(self):
     74        r"""
     75        The prime counting function, which counts the number of primes less
     76        than or equal to a given value.
    6977
    70 cdef class PrimePi:
    71     r"""
    72     Return the number of primes $\leq x$.
     78        INPUT:
    7379
    74     EXAMPLES::
    75    
    76         sage: prime_pi(7)
    77         4
    78         sage: prime_pi(100)
    79         25
    80         sage: prime_pi(1000)
    81         168
    82         sage: prime_pi(100000)
    83         9592
    84         sage: prime_pi(0.5)
    85         0
    86         sage: prime_pi(-10)
    87         0
    88         sage: prime_pi(500509)
    89         41581
    90    
    91     The following test is to verify that ticket #4670 has been essentially
    92     resolved::
    93        
    94         sage: prime_pi(10**10)
    95         455052511
    96        
    97     The prime_pi function allows for use of additional memory::
    98    
    99         sage: prime_pi(500509, 8)
    100         41581
     80        - ``x`` - a real number
     81        - ``prime_bound`` - (default 0) a real number < 2^32, ``prime_pi`` will
     82          make sure to use all the primes up to ``prime_bound`` (although,
     83          possibly more) in computing ``prime_pi``, this can potentially
     84          speedup the time of computation, at a cost to memory usage.
    10185
    102     The prime_pi function also has a special plotting method, so it plots
    103     quickly and perfectly as a step function::
    104    
    105         sage: P = plot(prime_pi, 50,100)
    106     """
    107     def __repr__(self):
     86        OUTPUT:
     87
     88        integer -- the number of primes :math:`\leq` ``x``
     89
     90        EXAMPLES:
     91
     92        These examples test common inputs::
     93
     94            sage: prime_pi(7)
     95            4
     96            sage: prime_pi(100)
     97            25
     98            sage: prime_pi(1000)
     99            168
     100            sage: prime_pi(100000)
     101            9592
     102            sage: prime_pi(500509)
     103            41581
     104
     105        These examples test a variety of odd inputs::
     106
     107            sage: prime_pi(3.5)
     108            2
     109            sage: prime_pi(sqrt(2357))
     110            15
     111            sage: prime_pi(mod(30957, 9750979))
     112            3337
     113
     114        We test non-trivial ``prime_bound`` values::
     115
     116            sage: prime_pi(100000, 10000)
     117            9592
     118            sage: prime_pi(500509, 50051)
     119            41581
     120
     121        The following test is to verify that ticket #4670 has been essentially
     122        resolved::
     123
     124            sage: prime_pi(10^10)
     125            455052511
     126
     127        The ``prime_pi`` function also has a special plotting method, so it
     128        plots quickly and perfectly as a step function::
     129
     130            sage: P = plot(prime_pi, 50, 100)
     131
     132        NOTES:
     133
     134        Uses a recursive implementation, using the optimizations described in
     135        [RAO2011]_.
     136
     137        REFERENCES:
     138
     139        .. [RAO2011] R.A. Ohana. On Prime Counting in Abelian Number Fields.
     140           http://wstein.org/home/ohanar/papers/abelian_prime_counting/main.pdf.
     141
     142        AUTHOR:
     143
     144        - \R. Andrew Ohana (2011)
    108145        """
    109         EXAMPLES::
    110        
    111             sage: prime_pi.__repr__()
    112             'Function that counts the number of primes up to x'
    113         """
    114         return 'Function that counts the number of primes up to x'
     146        super(PrimePi, self).__init__('prime_pi', latex_name=r"\pi", \
     147                conversions=dict( \
     148                mathematica='PrimePi', \
     149                pari='primepi'))
    115150
    116     def __cmp__(self, other):
    117         """
    118         EXAMPLES::
    119        
    120             sage: P = sage.functions.prime_pi.PrimePi()
    121             sage: P == prime_pi
    122             True
    123             sage: P != prime_pi
    124             False
    125         """
    126         if isinstance(other, PrimePi):
    127             return 0
    128         return cmp(type(self), type(other))
     151    cdef uint32_t *__primes, __numPrimes, __maxSieve, __primeBound
     152    cdef int_fast8_t *__tabS
     153    cdef uint_fast16_t *__smallPi
     154    cdef uint8_t *__pariPrimePtr
    129155
    130     cdef long* primes
    131     cdef long primeCount, maxPrime
     156    def __dealloc__(self):
     157        if self.__smallPi != NULL:
     158            sage_free(self.__smallPi)
     159            sage_free(self.__tabS)
    132160
    133     def __call__(self, long long x, long mem_mult = 1):
     161    cdef void __init_tables(self):
     162        pari.init_primes(65546)
     163        self.__pariPrimePtr = <uint8_t *>diffptr
     164        self.__smallPi = <uint_fast16_t *>sage_malloc(65536 * \
     165            sizeof(uint_fast16_t))
     166        cdef uint32_t p=0u, i=0u, k=0u
     167        while p < 65536u:
     168            NEXT_PRIME_VIADIFF(p, self.__pariPrimePtr)
     169            while i < p and i < 65556u:
     170                self.__smallPi[i] = k
     171                i += 1u
     172            k += 1u
     173
     174        self.__tabS = <int_fast8_t *>sage_malloc(2310*sizeof(int_fast8_t))
     175        for i in range(2310u):
     176            self.__tabS[i] = (i+1u)/2u - (i+3u)/6u - (i+5u)/10u + (i+15u)/30u \
     177                - (i+7u)/14u + (i+21u)/42u + (i+35u)/70u - (i+105u)/210u \
     178                - (i+11u)/22u + (i+33u)/66u + (i+55u)/110u + (i+77u)/154u \
     179                - (i+165u)/330u - (i+231u)/462u - (i+385u)/770u \
     180                + (i+1155u)/2310u - ((i/77u)<<4u)
     181
     182
     183    def __call__(self, *args, coerce=True, hold=False):
    134184        r"""
    135185        EXAMPLES::
    136186
    137             sage: prime_pi.__call__(7)
     187            sage: prime_pi.__call__(756)
     188            133
     189            sage: prime_pi.__call__(6574, 577)
     190            850
     191            sage: f(x) = prime_pi.__call__(x^2); f(x)
     192            prime_pi(x^2)
     193            sage: f(5)
     194            9
     195            sage: prime_pi.__call__(1, 2, 3)
     196            Traceback (most recent call last):
     197            ...
     198            TypeError: Symbolic function prime_pi takes 1 or 2 arguments (3 given)
     199        """
     200        if len(args) > 2:
     201            raise TypeError("Symbolic function %s takes 1 or 2"%self._name \
     202                    + " arguments (%s given)"%len(args))
     203        else:
     204            self.__primeBound = 0u if len(args) < 2 else args[1]
     205        return super(PrimePi, self).__call__(args[0], coerce=coerce, hold=hold)
     206
     207    def _eval_(self, x):
     208        r"""
     209        EXAMPLES::
     210
     211            sage: prime_pi._eval_(7)
    138212            4
    139             sage: prime_pi.__call__(100)
     213            sage: prime_pi._eval_(100)
    140214            25
    141             sage: prime_pi.__call__(1000)
     215            sage: prime_pi._eval_(1000)
    142216            168
    143             sage: prime_pi.__call__(100000)
     217            sage: prime_pi._eval_(100000)
    144218            9592
    145             sage: prime_pi.__call__(0.5)
     219            sage: prime_pi._eval_(500509)
     220            41581
     221            sage: prime_pi._eval_(3.5)
     222            2
     223            sage: prime_pi._eval_(sqrt(2357))
     224            15
     225            sage: prime_pi._eval_(str(-2^100))
    146226            0
    147             sage: prime_pi.__call__(-10)
    148             0
    149             sage: prime_pi.__call__(500509)
    150             41581
    151             sage: prime_pi.__call__(500509, 8)
    152             41581
     227            sage: prime_pi._eval_(mod(30957, 9750979))
     228            3337
    153229
    154         TESTS:
     230        Make sure we actually compute correct results for 64-bit entries::
    155231
    156         Make sure we actually compute correct results::
    157 
    158             sage: for n in (30..40): print prime_pi(2**n)  # long time (22s on sage.math, 2011)
    159             54400028
    160             105097565
     232            sage: for i in (32..42): prime_pi(2^i) # long time (13s on sage.math, 2011)
    161233            203280221
    162234            393615806
    163235            762939111
     
    167239            10866266172
    168240            21151907950
    169241            41203088796
     242            80316571436
     243            156661034233
    170244
    171         We know this implementation is broken at least on some 32-bit
    172         systems for `2^{46}`, so we are capping the maximum allowed value::
     245        This implementation uses unsigned 64-bit ints and does not support
     246        :math:`x \geq 2^63`::
    173247
    174             sage: prime_pi(2^40+1)
     248            sage: prime_pi(2^63)
    175249            Traceback (most recent call last):
    176250            ...
    177             NotImplementedError: computation of prime_pi() greater than 2^40 not implemented
     251            NotImplementedError: computation of prime_pi for x >= 2^63 is not implemented
     252        """
     253        cdef uint64_t z
     254        try:
     255            z = arg_to_uint64(x, 'prime_pi', 'x')
     256        except NotImplementedError, msg:
     257            raise NotImplementedError(msg)
     258        except TypeError:
     259            return None
     260        if self.__smallPi == NULL:
     261            self.__init_tables()
     262        z = self.__pi(z, self.__primeBound)
     263        self.__clean_cache()
     264        return Integer(z)
    178265
     266    cdef uint64_t __pi(self, uint64_t x, uint64_t b) except -1:
     267        r"""
     268        Returns pi(x) under the assumption that 0 <= x < 2^64
    179269        """
    180         if mem_mult < 1:
    181             raise ValueError, "mem_mult must be positive"
    182         if x < 2:
    183             return 0
    184         if x > 1099511627776L:
    185             raise NotImplementedError, "computation of prime_pi() greater than 2^40 not implemented"
    186         x += x & 1
    187         # m_max is the current sieving value, for prime counting - this value is sqrt(x)
    188         cdef long m_max = sqrt_longlong(x) + 1
    189         cdef long prime
    190         cdef long i = 0
    191         # mem_mult is the multiplier that determines how large a list of primes built
    192         tempList = prime_range(mem_mult*m_max)
    193         self.primeCount = len(tempList)
    194         if self.primeCount > 1:
    195             self.maxPrime = tempList[self.primeCount - 1]
    196         self.primes = <long*> sage_malloc(self.primeCount*sizeof(long))
    197         for prime in tempList:
    198             self.primes[i] = prime
    199             i += 1
    200         sig_on()
    201         s = Integer(self.prime_phi_large(x, m_max))
     270        if x < 65536ull: return self.__smallPi[x]
     271        if b*b < x:
     272            b = floor(Integer(x).sqrt())
     273        elif b > x:
     274            b = x
     275        self.__init_primes(b)
     276        if not sig_on_no_except():
     277            self.__clean_cache()
     278            cython_check_exception()
     279        b = self.__numPrimes
     280        b += self.__phi_parallel(x, b)-1ull
    202281        sig_off()
    203         sage_free(self.primes)
     282        return b
     283
     284    cdef uint32_t __cached_count(self, uint32_t p) nogil:
     285        r"""
     286        For p < 65536, returns the value stored in ``self.__smallPi[p]``. For
     287        p <= ``self.__maxSieve``, uses a binary seach on ``self.__primes`` to
     288        compute pi(p).
     289        """
     290        # inspired by Yann Laigle-Chapuy's suggestion
     291        if p < 65536u: return self.__smallPi[p]
     292        cdef uint32_t size = (self.__numPrimes)>>1u
     293        # Use the expected density of primes for expected inputs to make an
     294        # educated guess
     295        if p>>3u < size:
     296            size = p>>3u
     297        # deal with edge case separately
     298        elif p >= self.__primes[self.__numPrimes-1u]:
     299            return self.__numPrimes
     300        cdef uint32_t pos = size
     301        cdef uint32_t prime
     302        while size:
     303            prime = self.__primes[pos]
     304            size >>= 1u
     305            if prime < p: pos += size
     306            elif prime > p: pos -= size
     307            else: return pos+1u
     308        if self.__primes[pos] <= p:
     309            while self.__primes[pos] <= p: pos += 1u
     310            return pos
     311        while self.__primes[pos] > p: pos -= 1u
     312        return pos+1u
     313
     314    cdef void __clean_cache(self):
     315        if self.__numPrimes:
     316            sage_free(self.__primes)
     317            self.__numPrimes = 0u
     318            self.__maxSieve = 0u
     319
     320    cdef uint64_t __init_primes(self, uint32_t b) except -1:
     321        """
     322        Populates ``self.__primes`` with all primes < b
     323        """
     324        cdef uint32_t *prime, newNumPrimes, i
     325        pari.init_primes(b+1u)
     326        self.__pariPrimePtr = <uint8_t *>diffptr
     327        newNumPrimes = self.__pi(b, 0ull)
     328        if self.__numPrimes:
     329            prime = <uint32_t *>sage_realloc(self.__primes, newNumPrimes \
     330                * sizeof(uint32_t))
     331        else:
     332            prime = <uint32_t *>sage_malloc(newNumPrimes*sizeof(uint32_t))
     333        if not sig_on_no_except():
     334            self.__numPrimes = newNumPrimes
     335            self.__clean_cache()
     336            cython_check_exception()
     337        if prime == NULL:
     338            raise RuntimeError("not enough memory, maybe try with a smaller " \
     339                + "prime_bound?")
     340        self.__primes = prime
     341        prime += self.__numPrimes
     342        for i in range(self.__numPrimes, newNumPrimes):
     343            prime[0] = 0u if prime == self.__primes else prime[-1]
     344            NEXT_PRIME_VIADIFF(prime[0], self.__pariPrimePtr)
     345            prime += 1
     346        self.__numPrimes = newNumPrimes
     347        self.__maxSieve = b
     348        sig_off()
     349
     350    cdef uint64_t __phi_parallel(self, uint64_t x, uint64_t i):
     351        if not i: return x
     352        # explicitly compute for small i
     353        cdef uint64_t s = (x+1ull)>>1ull
     354        if i == 1ull: return s
     355        s -= (x+3ull)/6ull
     356        if i == 2ull: return s
     357        s -= (x+5ull)/10ull - (x+15ull)/30ull
     358        if i == 3ull: return s
     359        s -= (x+7ull)/14ull - (x+21ull)/42ull - (x+35ull)/70ull + \
     360            (x+105ull)/210ull
     361        if i == 4ull: return s
     362        s -= (x+11ull)/22ull - (x+33ull)/66ull - (x+55ull)/110ull - \
     363            (x+77ull)/154ull + (x+165ull)/330ull + (x+231ull)/462ull + \
     364            (x+385ull)/770ull - (x+1155ull)/2310ull
     365        if i == 5ull: return s
     366        cdef uint64_t y, j
     367        cdef uint64_t prime
     368        cdef uint64_t *phis
     369        phis = <uint64_t *>sage_malloc(i*sizeof(uint64_t))
     370        for j in prange(5, i, nogil=True, schedule=static):
     371            prime = self.__primes[j]
     372            y = x/prime
     373            if y > 0xffffffffull:
     374                phis[j] = self.__phi(y, j)
     375            elif y > (<uint64_t>self.__maxSieve):
     376                phis[j] = self.__phi32(y, j)
     377            else:
     378                prime = (&prime)[-1]
     379                if prime*prime <= y:
     380                    phis[j] = self.__phi(y, j)
     381                elif prime < y:
     382                    phis[j] = self.__cached_count(y)-j-1ull
     383                else:
     384                    phis[j] = 1ull
     385        for j in prange(5, i, nogil=True, schedule=static):
     386            s -= phis[j]
     387        sage_free(phis)
    204388        return s
    205389
    206     cdef long long prime_phi_large(self, long long N, long m_max = 0):
     390    cdef uint64_t __phi(self, uint64_t x, uint64_t i) nogil:
     391        r"""
     392        Legendre's formula: returns the number of primes :math:`\leq` ``x``
     393        that are not divisible by the first ``i`` primes
    207394        """
    208         Uses Legendre's Formula for computing pi(x). Both this and the prime_phi_small
    209         methods are specialized versions of Legendre's Formula that takes advantage of
    210         its recursive properties. Hans Riesel's Prime "Numbers and Computer Methods for
    211         Factorization" discusses Legnedre's Formula, however there are many places
    212         that discuss it as nearly every prime counting algorithm uses it.
     395        if not i: return x
     396        # explicitly compute for small i
     397        cdef uint64_t s = (x+1ull)>>1ull
     398        if i == 1ull: return s
     399        s -= (x+3ull)/6ull
     400        if i == 2ull: return s
     401        s -= (x+5ull)/10ull - (x+15ull)/30ull
     402        if i == 3ull: return s
     403        s -= (x+7ull)/14ull - (x+21ull)/42ull - (x+35ull)/70ull + \
     404            (x+105ull)/210ull
     405        if i == 4ull: return s
     406        s -= (x+11ull)/22ull - (x+33ull)/66ull - (x+55ull)/110ull - \
     407            (x+77ull)/154ull + (x+165ull)/330ull + (x+231ull)/462ull + \
     408            (x+385ull)/770ull - (x+1155ull)/2310ull
     409        if i == 5ull: return s
     410        cdef uint64_t y=x/13ull, j=5ull
     411        cdef uint32_t *prime=self.__primes+5
     412        # switch to 32-bit as quickly as possible
     413        while y >> 32ull:
     414            s -= self.__phi(y, j)
     415            j += 1ull
     416            if j == i: return s
     417            prime += 1
     418            y = x/(<uint64_t>prime[0])
     419        # get y <= maxSieve so we can use a binary search with our table of
     420        # primes
     421        while y > (<uint64_t>self.__maxSieve):
     422            s -= self.__phi32(y, j)
     423            j += 1ull
     424            if j == i: return s
     425            prime += 1
     426            y = x/(<uint64_t>prime[0])
     427        cdef uint64_t prime2 = prime[-1]
     428        # get p^2 > y so that we can use the identity phi(x,a)=pi(x)-a+1
     429        while prime2*prime2 <= y:
     430            s -= self.__phi32(y, j)
     431            j += 1ull
     432            if j == i: return s
     433            prime2 = prime[0]
     434            prime += 1
     435            y = x/(<uint64_t>prime[0])
     436        s += j
     437        # use the identity phi(x,a) = pi(x)-a+1 and compute pi using a binary
     438        # search
     439        while prime2 < y:
     440            s -= self.__cached_count(y)-j
     441            j += 1ull
     442            if j == i: return s-i
     443            prime2 = prime[0]
     444            prime += 1
     445            y = x/(<uint64_t>prime[0])
     446        return s-i
     447
     448    cdef uint32_t __phi32(self, uint32_t x, uint32_t i) nogil:
    213449        """
    214         try:
    215             return self.prime_phi_small(long(N), m_max)
    216         except OverflowError:
    217             pass
    218         # m_max is the current sieving value
    219         if m_max == 0:
    220             m_max = sqrt_longlong(N) + 1
    221         cdef long long sum = ( (N >> 1) - (N-4)/6 - (N-16)/10 + (N-16)/30 - (N-8)/14 \
    222                                + (N-22)/42 + (N-106)/70 - (N-106)/210 + 2 )
    223         cdef long prime = 11
    224         cdef bint preTransition = True
    225         cdef long long y
    226         cdef long i
    227         for i in range(4, self.primeCount):
    228             if prime >= m_max: break
    229             y = (N+prime-1)/(2*prime) << 1
    230             if preTransition:
    231                 if prime*prime <= y:
    232                     sum -= self.prime_phi_large(y, prime) - i
    233                 else:
    234                     sum -= self.prime_phi_large(y) - i
    235                     preTransition = False
    236             else:
    237                 sum -= self.prime_phi_large(y) - i
    238             prime = self.primes[i + 1]
    239         return sum
    240 
    241     cdef long prime_phi_small(self, long N, long m_max = 0):
    242         if N < 2:
    243             return 0
    244         N += N & 1
    245         if N < 9:
    246             return N >> 1
    247         if N < 25:
    248             return (N >> 1) - (N-4)/6
    249         if N < 49:
    250             return (N >> 1) - (N-4)/6 - (N-16)/10 + (N-16)/30
    251         if N < 121:
    252             return (N >> 1) - (N-4)/6 - (N-16)/10 + (N-16)/30 - (N-36)/14 + (N-22)/42
    253         # m_max is the current sieving value
    254         if m_max == 0:
    255             if N < self.maxPrime:
    256                 return self.bisect(N) + 1
    257             m_max = sqrt_long(N) + 1
    258         cdef long sum = ( (N >> 1) - (N-4)/6 - (N-16)/10 + (N-16)/30 - (N-8)/14 \
    259                           + (N-22)/42 + (N-106)/70 - (N-106)/210 + 2 )
    260         cdef long prime = 11
    261         cdef bint preTransition = True
    262         cdef long x, i
    263         for i in range(4, self.primeCount):
    264             if prime >= m_max: break
    265             x = N / prime
    266             if preTransition:
    267                 if prime*prime <= x:
    268                     sum -= self.prime_phi_small(x, prime) - i
    269                 else:
    270                     sum -= self.prime_phi_small(x) - i
    271                     preTransition = False
    272             else:
    273                 sum -= self.prime_phi_small(x) - i
    274             prime = self.primes[i + 1]
    275         return sum
    276    
    277     cdef long bisect(self, long N):
    278         cdef long size = self.primeCount >> 1
    279         if N >> 2 < size:
    280             size = N >> 2
    281         cdef long position = size
    282         cdef long prime
    283         while size > 0:
    284             prime = self.primes[position]
    285             size >>= 1
    286             if prime < N:
    287                 position += size
    288             elif prime > N:
    289                 position -= size
    290             else: break
    291         if position < self.primeCount - 1:
    292             prime = self.primes[position + 1]
    293             while prime < N:
    294                 position += 1
    295                 prime = self.primes[position + 1]
    296         prime = self.primes[position]
    297         while prime > N:
    298             position -= 1
    299             prime = self.primes[position]
    300         return position
     450        Same as __phi except specialized for 32-bit ints
     451        """
     452        # table method for explicit computation was suggested by Yann
     453        # Laigle-Chapuy
     454        if i == 5u: return ((x/77u)<<4u) + self.__tabS[x%2310u]
     455        cdef uint32_t s = ((x/77u)<<4u) + self.__tabS[x%2310u]
     456        cdef uint32_t y=x/13u, j=5u, *prime=self.__primes+5
     457        while y > self.__maxSieve:
     458            s -= self.__phi32(y, j)
     459            j += 1u
     460            if j == i: return s
     461            prime += 1
     462            y = x/prime[0]
     463        cdef uint32_t prime2 = prime[-1]
     464        while prime2*prime2 <= y:
     465            s -= self.__phi32(y, j)
     466            j += 1u
     467            if j == i: return s
     468            prime2 = prime[0]
     469            prime += 1
     470            y = x/prime[0]
     471        s += j
     472        while 65536u <= y:
     473            s -= self.__cached_count(y)-j
     474            j += 1u
     475            if j == i: return s-i
     476            prime += 1
     477            y = x/prime[0]
     478        while prime2 < y:
     479            s -= self.__smallPi[y]-j
     480            j += 1u
     481            if j == i: return s-i
     482            prime2 = prime[0]
     483            prime += 1
     484            y = x/prime[0]
     485        return s-i
    301486
    302487    def plot(self, xmin=0, xmax=100, vertical_lines=True, **kwds):
    303488        """
    304         Draw a plot of the prime counting function from xmin to xmax.
     489        Draw a plot of the prime counting function from ``xmin`` to ``xmax``.
    305490        All additional arguments are passed on to the line command.
     491       
     492        WARNING: we draw the plot of ``prime_pi`` as a stairstep function with
     493        explicitly drawn vertical lines where the function jumps. Technically
     494        Technically there should not be any vertical lines, but they make the
     495        graph look much better, so we include them. Use the option
     496        ``vertical_lines=False`` to turn these off.
    306497
    307         WARNING: we draw the plot of prime_pi as a stairstep function
    308         with explicitly drawn vertical lines where the function
    309         jumps. Technically there should not be any vertical lines, but
    310         they make the graph look much better, so we include them.
    311         Use the option ``vertical_lines=False`` to turn these off.
    312        
    313498        EXAMPLES::
    314        
     499
    315500            sage: plot(prime_pi, 1, 100)
    316             sage: prime_pi.plot(-2,50,thickness=2, vertical_lines=False)
     501            sage: prime_pi.plot(-2, sqrt(2501), thickness=2, vertical_lines=False)
    317502        """
     503        from sage.plot.step import plot_step_function
     504        if xmax < xmin:
     505            return plot_step_function([], **kwds)
     506        if xmax < 2:
     507            return plot_step_function([(xmin,0),(xmax,0)], **kwds)
    318508        y = self(xmin)
    319509        v = [(xmin, y)]
    320         for p in prime_range(xmin+1, xmax+1):
     510        from sage.rings.all import prime_range
     511        for p in prime_range(xmin+1, xmax+1, py_ints=True):
    321512            y += 1
    322513            v.append((p,y))
    323514        v.append((xmax,y))
    324         from sage.plot.step import plot_step_function
    325515        return plot_step_function(v, vertical_lines=vertical_lines, **kwds)
    326516
    327 #############
     517########
    328518prime_pi = PrimePi()
    329519
     520cpdef Integer legendre_phi(x, a):
     521    r"""
     522    Legendre's formula, also known as the partial sieve function, is a useful
     523    combinatorial function for computing the prime counting function (the
     524    ``prime_pi`` method in Sage). It counts the number of positive integers
     525    :math:`\leq` ``x`` that are not divisible by the first ``a`` primes.
     526
     527    INPUT:
     528
     529    - ``x`` -- a real number
     530
     531    - ``a`` -- a non-negative integer
     532
     533    OUTPUT:
     534
     535    integer -- the number of positive integers :math:`\leq` ``x`` that are not
     536    divisible by the first ``a`` primes
     537
     538    EXAMPLES::
     539
     540        sage: legendre_phi(100, 0)
     541        100
     542        sage: legendre_phi(29375, 1)
     543        14688
     544        sage: legendre_phi(91753, 5973)
     545        2893
     546        sage: legendre_phi(7.5, 2)
     547        3
     548        sage: legendre_phi(str(-2^100), 92372)
     549        0
     550        sage: legendre_phi(4215701455, 6450023226)
     551        1
     552
     553    NOTES:
     554
     555    Uses a recursive implementation, using the optimizations described in
     556    [RAO2011]_.
     557
     558    AUTHOR:
     559
     560    - \R. Andrew Ohana (2011)
     561    """
     562    if not isinstance(a, Integer):
     563        a = Integer(a)
     564    if a < Integer(0):
     565        raise ValueError("a (=%s) must be non-negative"%a)
     566    cdef uint64_t y = arg_to_uint64(x, 'legendre_phi', 'x and a')
     567
     568    # legendre_phi(x, a) = 0 when x <= 0
     569    if not y: return Integer(0)
     570
     571    # legendre_phi(x, 0) = x
     572    if a == Integer(0): return Integer(y)
     573
     574    # Use knowledge about the density of primes to quickly compute for many
     575    # cases where a is unusually large
     576    if a > Integer(y>>1ull): return Integer(1)
     577    if y > 1916ull:
     578        chk = Integer(y)*Integer(13271040)//Integer(86822723)
     579        if a > chk: return Integer(1)
     580
     581    # If a > prime_pi(2^32), we compute phi(x,a) = max(pi(x)-a+1,1)
     582    if a > Integer(203280221):
     583        ret = prime_pi(x)-a+Integer(1)
     584        if ret < Integer(1): return Integer(1)
     585        return ret
     586
     587    # Deal with the general case
     588    if (<PrimePi>prime_pi).__smallPi == NULL:
     589        (<PrimePi>prime_pi).__init_tables()
     590    cdef uint32_t z = pari.nth_prime(a)
     591    if z >= y: return Integer(1)
     592    (<PrimePi>prime_pi).__init_primes(z)
     593    if not sig_on_no_except():
     594        (<PrimePi>prime_pi).__clean_cache()
     595        cython_check_exception()
     596    y = (<PrimePi>prime_pi).__phi_parallel(y, mpz_get_ui((<Integer>a).value))
     597    sig_off()
     598    (<PrimePi>prime_pi).__clean_cache()
     599    return Integer(y)
     600
     601partial_sieve_function = legendre_phi