18
18
19
19
EXAMPLES::
20
20
21
- sage: from sage.stats.distributions.discrete_gaussian_lattice import DiscreteGaussianDistributionLatticeSampler
22
- sage: D = DiscreteGaussianDistributionLatticeSampler (ZZ^10, 3.0)
21
+ sage: from sage.stats.all import DGL
22
+ sage: D = DGL (ZZ^10, 3.0)
23
23
sage: D(), D(), D() # random
24
24
((3, 0, -5, 0, -1, -3, 3, 3, -7, 2), (4, 0, 1, -2, -4, -4, 4, 0, 1, -4), (-3, 0, 4, 5, 0, 1, 3, 2, 0, -1))
25
25
sage: a = D()
@@ -120,8 +120,8 @@ class DiscreteGaussianDistributionLatticeSampler(SageObject):
120
120
121
121
EXAMPLES::
122
122
123
- sage: from sage.stats.distributions.discrete_gaussian_lattice import DiscreteGaussianDistributionLatticeSampler
124
- sage: D = DiscreteGaussianDistributionLatticeSampler (ZZ^10, 3.0); D
123
+ sage: from sage.stats.all import DGL
124
+ sage: D = DGL (ZZ^10, 3.0); D
125
125
Discrete Gaussian sampler with Gaussian parameter σ = 3.00000000000000, c=(0, 0, 0, 0, 0, 0, 0, 0, 0, 0) over lattice with basis
126
126
<BLANKLINE>
127
127
[1 0 0 0 0 0 0 0 0 0]
@@ -138,10 +138,10 @@ class DiscreteGaussianDistributionLatticeSampler(SageObject):
138
138
139
139
We plot a histogram::
140
140
141
- sage: from sage.stats.distributions.discrete_gaussian_lattice import DiscreteGaussianDistributionLatticeSampler
141
+ sage: from sage.stats.all import DGL
142
142
sage: import warnings
143
143
sage: warnings.simplefilter('ignore', UserWarning)
144
- sage: D = DiscreteGaussianDistributionLatticeSampler (identity_matrix(2), 3.0)
144
+ sage: D = DGL (identity_matrix(2), 3.0)
145
145
sage: S = [D() for _ in range(2^12)]
146
146
sage: l = [vector(v.list() + [S.count(v)]) for v in set(S)]
147
147
sage: list_plot3d(l, point_list=True, interpolation='nn')
@@ -167,18 +167,18 @@ def compute_precision(precision, sigma):
167
167
168
168
EXAMPLES::
169
169
170
- sage: from sage.stats.distributions.discrete_gaussian_lattice import DiscreteGaussianDistributionLatticeSampler
171
- sage: DiscreteGaussianDistributionLatticeSampler .compute_precision(100, RR(3))
170
+ sage: from sage.stats.all import DGL
171
+ sage: DGL .compute_precision(100, RR(3))
172
172
100
173
- sage: DiscreteGaussianDistributionLatticeSampler .compute_precision(100, RealField(200)(3))
173
+ sage: DGL .compute_precision(100, RealField(200)(3))
174
174
100
175
- sage: DiscreteGaussianDistributionLatticeSampler .compute_precision(100, 3)
175
+ sage: DGL .compute_precision(100, 3)
176
176
100
177
- sage: DiscreteGaussianDistributionLatticeSampler .compute_precision(None, RR(3))
177
+ sage: DGL .compute_precision(None, RR(3))
178
178
53
179
- sage: DiscreteGaussianDistributionLatticeSampler .compute_precision(None, RealField(200)(3))
179
+ sage: DGL .compute_precision(None, RealField(200)(3))
180
180
200
181
- sage: DiscreteGaussianDistributionLatticeSampler .compute_precision(None, 3)
181
+ sage: DGL .compute_precision(None, 3)
182
182
53
183
183
184
184
"""
@@ -207,9 +207,9 @@ def _normalisation_factor_zz(self, tau=None, prec=None):
207
207
208
208
EXAMPLES::
209
209
210
- sage: from sage.stats.distributions.discrete_gaussian_lattice import DiscreteGaussianDistributionLatticeSampler
210
+ sage: from sage.stats.all import DGL
211
211
sage: n = 3; sigma = 1.0
212
- sage: D = DiscreteGaussianDistributionLatticeSampler (ZZ^n, sigma)
212
+ sage: D = DGL (ZZ^n, sigma)
213
213
sage: f = D.f
214
214
sage: nf = D._normalisation_factor_zz(); nf
215
215
15.7496...
@@ -235,22 +235,22 @@ def _normalisation_factor_zz(self, tau=None, prec=None):
235
235
236
236
sage: while abs(m*f(v)*1.0/nf/counter[v] - 1.0) >= 0.2: add_samples(1000) # long time
237
237
238
- sage: D = DiscreteGaussianDistributionLatticeSampler (ZZ^8, 0.5)
238
+ sage: D = DGL (ZZ^8, 0.5)
239
239
sage: D._normalisation_factor_zz(tau=3)
240
240
3.1653...
241
241
sage: D._normalisation_factor_zz()
242
242
6.8249...
243
- sage: D = DiscreteGaussianDistributionLatticeSampler (ZZ^8, 1000)
243
+ sage: D = DGL (ZZ^8, 1000)
244
244
sage: round(D._normalisation_factor_zz(prec=100))
245
245
1558545456544038969634991553
246
246
247
247
sage: M = Matrix(ZZ, [[1, 3, 0], [-2, 5, 1], [3, -4, 2]])
248
- sage: D = DiscreteGaussianDistributionLatticeSampler (M, 1.7)
248
+ sage: D = DGL (M, 1.7)
249
249
sage: D._normalisation_factor_zz() # long time
250
250
7247.1975...
251
251
252
252
sage: M = Matrix(ZZ, [[1, 3, 0], [-2, 5, 1]])
253
- sage: D = DiscreteGaussianDistributionLatticeSampler (M, 3)
253
+ sage: D = DGL (M, 3)
254
254
sage: D._normalisation_factor_zz()
255
255
Traceback (most recent call last):
256
256
...
@@ -297,11 +297,11 @@ def f_or_hat(x):
297
297
if self .is_spherical and not self ._c_in_lattice :
298
298
raise NotImplementedError ("Lattice must contain 0 for now." )
299
299
300
- if self .B .base_ring () not in ( ZZ , QQ ) :
300
+ if self .B .base_ring () not in ZZ :
301
301
raise NotImplementedError ("Lattice must be integral for now." )
302
302
303
303
sigma = self ._sigma
304
- prec = DiscreteGaussianDistributionLatticeSampler .compute_precision (
304
+ prec = DGL .compute_precision (
305
305
prec , sigma
306
306
)
307
307
R = RealField (prec = prec )
@@ -341,6 +341,18 @@ def _maximal_r(self):
341
341
342
342
This is equivalent to finding `λ₁(Σ / Q) = 1 / λₙ(Q / Σ)`, which is done
343
343
via the Power iteration method.
344
+
345
+ EXAMPLES::
346
+
347
+ sage: from sage.stats.all import DGL
348
+ sage: n = 3
349
+ sage: Sigma = Matrix(ZZ, [[5, -2, 4], [-2, 10, -5], [4, -5, 5]])
350
+ sage: c = vector(ZZ, [7, 2, 5])
351
+ sage: D = DGL(ZZ^n, Sigma, c)
352
+ sage: r = D._maximal_r(); r
353
+ 0.58402...
354
+ sage: e_vals = (D.sigma - r^2 * D.Q).eigenvalues()
355
+ sage: assert all(e_val >= -1e-12 for e_val in e_vals)
344
356
"""
345
357
# TODO: Write doctest
346
358
if self .is_spherical :
@@ -399,9 +411,9 @@ def __init__(self, B, sigma=1, c=None, r=None, precision=None):
399
411
400
412
EXAMPLES::
401
413
402
- sage: from sage.stats.distributions.discrete_gaussian_lattice import DiscreteGaussianDistributionLatticeSampler
414
+ sage: from sage.stats.all import DGL
403
415
sage: n = 2; sigma = 3.0
404
- sage: D = DiscreteGaussianDistributionLatticeSampler (ZZ^n, sigma)
416
+ sage: D = DGL (ZZ^n, sigma)
405
417
sage: f = D.f
406
418
sage: nf = D._normalisation_factor_zz(); nf
407
419
56.5486677646...
@@ -432,7 +444,7 @@ def __init__(self, B, sigma=1, c=None, r=None, precision=None):
432
444
sage: n = 3
433
445
sage: Sigma = Matrix(ZZ, [[5, -2, 4], [-2, 10, -5], [4, -5, 5]])
434
446
sage: c = vector(ZZ, [7, 2, 5])
435
- sage: D = DiscreteGaussianDistributionLatticeSampler (ZZ^n, Sigma, c)
447
+ sage: D = DGL (ZZ^n, Sigma, c)
436
448
sage: nf = D._normalisation_factor_zz(); nf # This has not been properly implemented
437
449
63.76927...
438
450
sage: while v not in counter: add_samples(1000)
@@ -451,9 +463,9 @@ def __init__(self, B, sigma=1, c=None, r=None, precision=None):
451
463
452
464
We can also initialise with matrix-like objects:
453
465
454
- sage: from sage.stats.distributions.discrete_gaussian_lattice import DiscreteGaussianDistributionLatticeSampler
466
+ sage: from sage.stats.all import DGL
455
467
sage: qf = QuadraticForm(matrix(3, [2, 1, 1, 1, 2, 1, 1, 1, 2]))
456
- sage: D = DiscreteGaussianDistributionLatticeSampler (qf, 3.0); D
468
+ sage: D = DGL (qf, 3.0); D
457
469
Discrete Gaussian sampler with Gaussian parameter σ = 3.00000000000000, c=(0, 0, 0) over lattice with basis
458
470
<BLANKLINE>
459
471
[2 1 1]
@@ -462,7 +474,7 @@ def __init__(self, B, sigma=1, c=None, r=None, precision=None):
462
474
sage: D().parent() is D.c.parent()
463
475
True
464
476
"""
465
- precision = DiscreteGaussianDistributionLatticeSampler .compute_precision (precision , sigma )
477
+ precision = DGL .compute_precision (precision , sigma )
466
478
467
479
self ._RR = RealField (precision )
468
480
# Check if sigma is a (real) number or a scaled identity matrix
@@ -498,12 +510,12 @@ def __init__(self, B, sigma=1, c=None, r=None, precision=None):
498
510
self ._c_in_lattice = False
499
511
500
512
try :
501
- c = vector (ZZ , B . ncols () , c )
513
+ c = vector (ZZ , self . n , c )
502
514
except TypeError :
503
515
try :
504
- c = vector (QQ , B . ncols () , c )
516
+ c = vector (QQ , self . n , c )
505
517
except TypeError :
506
- c = vector (self ._RR , B . ncols () , c )
518
+ c = vector (self ._RR , self . n , c )
507
519
508
520
self ._c = c
509
521
@@ -562,14 +574,14 @@ def __call__(self):
562
574
563
575
EXAMPLES::
564
576
565
- sage: from sage.stats.distributions.discrete_gaussian_lattice import DiscreteGaussianDistributionLatticeSampler
566
- sage: D = DiscreteGaussianDistributionLatticeSampler (ZZ^3, 3.0, c=(1,0,0))
577
+ sage: from sage.stats.all import DGL
578
+ sage: D = DGL (ZZ^3, 3.0, c=(1,0,0))
567
579
sage: L = [D() for _ in range(2^12)]
568
580
sage: mean_L = sum(L) / len(L)
569
581
sage: norm(mean_L.n() - D.c) < 0.25
570
582
True
571
583
572
- sage: D = DiscreteGaussianDistributionLatticeSampler (ZZ^3, 3.0, c=(1/2,0,0))
584
+ sage: D = DGL (ZZ^3, 3.0, c=(1/2,0,0))
573
585
sage: L = [D() for _ in range(2^12)] # long time
574
586
sage: mean_L = sum(L) / len(L) # long time
575
587
sage: norm(mean_L.n() - D.c) < 0.25 # long time
@@ -614,8 +626,8 @@ def sigma(self):
614
626
615
627
EXAMPLES::
616
628
617
- sage: from sage.stats.distributions.discrete_gaussian_lattice import DiscreteGaussianDistributionLatticeSampler
618
- sage: D = DiscreteGaussianDistributionLatticeSampler (ZZ^3, 3.0, c=(1,0,0))
629
+ sage: from sage.stats.all import DGL
630
+ sage: D = DGL (ZZ^3, 3.0, c=(1,0,0))
619
631
sage: D.sigma
620
632
3.00000000000000
621
633
"""
@@ -630,8 +642,8 @@ def c(self):
630
642
631
643
EXAMPLES::
632
644
633
- sage: from sage.stats.distributions.discrete_gaussian_lattice import DiscreteGaussianDistributionLatticeSampler
634
- sage: D = DiscreteGaussianDistributionLatticeSampler (ZZ^3, 3.0, c=(1,0,0)); D
645
+ sage: from sage.stats.all import DGL
646
+ sage: D = DGL (ZZ^3, 3.0, c=(1,0,0)); D
635
647
Discrete Gaussian sampler with Gaussian parameter σ = 3.00000000000000, c=(1, 0, 0) over lattice with basis
636
648
<BLANKLINE>
637
649
[1 0 0]
@@ -650,8 +662,8 @@ def c(self, _):
650
662
651
663
EXAMPLES::
652
664
653
- sage: from sage.stats.distributions.discrete_gaussian_lattice import DiscreteGaussianDistributionLatticeSampler
654
- sage: D = DiscreteGaussianDistributionLatticeSampler (ZZ^3, 3.0, c=(1,0,0))
665
+ sage: from sage.stats.all import DGL
666
+ sage: D = DGL (ZZ^3, 3.0, c=(1,0,0))
655
667
sage: D.c = 5
656
668
Traceback (most recent call last):
657
669
...
@@ -665,16 +677,16 @@ def __repr__(self):
665
677
r"""
666
678
EXAMPLES::
667
679
668
- sage: from sage.stats.distributions.discrete_gaussian_lattice import DiscreteGaussianDistributionLatticeSampler
669
- sage: D = DiscreteGaussianDistributionLatticeSampler (ZZ^3, 3.0, c=(1,0,0)); D
680
+ sage: from sage.stats.all import DGL
681
+ sage: D = DGL (ZZ^3, 3.0, c=(1,0,0)); D
670
682
Discrete Gaussian sampler with Gaussian parameter σ = 3.00000000000000, c=(1, 0, 0) over lattice with basis
671
683
<BLANKLINE>
672
684
[1 0 0]
673
685
[0 1 0]
674
686
[0 0 1]
675
687
676
688
sage: Sigma = Matrix(ZZ, [[10, -6, 1], [-6, 5, -1], [1, -1, 2]])
677
- sage: D = DiscreteGaussianDistributionLatticeSampler (ZZ^3, Sigma); D
689
+ sage: D = DGL (ZZ^3, Sigma); D
678
690
Discrete Gaussian sampler with Gaussian parameter Σ =
679
691
[ 10.0000000000000 -6.00000000000000 1.00000000000000]
680
692
[-6.00000000000000 5.00000000000000 -1.00000000000000]
@@ -698,16 +710,16 @@ def _call_in_lattice(self):
698
710
699
711
EXAMPLES::
700
712
701
- sage: from sage.stats.distributions.discrete_gaussian_lattice import DiscreteGaussianDistributionLatticeSampler
702
- sage: D = DiscreteGaussianDistributionLatticeSampler (ZZ^3, 3.0, c=(1,0,0))
713
+ sage: from sage.stats.all import DGL
714
+ sage: D = DGL (ZZ^3, 3.0, c=(1,0,0))
703
715
sage: L = [D._call_in_lattice() for _ in range(2^12)]
704
716
sage: mean_L = sum(L) / len(L)
705
717
sage: norm(mean_L.n() - D.c) < 0.25
706
718
True
707
719
708
720
.. note::
709
721
710
- Do not call this method directly, call :func:`DiscreteGaussianDistributionLatticeSampler .__call__` instead.
722
+ Do not call this method directly, call :func:`DGL .__call__` instead.
711
723
"""
712
724
w = self .VS ([d () for d in self .D ], check = False )
713
725
return w * self .B + self .c
@@ -718,16 +730,16 @@ def _call(self):
718
730
719
731
EXAMPLES::
720
732
721
- sage: from sage.stats.distributions.discrete_gaussian_lattice import DiscreteGaussianDistributionLatticeSampler
722
- sage: D = DiscreteGaussianDistributionLatticeSampler (ZZ^3, 3.0, c=(1/2,0,0))
733
+ sage: from sage.stats.all import DGL
734
+ sage: D = DGL (ZZ^3, 3.0, c=(1/2,0,0))
723
735
sage: L = [D._call() for _ in range(2^12)]
724
736
sage: mean_L = sum(L) / len(L)
725
737
sage: norm(mean_L.n() - D.c) < 0.25
726
738
True
727
739
728
740
.. note::
729
741
730
- Do not call this method directly, call :func:`DiscreteGaussianDistributionLatticeSampler .__call__` instead.
742
+ Do not call this method directly, call :func:`DGL .__call__` instead.
731
743
"""
732
744
v = 0
733
745
c , sigma , B = self ._c , self ._sigma , self .B
@@ -751,9 +763,9 @@ def add_offline_samples(self, cnt=1):
751
763
752
764
EXAMPLES::
753
765
754
- sage: from sage.stats.distributions.discrete_gaussian_lattice import DiscreteGaussianDistributionLatticeSampler
766
+ sage: from sage.stats.all import DGL
755
767
sage: Sigma = Matrix([[5, -2, 4], [-2, 10, -5], [4, -5, 5]])
756
- sage: D = DiscreteGaussianDistributionLatticeSampler (ZZ^3, Sigma)
768
+ sage: D = DGL (ZZ^3, Sigma)
757
769
sage: assert not D.is_spherical
758
770
sage: D.add_offline_samples(2^12)
759
771
sage: L = [D() for _ in range(2^12)] # Takes less time
@@ -772,17 +784,17 @@ def _call_non_spherical(self):
772
784
773
785
EXAMPLES::
774
786
775
- sage: from sage.stats.distributions.discrete_gaussian_lattice import DiscreteGaussianDistributionLatticeSampler
787
+ sage: from sage.stats.all import DGL
776
788
sage: Sigma = Matrix([[5, -2, 4], [-2, 10, -5], [4, -5, 5]])
777
- sage: D = DiscreteGaussianDistributionLatticeSampler (ZZ^3, Sigma, c=(1/2,0,0))
789
+ sage: D = DGL (ZZ^3, Sigma, c=(1/2,0,0))
778
790
sage: L = [D._call_non_spherical() for _ in range(2^12)]
779
791
sage: mean_L = sum(L) / len(L)
780
792
sage: norm(mean_L.n() - D.c) < 0.25
781
793
True
782
794
783
795
.. note::
784
796
785
- Do not call this method directly, call :func:`DiscreteGaussianDistributionLatticeSampler .__call__` instead.
797
+ Do not call this method directly, call :func:`DGL .__call__` instead.
786
798
"""
787
799
if len (self .offline_samples ) == 0 :
788
800
self .add_offline_samples ()
0 commit comments