cyclo_partit.cpp
上传用户:jtjnyq9001
上传日期:2014-11-21
资源大小:3974k
文件大小:2k
源码类别:

3G开发

开发平台:

Visual C++

  1. //
  2. // primpoly.cpp
  3. //
  4. #include <iostream>
  5. #include <fstream>
  6. #include "cyclo_partit.h"
  7. #include "ipow.h"
  8. //using namespace std;
  9. extern ::ofstream DebugFile;
  10. //=====================================================
  11. CyclotomicPartition::CyclotomicPartition( int prime_field_base,
  12.                                                 int degree )
  13. {
  14.    int first_element;
  15.    int total_count;
  16.    int element_count;
  17.    int i;
  18.    int element;
  19.    int base;
  20.    Specific_Coset = new CyclotomicCoset;
  21.    Modulus = int(ipow(prime_field_base, degree)-1);
  22.    total_count = 0;
  23.    Coset_Start = new int[(Modulus+1)/2];
  24.    Coset_Size = new int[(Modulus+1)/2];
  25.    Element_Vector = new int[Modulus];
  26.    bool* used = new bool[Modulus];
  27.    for(i=0; i<Modulus; i++){
  28.       used[i] = false;
  29.    }
  30.    Coset_Start[0] = 0;
  31.    Coset_Size[0] = 1;
  32.    Element_Vector[0] = 0;
  33.    Num_Cosets = 1;
  34.    total_count++;
  35.    first_element = -1;
  36.    do{
  37.       do{
  38.          first_element += 2;
  39.       }while(used[first_element]);
  40.       element = first_element;
  41.       element_count = 0;
  42.       Coset_Start[Num_Cosets] = Coset_Start[Num_Cosets-1] + Coset_Size[Num_Cosets-1];
  43.       base = Coset_Start[Num_Cosets];
  44.       do{
  45.          Element_Vector[base + element_count] = element;
  46.          used[element] = true;
  47.          element_count++;
  48.          total_count++;
  49.          element = (prime_field_base * element)%Modulus;
  50.       } while(element != first_element);
  51.       Coset_Size[Num_Cosets] = element_count;
  52.       Num_Cosets++;
  53.    }while(total_count <(Modulus-1));
  54. }
  55. //=======================================================
  56. int CyclotomicPartition::GetNumCosets(void)
  57. {
  58.    return(Num_Cosets);
  59. }
  60. //=======================================================
  61. CyclotomicCoset *CyclotomicPartition::GetSpecificCoset(int coset_index)
  62. {
  63.    Specific_Coset->start = &(Element_Vector[Coset_Start[coset_index]]);
  64.    Specific_Coset->size = Coset_Size[coset_index];
  65.    return(Specific_Coset);
  66. }
  67. //===========================================================
  68. int CyclotomicPartition::GetCosetIndex(int element)
  69. {
  70.    int i, j, index;
  71.    i=-1;
  72.    do{
  73.       i++;
  74.    }while( (i<(Modulus-1)) && (element != Element_Vector[i]));
  75.    for(j=0; j<Num_Cosets; j++){
  76.       if( (i>=Coset_Start[j]) && (i<(Coset_Start[j]+Coset_Size[j]))){
  77.          index = j;
  78.          break;
  79.       }
  80.    }
  81.    return(index);
  82. }