@@ -175,54 +175,14 @@ def fourier_transform(hamiltonian, n_dimensions, grid_length, length_scale,
175175 Returns:
176176 hamiltonian_t: An instance of the FermionOperator class.
177177 """
178- hamiltonian_t = None
179-
180- for term in hamiltonian .terms :
181- transformed_term = None
182- for ladder_operator in term :
183- momentum_indices = grid_indices (ladder_operator [0 ], n_dimensions ,
184- grid_length , spinless )
185- momentum_vec = momentum_vector (momentum_indices , grid_length ,
186- length_scale )
187- new_basis = None
188- for position_indices in itertools .product (range (grid_length ),
189- repeat = n_dimensions ):
190- position_vec = position_vector (position_indices , grid_length ,
191- length_scale )
192- if spinless :
193- spin = None
194- else :
195- spin = ladder_operator [0 ] % 2
196- orbital = orbital_id (grid_length , position_indices , spin )
197- exp_index = 1.0j * numpy .dot (momentum_vec , position_vec )
198- if ladder_operator [1 ] == 1 :
199- exp_index *= - 1.0
200-
201- element = FermionOperator (((orbital , ladder_operator [1 ]),),
202- numpy .exp (exp_index ))
203- if new_basis is None :
204- new_basis = element
205- else :
206- new_basis += element
207-
208- new_basis *= numpy .sqrt (1.0 / float (grid_length ** n_dimensions ))
209-
210- if transformed_term is None :
211- transformed_term = new_basis
212- else :
213- transformed_term *= new_basis
214- if transformed_term is None :
215- continue
216-
217- # Coefficient.
218- transformed_term *= hamiltonian .terms [term ]
219-
220- if hamiltonian_t is None :
221- hamiltonian_t = transformed_term
222- else :
223- hamiltonian_t += transformed_term
224-
225- return hamiltonian_t
178+ return _fourier_transform_helper (hamiltonian = hamiltonian ,
179+ n_dimensions = n_dimensions ,
180+ grid_length = grid_length ,
181+ length_scale = length_scale ,
182+ spinless = spinless ,
183+ factor = + 1 ,
184+ vec_func_1 = momentum_vector ,
185+ vec_func_2 = position_vector )
226186
227187
228188def inverse_fourier_transform (hamiltonian , n_dimensions , grid_length ,
@@ -244,26 +204,37 @@ def inverse_fourier_transform(hamiltonian, n_dimensions, grid_length,
244204 Returns:
245205 hamiltonian_t: An instance of the FermionOperator class.
246206 """
207+ return _fourier_transform_helper (hamiltonian = hamiltonian ,
208+ n_dimensions = n_dimensions ,
209+ grid_length = grid_length ,
210+ length_scale = length_scale ,
211+ spinless = spinless ,
212+ factor = - 1 ,
213+ vec_func_1 = position_vector ,
214+ vec_func_2 = momentum_vector )
215+
216+
217+ def _fourier_transform_helper (hamiltonian , n_dimensions , grid_length ,
218+ length_scale , spinless , factor ,
219+ vec_func_1 , vec_func_2 ):
247220 hamiltonian_t = None
248221
249222 for term in hamiltonian .terms :
250223 transformed_term = None
251224 for ladder_operator in term :
252- position_indices = grid_indices (ladder_operator [0 ], n_dimensions ,
253- grid_length , spinless )
254- position_vec = position_vector (position_indices , grid_length ,
255- length_scale )
225+ indices_1 = grid_indices (ladder_operator [0 ], n_dimensions ,
226+ grid_length , spinless )
227+ vec_1 = vec_func_1 (indices_1 , grid_length , length_scale )
256228 new_basis = None
257- for momentum_indices in itertools .product (range (grid_length ),
258- repeat = n_dimensions ):
259- momentum_vec = momentum_vector (momentum_indices , grid_length ,
260- length_scale )
229+ for indices_2 in itertools .product (range (grid_length ),
230+ repeat = n_dimensions ):
231+ vec_2 = vec_func_2 (indices_2 , grid_length , length_scale )
261232 if spinless :
262233 spin = None
263234 else :
264235 spin = ladder_operator [0 ] % 2
265- orbital = orbital_id (grid_length , momentum_indices , spin )
266- exp_index = - 1.0j * numpy .dot (position_vec , momentum_vec )
236+ orbital = orbital_id (grid_length , indices_2 , spin )
237+ exp_index = factor * 1.0j * numpy .dot (vec_1 , vec_2 )
267238 if ladder_operator [1 ] == 1 :
268239 exp_index *= - 1.0
269240
0 commit comments