source: git/kernel/digitech.cc @ fbc7cb

jengelh-datetimespielwiese
Last change on this file since fbc7cb was ba5e9e, checked in by Oleksandr Motsak <motsak@…>, 9 years ago
Changed configure-scripts to generate individual public config files for each package: resources, libpolys, singular (main) fix: sources should include correct corresponding config headers.
  • Property mode set to 100644
File size: 1.9 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4#ifdef HAVE_CONFIG_H
5#include "singularconfig.h"
6#endif /* HAVE_CONFIG_H */
7#include <kernel/mod2.h>
8#include <polys/monomials/ring.h>
9
10#include <kernel/digitech.h>
11#include <polys/kbuckets.h>
12#include <kernel/ideals.h>
13static ideal zero_ideal;
14
15void bit_reduce(poly & f,ring r)
16{
17  poly p=f;
18  kBucket_pt erg_bucket= kBucketCreate(r);
19  kBucketInit(erg_bucket,NULL,0 /*pLength(P.p)*/);
20  while(p)
21  {
22    poly next=pNext(p);
23    pNext(p)=NULL;
24
25    int i;
26    int max=rVar(r);
27    for(i=1;i<=max;i++)
28    {
29      unsigned long exp=p_GetExp(p,i,r);
30      if(exp!=0)
31        p_SetExp(p,i,1,r);
32
33    }
34    p_Setm(p,r);
35    int pseudo_len=0;
36    kBucket_Add_q(erg_bucket,p,&pseudo_len);
37    p=next;
38  }
39
40  int len=0;
41  poly erg;
42  kBucketClear(erg_bucket,&erg, &len);
43  kBucketDestroy(&erg_bucket);
44  f=erg;
45}
46
47poly uni_subst_bits(poly outer_uni, poly inner_multi, ring r)
48{
49  zero_ideal=idInit(0,1);
50  //assumes outer_uni is univariate and ordering global
51  int d_max=p_GetExp(outer_uni,1,r);
52  poly* potences=(poly*) omAlloc((d_max+1)*sizeof(poly));
53  potences[0]=p_ISet(1,r);
54  int i;
55  for(i=1;i<=d_max;i++)
56  {
57    potences[i]=pp_Mult_qq(potences[i-1],inner_multi,r);
58    bit_reduce(potences[i],r);
59  }
60
61  poly p=outer_uni;
62  kBucket_pt erg_bucket= kBucketCreate(r);
63  kBucketInit(erg_bucket,NULL,0 /*pLength(P.p)*/);
64
65
66  while(p)
67  {
68    int d=p_GetExp(p,1,r);
69    assume(potences[d]!=NULL); //mustn't always hold, but for most input
70    int pseudo_len=0;
71    kBucket_Add_q(erg_bucket,p_Mult_nn(potences[d],p_GetCoeff(p,r),r),&pseudo_len);
72    potences[d]=NULL;
73    p=pNext(p);
74  }
75
76  //free potences
77  for(i=0;i<=d_max;i++)
78  {
79    p_Delete(&potences[i],r);
80  }
81  omfree(potences);
82  int len=0;
83  poly erg;
84  kBucketClear(erg_bucket,&erg, &len);
85  kBucketDestroy(&erg_bucket);
86  return(erg);
87}
Note: See TracBrowser for help on using the repository browser.